漏洞介绍

漏洞名称: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()函数成功执行