docker下实现nginx的三种配置错误漏洞

$uri导致的CRLF注入漏洞

漏洞原理

CRLF注入漏洞又称HTTP响应拆分漏洞(HTTP Response Splitting),攻击方式是将回车符、换行符注入到HTTP的响应包中。
  HTTP响应包通常以两个换行符,去划分响应头与响应正文两个部分。当用户的操作足以控制响应头的内容时,将会出现CRLF漏洞。

换行符、回车符
回车符(CR,ASCII 13,\r,%0d)
换行符(LF,ASCII 10,\n,%0a)

查看Nginx文档,可以发现有三个表示uri的变量:

  1. $uri
  2. $document_uri
  3. $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头

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值