PHP disable_functions() 绕过方法
1. LD_PRELOAD 环境变量劫持
原理: LD_PRELOAD
是一个环境变量,它允许用户在程序运行前指定一个或多个动态链接库(.so文件)。这些库中的函数会优先于系统默认的库被加载。我们可以利用这一点,编写一个恶意的动态链接库,其中包含一个与常用系统函数(如 getuid
、geteuid
等)同名的恶意函数
绕过步骤:
- 编写一个 C 语言恶意代码,利用
__attribute__((constructor))
在库加载时执行系统命令,并将其编译成一个.so
文件 - 在 PHP 中,通过
putenv()
函数设置LD_PRELOAD
环境变量,指向我们恶意的.so
文件 - 触发一个可以调用系统函数的 PHP 函数,例如
mail()
或exec()
。当这个函数被调用时,LD_PRELOAD
就会生效,我们的恶意代码会被执行
这种方法非常有效,但前提是 putenv()
或类似的函数没有被禁用,并且目标服务器支持动态链接
2. ImageMagick 命令执行漏洞
漏洞名称: CVE-2016-3714 (ImageTragick) 原理: ImageMagick 是一个用于创建、编辑和转换图像的流行开源软件。该漏洞允许攻击者通过处理一个特制的图像文件(例如 SVG、MVG 格式)来执行任意系统命令
绕过步骤:
- 制作一个恶意的 SVG 或 MVG 格式图像文件,其中嵌入了命令执行 Payload。例如:
"push graphic-context viewbox 0 0 640 480 fill 'url(https://example.com/)'"
,url()
后面可以接file://
或http://
等协议,通过pipe
触发命令 - 在 PHP 中,如果使用了
Imagick
扩展来处理上传的图像文件,当调用readImage()
或pingImage()
等函数时,就会触发漏洞,执行恶意 Payload
这种方法主要针对使用了特定软件版本且存在漏洞的目标,属于典型的“Nday”漏洞利用
3. Windows 系统组件 COM 绕过
原理: 在 Windows 环境下,COM
(Component Object Model) 是一个重要的技术。PHP 的 COM
扩展可以用来创建和调用 COM 组件。其中,WScript.Shell
这个组件可以用来执行系统命令
绕过步骤:
- 在 PHP 代码中,通过
new COM('WScript.shell')
创建一个WScript.Shell
对象 - 调用这个对象的
run()
或exec()
方法来执行命令。例如:$shell = new COM('WScript.shell'); $shell->Run('cmd.exe /c "whoami"');
- 这种方法依赖于 PHP 的
COM
扩展是否启用,以及目标服务器是否是 Windows 系统
4. PHP 7.4 FFI 绕过
原理: FFI
(Foreign Function Interface) 是 PHP 7.4 引入的一个扩展,允许 PHP 代码直接调用 C 语言的函数和数据结构,而无需编写额外的 C 语言扩展。这大大增强了 PHP 的能力,同时也带来了安全风险
绕过步骤:
- 使用
FFI::cdef()
函数加载libc
库,并定义system
或exec
函数 - 然后就可以像调用 PHP 函数一样调用 C 语言的
system
函数来执行命令 - 例如:
$ffi = FFI::cdef('int system(const char *command);', 'libc.so.6'); $ffi->system('whoami');
- 这种方法非常强大,但前提是
FFI
扩展已启用且未被禁用
5. Bash 破壳漏洞
漏洞名称: CVE-2014-6271 (Shellshock) 原理: 这是一个在 Bash 4.3 及更早版本中的高危漏洞。它允许攻击者通过环境变量,向 Bash 注入并执行任意代码
绕过步骤:
- 在 PHP 中,使用
putenv()
设置一个特殊的恶意环境变量 - 例如:
putenv("test=() { :;}; echo 'VULNERABLE'");
- 随后,调用任何可以调用 Bash 的函数,例如
mail()
或exec()
。当 Bash 被调用时,它会解析环境变量,触发漏洞,执行恶意 Payload
6. imap_open()
绕过
漏洞名称: CVE-2018-19518 原理: 在 PHP 5.x 和 7.x 版本中,imap_open()
函数存在一个漏洞。当处理一个特定的 IMAP 协议 URL 时,它会调用 rsh
或 ssh
命令来连接远程服务器,从而导致命令执行
绕过步骤:
- 在 PHP 中调用
imap_open()
函数,并传入一个恶意构造的 IMAP URL - 例如:
imap_open('-oProxyCommand=whoami', 'a', 'a');
-oProxyCommand
是一个 SSH 选项,它允许在连接前执行命令。imap_open()
会调用rsh
或ssh
,从而触发这个命令执行- 这种方法依赖于目标服务器上
imap
扩展是否启用
7. pcntl
插件绕过
原理: pcntl
是 PHP 的一个进程控制扩展,它提供了一系列与进程相关的函数,例如 pcntl_exec()
绕过步骤:
pcntl_exec()
函数可以用来在当前进程中执行一个指定的程序- 例如:
pcntl_exec('/bin/sh', array('-c', 'whoami'));
pcntl_exec()
会直接替换当前 PHP 进程,而不会像system()
那样创建一个新的子进程。这种方法非常隐蔽,且通常不被disable_functions
列表所限制