nginx vulnerability

nginx历史漏洞

0x00 前言

整理一下nginx常见的配置漏洞和其本身的漏洞,主要参考:

vulhub

0x01 nginx配置错误导致的漏洞

vulhub位置: /nginx/insecure-configuration/

CRLF注入漏洞

nginx会将$url解码,导致传入%0d%0a即可引入换行符,造成CRLF漏洞

错误配置

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

漏洞利用

正常请求如下,原本目的是为了将http的请求跳转到https

img

可通过传入%0d%0a传入换行符,控制响应头及响应体

img

可用Set-Cookie控制cookie或者构造一个XSS漏洞(可参考Bottle HTTP 头注入漏洞探究

正确配置

location /{
	return 302 https://$host$request_uri
}

目录穿越漏洞

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

错误配置

location /files {
    alias /home/;
}

漏洞利用

上面的配置中可看到 url中的/files没有加后缀/,而/home/后有/,这样就导致可以穿越到其上层目录

可通过http://192.168.154.135:8081/files../进行目录穿越

img

add_header漏洞

Nginx配置文件子块(server、location、if)中的add_header,将会覆盖父块中的add_header添加的HTTP头,造成一些安全隐患。

如下代码,父块中添加了CSP头,但是/test2的location中又添加了X-Content-Type-Options头,导致父块中的add_header完全失效

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;
}

可看到test1的响应头中还存在父块中设置的头信息,但是test2中父块中的头信息已经被覆盖了

img

0x02 nginx解析漏洞

vulhub位置:/nginx/nginx_parsing_vulnerability/

这个漏洞实际与nginx关系不大,nginx只是个代理,负责根据用户的配置文件,通过fastcgi_param指令将参数传递给FastCGI Server,以前版本中php默认cgi.fix_pathinfo=1,这就造成了这个漏洞

php.inicgi.fix_pathinfo=1时,php CGI以/为分隔符从后向前依次检查路径是否存在

/var/www/html/uploadfiles/1.jpg/a.php/b.php
/var/www/html/uploadfiles/1.jpg/a.php
/var/www/html/uploadfiles/1.jpg

版本信息

从上面可看出该漏洞与 nginx、php版本无关,属于用户配置不当造成的解析漏洞

  • Nginx 1.x 最新版
  • PHP 7.x最新版

复现配置

php中需要配置

 cgi.fix_pathinfo = 1
 security.limit_extensions=.php .jpg	# 这个是php中新引入的限制可执行文件的后缀,要复现这个漏洞要给 jpg 加个白名单

漏洞利用

上传jpg文件

img

访问.jpg/xx.phpxx.php不存在)

img


0x03 文件名逻辑漏洞(CVE-2013-4547)

vulhub位置:/nginx/CVE-2013-4547/

这个漏洞主要原因是错误的解析了请求的URI,错误的获取到了用户请求的文件名导致出现权限绕过,代码执行等问题

影响版本

影响版本:Nginx 0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7

漏洞利用1(代码执行)

配置

nginx匹配.php的请求后发送给 fastcgi 解析,常见写法如下:

location ~ \.php$ {
    include        fastcgi_params;

    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  /var/www/html$fastcgi_script_name;
    fastcgi_param  DOCUMENT_ROOT /var/www/html;
}

正常情况下,只有.php后缀的文件才会被发送至fastcgi解析,但是存在 CVE-2013-4547 漏洞的情况下,1.jpg\x20\x00.php,这个url可以匹配到正则 \.php$,从而可以进入 location 块。但在进入后,nginx错误的认为请求文件是 1.jpg\x20(windows下会忽略空格,利用起来更方便),将其设置为 SCRIPT_FILENAME 发送给fastcgi进行解析

fastcgi对其进行解析就会造成解析漏洞

利用

http://192.168.154.135:8080/index.php 上传文件处禁止上传.php文件,如下:

img

可上传1.jpg :(注意空格)

img

访问/uploadfiles/1.jpg\x20\x00.php即可执行刚才上传的1.jpg 中的php代码

img

漏洞利用2(权限绕过)

配置

很多网站经常会限制可访问后台的ip:

location /admin/ {
    allow 127.0.0.1;
    deny all;
}

如上,正常只有本地可以访问到/admin/这个目录下的文件,但是存在 CVE-2013-4547 漏洞的情况下,可以通过形如 /tmp\x20/../admin/ 来绕过限制。这种的利用方式有些苛刻,需要有一个带空格的目录才行(linux一定要有一个存在的目录,否则 /xxx/../ 如果 xxx 目录不存在的话会出现错误)。不过对于windows就没有这个限制了,利用起来要方便的多

利用

正常/admin/是禁止访问的:

img

可以利用该缺陷请求:/tmp /../admin/index.html,绕过限制(linux下要保证存在tmp 这个目录)

img

参考链接

http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2013-4547

https://blog.werner.wiki/file-resolution-vulnerability-nginx/

http://www.91ri.org/9064.html


0x04 Nginx越界读取缓存漏洞(CVE-2017-7529)

vulhub位置:/nginx/CVE-2017-7529/

当使用nginx并且开启缓存功能时,攻击者可以构造特定的header头字段,能越界读取到缓存文件的头信息,而头信息中可能会包含nginx代理站点的真实ip或是其他敏感信息

影响版本

nginx version 0.5.6 - 1.13.2

该漏洞影响所有 0.5.6 - 1.13.2 版本内默认配置模块的nginx只需要开启缓存,攻击者即可发送恶意请求进行远程攻击造成信息泄露

修复版本

nginx version 1.13.3 1.12.1

漏洞利用

正常访问可看到响应体长度为10

img

获取前600个字节

600 + 10 = 610	//加上原有的长度

0x8000000000000 - 610 = 9223372036854775198

img

参考链接

https://cert.360.cn/detailnews.html?id=b879782fbad4a7f773b6c18490d67ac7

http://galaxylab.org/cve-2017-7529-nginx%E6%95%B4%E6%95%B0%E6%BA%A2%E5%87%BA%E6%BC%8F%E6%B4%9E%E5%88%86%E6%9E%90/

安全从业者