vlambda博客
学习文章列表

Nginx文件名逻辑漏洞

Nginx文件名逻辑漏洞



漏洞介绍


漏洞名称:Nginx 文件名逻辑漏洞

漏洞编号:CVE-2013-4547

影响版本:Nginx 0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7

其实该漏洞类似于解析漏洞,所以我标签归类为文件上传漏洞,我们上传的gif文件可以被作为php解析,但是实质为错误地解析了请求的URI,错误地获取到用户请求的文件名,导致该漏洞出现。


01


漏洞原理


由于错误的解析了请求的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

02




漏洞复现


启动漏洞环境:

环境启动后,访问http://your-ip:8080/即可看到一个上传页面,表示环境启动成功。

Nginx文件名逻辑漏洞

这个环境是黑名单验证,我们无法上传php后缀的文件,需要利用CVE-2013-4547。我们上传一个“1.gif ”,注意后面的空格,可以看到上传成功。

Nginx文件名逻辑漏洞

访问http://192.168.157.128:8080使用bp去抓一个数据包,发送到repeat模块访问,访问http://192.168.157.128:8080/uploadfiles/1.gif .php注意.php前面的空格,这里需要在hex界面进行修改,如下图

Nginx文件名逻辑漏洞

发送回来进行访问,可以看到phpinfo()函数成功执行

03



END


展技术 做实事 

因为热爱 所以聚集

在计协 遇见更好的自己

编辑 | 李承羲

审核 | 李翠碧