disable_functions bypass - dl function
重要说明:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2Fuser-images.githubusercontent.com%2F84577967%2F174675487-a4c4ca06-194f-4725-85af-231a2f35d56c.png&width=768&dpr=4&quality=100&sign=486a6573&sv=1)
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 扩展以执行系统命令。
攻击者采取的步骤:
PHP 版本识别:
攻击者使用脚本(
<?php echo 'PHP Version is '.PHP_VERSION; ?>
)确定 PHP 版本。
获取 PHP 源代码:
本地 PHP 设置:
在其系统上提取并安装特定的 PHP 版本。
扩展创建:
编译自定义扩展的注意事项:
ZEND_MODULE_API_NO:
bypass.c
中的ZEND_MODULE_API_NO
必须与当前的 Zend 扩展构建匹配,可以通过以下命令获取:
PHP_FUNCTION 修改:
对于较新的 PHP 版本(5、7、8),
PHP_FUNCTION(bypass_exec)
可能需要调整。提供的代码片段详细说明了此修改。
自定义扩展文件:
bypass.c:
实现自定义扩展的核心功能。
php_bypass.h:
头文件,定义扩展属性。
config.m4:
由
phpize
用于配置自定义扩展的构建环境。
构建扩展:
编译命令:
使用
phpize
、./configure
和make
编译扩展。生成的
bypass.so
位于模块子目录中。
清理:
编译后运行
make clean
和phpize --clean
。
在受害者主机上上传和执行:
版本兼容性:
确保攻击者和受害者系统之间的 PHP API 版本匹配。
扩展加载:
利用
dl
函数,通过使用相对路径或脚本自动化该过程来规避限制。
脚本执行:
攻击者将
bypass.so
和一个 PHP 脚本上传到受害者的服务器。脚本使用
dl_local
函数动态加载bypass.so
,然后调用bypass_exec
,并通过cmd
查询参数传递命令。
命令执行:
攻击者现在可以通过访问:
http://www.example.com/script.php?cmd=<command>
执行命令。
此详细的操作流程概述了创建和部署 PHP 扩展以执行系统命令的过程,利用 dl
函数,理想情况下应禁用以防止此类安全漏洞。
Last updated