disable_functions bypass - dl function

支持 HackTricks

重要说明:

image

dl 是一个 PHP 函数,可以用来加载 PHP 扩展。如果该函数没有被禁用,可能会被滥用来 绕过 disable_functions 并执行任意命令。 然而,它有一些严格的限制:

  • dl 函数必须在 环境中存在未被禁用

  • PHP 扩展 必须与服务器使用的主版本相同(PHP API 版本)(您可以在 phpinfo 的输出中看到此信息)

  • PHP 扩展必须位于 extension_dir 指令 定义的目录中(您可以在 phpinfo 的输出中看到它)。攻击者试图滥用服务器时,几乎不可能对该目录具有写入权限,因此此要求可能会阻止您滥用此技术。

如果您满足这些要求,请继续阅读帖子 https://antichat.com/threads/70763/ 以了解如何绕过 disable_functions。以下是摘要:

dl 函数 用于在脚本执行期间动态加载 PHP 扩展。PHP 扩展通常用 C/C++ 编写,增强 PHP 的功能。攻击者在注意到 dl 函数未被禁用后,决定创建一个自定义 PHP 扩展以执行系统命令。

攻击者采取的步骤:

  1. PHP 版本识别:

  • 攻击者使用脚本(<?php echo 'PHP Version is '.PHP_VERSION; ?>)确定 PHP 版本。

  1. 获取 PHP 源代码:

  1. 本地 PHP 设置:

  • 在其系统上提取并安装特定的 PHP 版本。

  1. 扩展创建:

编译自定义扩展的注意事项:

  1. ZEND_MODULE_API_NO:

  • bypass.c 中的 ZEND_MODULE_API_NO 必须与当前的 Zend 扩展构建匹配,可以通过以下命令获取:

php -i | grep "Zend Extension Build" |awk -F"API4" '{print $2}' | awk -F"," '{print $1}'
  1. PHP_FUNCTION 修改:

  • 对于较新的 PHP 版本(5、7、8),PHP_FUNCTION(bypass_exec) 可能需要调整。提供的代码片段详细说明了此修改。

自定义扩展文件:

  • bypass.c

  • 实现自定义扩展的核心功能。

  • php_bypass.h

  • 头文件,定义扩展属性。

  • config.m4

  • phpize 用于配置自定义扩展的构建环境。

构建扩展:

  1. 编译命令:

  • 使用 phpize./configuremake 编译扩展。

  • 生成的 bypass.so 位于模块子目录中。

  1. 清理:

  • 编译后运行 make cleanphpize --clean

在受害者主机上上传和执行:

  1. 版本兼容性:

  • 确保攻击者和受害者系统之间的 PHP API 版本匹配。

  1. 扩展加载:

  • 利用 dl 函数,通过使用相对路径或脚本自动化该过程来规避限制。

  1. 脚本执行:

  • 攻击者将 bypass.so 和一个 PHP 脚本上传到受害者的服务器。

  • 脚本使用 dl_local 函数动态加载 bypass.so,然后调用 bypass_exec,并通过 cmd 查询参数传递命令。

命令执行:

  • 攻击者现在可以通过访问:http://www.example.com/script.php?cmd=<command> 执行命令。

此详细的操作流程概述了创建和部署 PHP 扩展以执行系统命令的过程,利用 dl 函数,理想情况下应禁用以防止此类安全漏洞。

支持 HackTricks

Last updated