14.Nginx ⽂件名逻辑漏洞(CVE-2013-4547)
由于博主在渗透⽹站时发现现在Nginx搭建的⽹站是越来越多
所以对Nginx的漏洞来⼀个全⾯性的复习,本次从Nginx较早的漏洞开始分析。
2013年底,nginx再次爆出漏洞(CVE-2013-4547),此漏洞可导致⽬录跨越及代码执⾏,
其影响版本为: Nginx  0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7,范围较⼴。
漏洞说明
这个漏洞其实和代码执⾏没有太⼤关系,其主要原因是错误地解析了请求的URI,
错误地获取到⽤户请求的⽂件名,导致出现权限绕过、代码执⾏的连带影响。
举个例⼦,⽐如,Nginx匹配到.php结尾的请求,就发送给fastcgi进⾏解析,常见的写法如下:
正常情况下(关闭pathinfo的情况下),只有.php后缀的⽂件才会被发送给fastcgi解析。⽽存在
CVE-2013-4547的情况下,我们请求 1.gif[0x20][0x00].php ,这个URI可以匹配上正则 \.php$,
可以进⼊这个Location块;但进⼊后,由于fastcgi在查⽂件时被\0截断,Nginx却错误地认为
请求的⽂件是1.gif[0x20],就设置其为SCRIPT_FILENAME的值发送给fastcgi。
fastcgi根据SCRIPT_FILENAME的值进⾏解析,最后造成了解析漏洞。
所以,我们只需要上传⼀个空格结尾的⽂件,即可使PHP解析之。
再举个例⼦,⽐如很多⽹站限制了允许访问后台的IP:
我们可以请求如下URI:/test[0x20]/../admin/index.php ,这个URI不会匹配上location后⾯的/admin/,
也就绕过了其中的IP验证;但最后请求的是 /test[0x20]/../admin/index.php ⽂件,也就是/admin/index.php ,
成功访问到后台。(这个前提是需要有⼀个⽬录叫test:这是Linux系统的特点,如果有⼀个不存在的⽬录,
则即使跳转到上⼀层,也会爆⽂件不存在的错误,Windows下没有这个限制)
简单来说就是我们构造:127.0.0.1/test.aaa \0bbb
让Nginx认为⽂件“file.aaa ”的后缀为“.bbb”。
漏洞测试
我们在本地搭建⼀个nginx搭建的上传页⾯:
这个环境是⿊名单验证,我们⽆法上传php后缀的⽂件:
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;
}
location /admin/ {
allow 127.0.0.1;
deny all;
}
需要利⽤CVE-2013-4547。我们上传⼀个test.gif,⾥⾯的内容还是<?php phpinfo();?>,注意后⾯的空格:
发现上传成功,接下来需要构造我们 test.gif[0x20][0x00].php 来造成Nginx解析漏洞,使我们的test.gif被
cve漏洞库
解析成php,访问 192.168.0.132:8080/uploadfiles/test.gif  .php,在burp抓取的数据包中把 test.gif 后⾯的两个空格 [0x20][0x20] ---> [0x20][0x00] ,然后repeater发包可发现PHP已被解析:
注意,[0x20]是空格,[0x00]是\0,这两个字符都不需要编码。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CVE-2013-4547还可以⽤于绕过访问限制,虽然和⽂件解析漏洞⽆关,但也记录在这⾥。
⾸先在⽹站根⽬录下新建⼀个⽬录,命名为privited,在⽬录privated中新建⽂件test.php,内容随意。
然后在Nginx的配置⽂件中写上:
location /privated/ {
deny all;
}
以禁⽌该⽬录的访问。接着在⽹站根⽬录下新建⼀个⽬录,名为 “bmjoker ”,⽬录名的最后⼀个字符是空格,
该⽬录⽤于触发漏洞。最后来进⾏验证,直接访问:
127.0.0.1/privated/test.php
返回 “403 Forbidden” 。利⽤漏洞访问:
127.0.0.1/bmjoker /../privated/test.php
成功访问到⽂件 test.php 。注意URL中的空格,不要将空格编码。
为成功利⽤漏洞,我们在测试中准备了名字以空格结尾的⽂件和⽬录,这是因为在linux中,⽂件名是可以以空格结尾的。若不准备这样的⽂件,漏洞可以成功触发,但结果却是404,不到类似“test.jpg ”这样的⽂件。⽽在Windows中,⽂件名不能以空格结尾,所以Windows程序遇到⽂件名“test.jpg ”会⾃动去掉最后的空格,等同于访
问“test.jpg”,基于这样的原因,这⼀漏洞在Windows中会很容易利⽤。
结语:
由此可知,常规利⽤中如果想触发代码执⾏,条件为可上传带空格的⽂件到服务器,
并且服务器存储的时候也需要保留空格,⽽⼤多数情况下,web应⽤在处理上传⽂件
时,都会将⽂件重命名,通过应⽤⾃⾝添加后缀,或者对后缀名去掉特殊字符后,做类型判断。
以上因素都导致此漏洞被认为是鸡肋漏洞,难以利⽤,⽽被⼈们所忽略
参考链接:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。