漏洞原理
此漏洞是利用了Nginx解析了错误的URl地址,使得绕过服务端限制解析了php文件,造成命令执行的危害
php-fpm.conf中的security.limit_extensions为空使得任意后缀都可以被解析
Nginx服务器将名为ggbond.php[0x20][0x00].php文件发给fastCGI,然而fastcgi在接受此文件时候只读取到ggbond.php[0x20][0x00];最后因为php-fpm.conf中的security.limit_extensions为空使得任意后缀都可以被解析;另一个利用此漏洞的前提是在Nginx0.8.41~1.4.3/1.5.0~1.5.7版本里
漏洞复现
[root@localhost ~]# cd vulhub/nginx/CVE-2013-4547/ # 进入相关的漏洞环境
[root@localhost CVE-2013-4547]# ls
01.png 02.png docker-compose.yml nginx.conf php-fpm README.md www
[root@localhost CVE-2013-4547]# setenforce 0 # 关闭selinux
[root@localhost CVE-2013-4547]# docker-compose up -d # 启动容器
[root@localhost CVE-2013-4547]# docker ps -a # 查看容器是否启动成功
# 浏览器访问,如下图环境正常
http://10.10.10.133:8080/
抓包修改空格绕过前端规则;文件后缀的后面加空格
浏览器访问上传的文件;但是我们发现文件被下载到了本地;然而却没有执行ggbond文件中的php内置函数代码
接下来抓取http://10.10.10.133:8080/uploadfiles/ggbond.php%20的请求包将其发送到repeater模块;进行改包
将后缀的%20修改为两个空格;之后进入到HEX十六进制代码中修改第二个空格为00空字符;意思是当服务器的fastCGI程序解析到00这个空字符时会终止解析后面的字符
实际cgi程序得到的文件名为ggbond.php[0x20] # 即为ggbond.php[0x20][0x00].php被识别为ggbond.php[0x20]
由于在Nginx0.8.41~1.4.3/1.5.0~1.5.7版本中存在一个漏洞
php-fpm.conf中的security.limit_extensions为空使得任意后缀都可以被解析
修改完00空字符之后返回Raw代码中在空字符后面再加一个.php ;之后放行数据包查看回显是否成功读取php内置函数文件