nginx历史漏洞
0x00 前言
整理一下nginx常见的配置漏洞和其本身的漏洞,主要参考:
0x01 nginx配置错误导致的漏洞
vulhub位置: /nginx/insecure-configuration/
CRLF注入漏洞
nginx会将$url
解码,导致传入%0d%0a
即可引入换行符,造成CRLF漏洞
错误配置
location / {
return 302 https://$host$uri;
}
漏洞利用
正常请求如下,原本目的是为了将http
的请求跳转到https
上
可通过传入%0d%0a
传入换行符,控制响应头及响应体
可用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../
进行目录穿越
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
中父块中的头信息已经被覆盖了
0x02 nginx解析漏洞
vulhub位置:/nginx/nginx_parsing_vulnerability/
这个漏洞实际与nginx关系不大,nginx只是个代理,负责根据用户的配置文件,通过fastcgi_param
指令将参数传递给FastCGI Server
,以前版本中php默认cgi.fix_pathinfo=1
,这就造成了这个漏洞
当php.ini
中cgi.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
文件
访问.jpg/xx.php
(xx.php
不存在)
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
文件,如下:
可上传1.jpg
:(注意空格)
访问/uploadfiles/1.jpg\x20\x00.php
即可执行刚才上传的1.jpg
中的php代码
漏洞利用2(权限绕过)
配置
很多网站经常会限制可访问后台的ip:
location /admin/ {
allow 127.0.0.1;
deny all;
}
如上,正常只有本地可以访问到/admin/这个目录下的文件,但是存在 CVE-2013-4547 漏洞的情况下,可以通过形如 /tmp\x20/../admin/
来绕过限制。这种的利用方式有些苛刻,需要有一个带空格的目录才行(linux一定要有一个存在的目录,否则 /xxx/../
如果 xxx
目录不存在的话会出现错误)。不过对于windows就没有这个限制了,利用起来要方便的多
利用
正常/admin/
是禁止访问的:
可以利用该缺陷请求:/tmp /../admin/index.html
,绕过限制(linux下要保证存在tmp
这个目录)
参考链接
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
获取前600个字节
600 + 10 = 610 //加上原有的长度
0x8000000000000 - 610 = 9223372036854775198
参考链接
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/