Nginx文件名逻辑漏洞
漏洞介绍
漏洞名称:Nginx 文件名逻辑漏洞
漏洞编号:CVE-2013-4547
影响版本:Nginx 0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7
其实该漏洞类似于解析漏洞,所以我标签归类为文件上传漏洞,我们上传的gif文件可以被作为php解析,但是实质为错误地解析了请求的URI,错误地获取到用户请求的文件名,导致该漏洞出现。
漏洞原理
由于错误的解析了请求的url,错误地获取到用户请求的文件名,导致出现权限绕过、代码执行的连带影响。例如:
nginx匹配到.php的文件请求时,就将请求的文件名发给fastcgi进行解析,从而达到正常功能的使用,常见写法为:
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT /var/www/html;
}
正常情况下(关闭pathinfo的情况下),只有.php后缀的文件才会被发送给fastcgi解析。
但是在该漏洞环境下,我们请求1.gif[0x20][0x00].php
,这个URI可以匹配上正则\.php$
,可以进入这个Location块;但进入后,Nginx却错误地认为请求的文件是1.gif[0x20]
,就设置其为SCRIPT_FILENAME
的值发送给fastcgi。
fastcgi根据SCRIPT_FILENAME
的值进行解析,最后导致当作php文件进行解析,造成了解析漏洞。所以,我们只需要上传一个空格结尾的文件,即可使PHP解析之。
关于为什么是1.gif[0x20][0x00].php
,大家可以看后面复现参考理解,其实中间编码为hex
漏洞复现
启动漏洞环境:
docker-compose up -d
环境启动后,访问http://your-ip:8080/
即可看到一个上传页面,表示环境启动成功。
这个环境是黑名单验证,我们无法上传php后缀的文件,需要利用CVE-2013-4547。我们上传一个“1.gif ”,注意后面的空格,可以看到上传成功。
访问http://192.168.157.128:8080
使用bp去抓一个数据包,发送到repeat模块访问,访问http://192.168.157.128:8080/uploadfiles/1.gif .php
注意.php前面的空格,这里需要在hex界面进行修改,如下图
发送回来进行访问,可以看到phpinfo()
函数成功执行