$uri
导致的CRLF注入漏洞
漏洞原理
CRLF注入漏洞又称HTTP响应拆分漏洞(HTTP Response Splitting),攻击方式是将回车符、换行符注入到HTTP的响应包中。
HTTP响应包通常以两个换行符,去划分响应头与响应正文两个部分。当用户的操作足以控制响应头的内容时,将会出现CRLF漏洞。
换行符、回车符
回车符(CR,ASCII 13,\r,%0d)
换行符(LF,ASCII 10,\n,%0a)
查看Nginx文档,可以发现有三个表示uri的变量:
$uri
$document_uri
$request_uri
解释一下,1和2表示的是解码以后的请求路径,不带参数;3表示的是完整的URI(没有解码)
漏洞环境搭建
https://vulhub.org/ vulhub上有教程就不细说了
进入/vulhub/nginx/insecure-configuration目录
启动镜像:
docker-compose up -d
Nginx会将$uri进行解码,导致传入%0a%0d即可引入换行符,造成CRLF注入漏洞。
错误的配置文件示例(原本的目的是为了让http的请求跳转到https上):
location / {
return 302 https://$host$uri;
}
因为$uri
是解码以后的请求路径,所以可能就会包含换行符,也就造成了一个CRLF注入漏洞。
这个CRLF注入漏洞可以导致会话固定漏洞、设置Cookie引发的CSRF漏洞或者XSS漏洞。其中,我们通过注入两个\r\n
即可控制HTTP体进行XSS,但因为浏览器认为这是一个301跳转,所以并不会显示我们注入的内容。
漏洞复现
出现了302的跳转,证明就成功了
我们使用这个Payload: http://your-ip:8080/%0a%0dSet-Cookie:%20a=1,可注入Set-Cookie头。
可以看到我们的set-cookie:a=1已经被换换行符换下去了
当我们输入两次%0d时,响应头和响应正文会进行分离,就可以构成反射型xss
payload:
http://you-ip/?setcookie=%0dX-XSS-Protection:%200%0a%0d%0a%0d%0a<script>alert('xss')</script>
这样我们就能够实现一个反射性xss漏洞。
那么如何修复这个CRLF漏洞呢?($request_uri它是不会被解析的)
location / {
return 302 https://$host$request_uri;
}
目录穿越漏洞
漏洞原理
若web要显示一个商品的图像,有时候开发者会用通过HTML加载,如:
<img src="/loadImage?filename=214.png">
使用filename参数加载图像文件,图片文件位置可能映射在 /var/www/images/ 上,所以真实的路径是 /var/www/images/214.png
这就导致了攻击者可以读取服务器上的任意文件:
https://www.*****.com/loadImage?filename=…/…/…/etc/passwd
filename的参数值与真实路径组合起来就是:
/var/www/images/…/…/…/etc/passwd
其等价于:
/etc/passwd
在Unix操作系统上,…/ 是一个标准的返回上一级路径的语法;
在Windows操作系统上, …/ 和 …\ 都是返回上一级的语句。(这里是两个点,但是无论怎么输入都是三个点。)
CVE-2021-41773目录遍历(文件穿越)
原理:
攻击者可以使用路径遍历攻击穿越到服务器目录以外。在开启CGI配置后(开启cgi并不是什么罕见之事),将会从目录穿越升级为RCE(任意命令执行)。
复现:
进入CVE-2021-41773后我们直接启动漏洞环境
这样我们就创建好了。
打开Burpsuite,构造get参数,palyload如下:
GET /icons/.%2e/%2e%2e/%2e%2e/%2e%2e/etc/passwd HTTP/1.1
我们再修改下请求参数为POST,然后再使用如下的playload
POST /cgi-bin/.%2e/%2e%2e/%2e%2e/%2e%2e/bin/sh HTTP/1.1
然后send一下,就能查看我们的id了
再修改命令为woami
如何解决这个漏洞?只需要保证location和alias的值都有后缀/
或都没有这个后缀。
Http 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全部失效。
环境搭建:
就是第一个漏洞的环境,因为Nginx将会监听8080/8081/8082三个端口,分别对应三种漏洞,就是上本文的这三种漏洞,只不过第二个漏洞我选择用一个典型的漏洞。
实现:
如下我们可以看到我们加的csp头(default-src 'self)不见了
我们再GET /test1来与test2来对比
可以见得很test1是有scp头的,而test2是没有的,取而代之的是他自己定义的头部。
解决方法也很简单:去/test2的location中删除X-Content-Type-Options头