Nginx 文件名逻辑漏洞(CVE-2013-4547)复现
漏洞原理
- 影响范围: Nginx 0.8.41 ~ 1.4.3
- 影响范围: Nginx 1.5.0 ~ 1.5.7
Nginx
在解析php
文件的时候通常在配置文件中如下配置
location ~ \.php$ {
root html;
include fastcgi_params;
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT /var/www/html;
}
通过$
正则表达式匹配文件是否已.php
后缀名结束然后将该文件交给fastcgi
执行,该漏洞绕过的原因是正则匹配和Nginx
匹配结合起来的漏洞
首先例如我们给一个文件名test.png\x00.php
,在上诉配置文件使用正则匹配成功确定是一个php
文件,但是Nginx
在遇到\x00
就会结束,实际交给fastcgi
的文件名就是test.png
所以这里我们只需要上传一个test.png\x00.php
,\x00
代表十六进制数据,可以绕过Nginx
解析,但是在实际利用过程中是不行的,通过实验环境上面的思路漏洞利用失败
这里参考了https://blog.csdn.net/Blood_Pupil/article/details/88565176博客,需要再\x00
前面加入\x20
空格,就可以让Nginx
运行不报错正常执行,这是一个逻辑漏洞
漏洞利用
上传一个含有php
代码的图片,在文件后缀名后方加入\x20
空格,这是就会在Linux
机器中就会拥有一个test.png空格
的文件
上传后,因为这个文件后缀名含有空格,在url
中需要加入%20
访问该文件,测试该文件是否上传成功
可以看到这里文件成功上传,接着我们进行漏洞利用,访问test.png
在文件后方加入\x20\x00.php
利用成功