PHP disable_functions() 绕过方法

1. LD_PRELOAD 环境变量劫持

原理: LD_PRELOAD 是一个环境变量,它允许用户在程序运行前指定一个或多个动态链接库(.so文件)。这些库中的函数会优先于系统默认的库被加载。我们可以利用这一点,编写一个恶意的动态链接库,其中包含一个与常用系统函数(如 getuidgeteuid 等)同名的恶意函数

绕过步骤:

  1. 编写一个 C 语言恶意代码,利用 __attribute__((constructor)) 在库加载时执行系统命令,并将其编译成一个 .so 文件
  2. 在 PHP 中,通过 putenv() 函数设置 LD_PRELOAD 环境变量,指向我们恶意的 .so 文件
  3. 触发一个可以调用系统函数的 PHP 函数,例如 mail()exec()。当这个函数被调用时,LD_PRELOAD 就会生效,我们的恶意代码会被执行

这种方法非常有效,但前提是 putenv() 或类似的函数没有被禁用,并且目标服务器支持动态链接

2. ImageMagick 命令执行漏洞

漏洞名称: CVE-2016-3714 (ImageTragick) 原理: ImageMagick 是一个用于创建、编辑和转换图像的流行开源软件。该漏洞允许攻击者通过处理一个特制的图像文件(例如 SVG、MVG 格式)来执行任意系统命令

绕过步骤:

  1. 制作一个恶意的 SVG 或 MVG 格式图像文件,其中嵌入了命令执行 Payload。例如:"push graphic-context viewbox 0 0 640 480 fill 'url(https://example.com/)'"url() 后面可以接 file://http:// 等协议,通过 pipe 触发命令
  2. 在 PHP 中,如果使用了 Imagick 扩展来处理上传的图像文件,当调用 readImage()pingImage() 等函数时,就会触发漏洞,执行恶意 Payload

这种方法主要针对使用了特定软件版本且存在漏洞的目标,属于典型的“Nday”漏洞利用

3. Windows 系统组件 COM 绕过

原理: 在 Windows 环境下,COM (Component Object Model) 是一个重要的技术。PHP 的 COM 扩展可以用来创建和调用 COM 组件。其中,WScript.Shell 这个组件可以用来执行系统命令

绕过步骤:

  1. 在 PHP 代码中,通过 new COM('WScript.shell') 创建一个 WScript.Shell 对象
  2. 调用这个对象的 run()exec() 方法来执行命令。例如:$shell = new COM('WScript.shell'); $shell->Run('cmd.exe /c "whoami"');
  3. 这种方法依赖于 PHP 的 COM 扩展是否启用,以及目标服务器是否是 Windows 系统

4. PHP 7.4 FFI 绕过

原理: FFI (Foreign Function Interface) 是 PHP 7.4 引入的一个扩展,允许 PHP 代码直接调用 C 语言的函数和数据结构,而无需编写额外的 C 语言扩展。这大大增强了 PHP 的能力,同时也带来了安全风险

绕过步骤:

  1. 使用 FFI::cdef() 函数加载 libc 库,并定义 systemexec 函数
  2. 然后就可以像调用 PHP 函数一样调用 C 语言的 system 函数来执行命令
  3. 例如:$ffi = FFI::cdef('int system(const char *command);', 'libc.so.6'); $ffi->system('whoami');
  4. 这种方法非常强大,但前提是 FFI 扩展已启用且未被禁用

5. Bash 破壳漏洞

漏洞名称: CVE-2014-6271 (Shellshock) 原理: 这是一个在 Bash 4.3 及更早版本中的高危漏洞。它允许攻击者通过环境变量,向 Bash 注入并执行任意代码

绕过步骤:

  1. 在 PHP 中,使用 putenv() 设置一个特殊的恶意环境变量
  2. 例如:putenv("test=() { :;}; echo 'VULNERABLE'");
  3. 随后,调用任何可以调用 Bash 的函数,例如 mail()exec()。当 Bash 被调用时,它会解析环境变量,触发漏洞,执行恶意 Payload

6. imap_open() 绕过

漏洞名称: CVE-2018-19518 原理: 在 PHP 5.x 和 7.x 版本中,imap_open() 函数存在一个漏洞。当处理一个特定的 IMAP 协议 URL 时,它会调用 rshssh 命令来连接远程服务器,从而导致命令执行

绕过步骤:

  1. 在 PHP 中调用 imap_open() 函数,并传入一个恶意构造的 IMAP URL
  2. 例如:imap_open('-oProxyCommand=whoami', 'a', 'a');
  3. -oProxyCommand 是一个 SSH 选项,它允许在连接前执行命令。imap_open() 会调用 rshssh,从而触发这个命令执行
  4. 这种方法依赖于目标服务器上 imap 扩展是否启用

7. pcntl 插件绕过

原理: pcntl 是 PHP 的一个进程控制扩展,它提供了一系列与进程相关的函数,例如 pcntl_exec()

绕过步骤:

  1. pcntl_exec() 函数可以用来在当前进程中执行一个指定的程序
  2. 例如:pcntl_exec('/bin/sh', array('-c', 'whoami'));
  3. pcntl_exec() 会直接替换当前 PHP 进程,而不会像 system() 那样创建一个新的子进程。这种方法非常隐蔽,且通常不被 disable_functions 列表所限制
Copyright © 版权信息 all right reserved,powered by Gitbook该文件修订时间: 2025-09-25 03:12:54

results matching ""

    No results matching ""