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/