nginx文件类型错误解析漏洞

本文揭示了NGINX在默认配置下可能导致任意文件被误解析为PHP的问题,这一漏洞可让攻击者利用并控制服务器。文章详细分析了漏洞产生的原因,并提供了相应的缓解措施。

洞介绍:nginx是一款高性能的web服务器,使用非常广泛,其不仅经常被用作反向代理,也可以非常好的支持PHP的运行。80sec发现其中存在一个较为严重的安全问题,默认情况下可能导致服务器错误的将任何类型的文件以PHP的方式进行解析,这将导致严重的安全问题,使得恶意的攻击者可能攻陷支持php的nginx服务器。

漏洞分析:nginx默认以cgi的方式支持php的运行,譬如在配置文件当中可以以

location ~ /.php$ {

root html;

fastcgi_pass 127.0.0.1:9000;

fastcgi_index index.php;

fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;

include fastcgi_params;

}

的方式支持对php的解析,location对请求进行选择的时候会使用URI环境变量进行选择,其中传递到后端Fastcgi的关键变量SCRIPT_FILENAME由nginx生成的$fastcgi_script_name决定,而通过分析可以看到$fastcgi_script_name是直接由URI环境变量控制的,这里就是产生问题的点。而为了较好的支持PATH_INFO的提取,在PHP的配置选项里存在cgi.fix_pathinfo选项,其目的是为了从SCRIPT_FILENAME里取出真正的脚本名。
那么假设存在一个http://www.80sec.com/80sec.jpg,我们以如下的方式去访问

POC: 访问一个nginx来支持php的站点,在一个任何资源的文件如robots.txt后面加上/80sec.php,这个时候你可以看到如下的区别:

访问http://www.80sec.com/robots.txt

HTTP/1.1 200 OK
Server: nginx/0.6.32
Date: Thu, 20 May 2010 10:05:30 GMT
Content-Type: text/plain
Content-Length: 18
Last-Modified: Thu, 20 May 2010 06:26:34 GMT
Connection: keep-alive
Keep-Alive: timeout=20
Accept-Ranges: bytes

访问访问http://www.80sec.com/robots.txt/80sec.php

HTTP/1.1 200 OK
Server: nginx/0.6.32
Date: Thu, 20 May 2010 10:06:49 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
Keep-Alive: timeout=20
X-Powered-By: PHP/5.2.6

其中的Content-Type的变化说明了后端负责解析的变化,该站点就可能存在漏洞。

漏洞厂商:http://www.nginx.org

解决方案:

你可以通过以下的方式来减少损失

关闭cgi.fix_pathinfo为0

或者

if ( $fastcgi_script_name ~ /..*//.*php ) {
return 403;
}

解决 Nginx 漏洞的方法有多种,以下是一些常见漏洞的解决办法: ### Nginx 文件类型错误解析漏洞 1. **修改 PHP.ini**:设置 `cgi.fix_pathinfo = 0`,然后重启 PHP - cgi。不过此修改会影响到使用 PATH_INFO 伪静态的应用,例如 `http://blog.s135.com/read.PHP/348.htm` 就不能访问了[^1]。 ```ini cgi.fix_pathinfo = 0 ``` 2. **在 Nginx 配置文件添加规则**:添加 `if ( $fastcgi_script_name ~ \..*\/.*PHP ) {return 403;}`,添加后重启 Nginx。但该匹配会影响类似 `http://www.domain.com/software/5.0/test.PHP`(5.0 为目录),`http://www.domain.com/goto.PHP/PHPwind` 的 URL 访问[^1]。 ```nginx if ( $fastcgi_script_name ~ \..*\/.*PHP ) { return 403; } ``` 3. **只允许纯静态访问**:对于存储图片的 `location{...}`,或虚拟主机 `server{...}`,只允许纯静态访问,不配置 PHP 访问。例如在金山逍遥网论坛、SNS 上传的图片、附件,会传送到专门的图片、附件存储服务器集群上(pic.xoyo.com),这组服务器提供纯静态服务,无任何动态 PHP 配置[^1][^3]。 ```nginx location /images { # 只提供静态服务,不配置 PHP 相关内容 root /path/to/images; } ``` 4. **修改 nginx.conf 配置文件**:兼容 `http://blog.s135.com/demo/0day/phpinfo.php/test` 的 PATH_INFO 伪静态,拒绝 `http://blog.s135.com/demo/0day/phpinfo.jpg/test.php` 的漏洞攻击。 ```nginx location ~* .*\.php($|/) { if ($request_filename ~* (.*)\.php) { set $php_url $1; } if (!-e $php_url.php) { return 403; } fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fcgi.conf; } ``` 5. **修改 fastcgi_params 文件**:在 `/usr/local/nginx/conf/fastcgi_params` 文件最前面增加以下内容。 ```nginx if ($request_filename ~* (.*)\.php) { set $php_url $1; } if (!-e $php_url.php) { return 403; } ``` ### 对请求方法进行限制的漏洞修复 可以在配置文件中添加对请求方法的限制,对于非 GET、POST、DELETE、PUT 的请求返回 405 状态码。 ```nginx if ($request_method !~ ^(GET|POST|DELETE|PUT)$) { return 405; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值