运行测试环境
~: 启动容器,无需编译
docker-compose up -d
~:用于列出当前正在运行的Docker Compose服务的容器状态(可以看到正常启动)
docker
ps
运行成功后,Nginx将会监听8080/8081/8082三个端口,分别对应三种漏洞,这里讲解两种。
Mistake 1.CRLF注入
8080对应CRLF注入漏洞
漏洞原理:
就是设置HTTP头的时候没有处理换行,导致了头注入
CRLF是CR和LF两个字符的拼接,它们分别代表”回车+换行”(rn)“,十六进制编码分别为0x0d和0x0a,URL编码为%0D和%0A。CR和LF组合在一起即CRLF命令,它表示键盘上的"Enter"键,许多应用程序和网络协议使用这些命令作为分隔符。
而在HTTP协议中,HTTP header之间是由一个CRLF字符序列分隔开的,HTTP Header与Body是用两个CRLF分隔的,浏览器根据这两个CRLF来取出HTTP内容并显示出来。
所以如果用户的输入在HTTP返回包的Header处回显,便可以通过CRLF来提前结束响应头,在响应内容处注入攻击脚本。因此CRLF又叫HTTP响应拆分/截断(HTTP Response Splitting)简称HRS。
因为nginx配置此项(原本的目的是为了让http的请求跳转到https上):
location
/ {
return
302
https://
$host
$uri
;
}
而在此例中Nginx会将$uri进行解码,导致传入%0d%0a即可引入换行符,造成CRLF注入漏洞。
前置知识点:
在Nginx的配置文件中,location是用于匹配和处理请求的指令。它用于定义请求的URL路径,并指定应该如何处理这些请求。location指令通常与其他指令(如root、proxy_pass、try_files等)结合使用,以定义请求的处理方式。
location指令有两种常见的用法:
精确匹配:
location = /path {
// 处理路径为 /path 的请求
}
上述配置表示只有当请求的路径完全匹配为 /path 时,该location块中的指令才会生效。
正则表达式匹配:
rubyCopy code
location ~* .(jpg
|jpeg|
png)$ {
//
处理以 .jpg、.jpeg 或 .png 结尾的请求
}
上述配置使用正则表达式进行匹配,处理以 .jpg、.jpeg 或 .png 结尾的请求。~*表示不区分大小写。
HTTP协议中,请求和响应是由请求行、请求/响应头部和消息主体(可选)组成的。其中,请求/响应头部用于传递关于请求/响应的信息,而消息主体则用于携带实际的数据。
在请求头部中插入一个换行符(rn)和插入两个换行符(rnrn)之间存在一些区别。这些区别主要涉及HTTP协议的解析和处理方式。
插入一个换行符: 请求头部中插入一个换行符时,服务器接收到请求后,会将该换行符解析为一个空行,表示请求头的结束。服务器将忽略该空行并继续处理请求的主体部分(如果有)。
插入两个换行符: 插入两个换行符时,服务器将解析第一个换行符作为请求头的结束,而第二个换行符将被解析为空行。这意味着服务器将认为请求头已经结束
总结起来,插入一个换行符表示请求头的结束,服务器将继续处理请求的主体部分。而插入两个换行符表示请求头的结束、。
常用的HTTP请求头
Accept: text/plain |
Accept-Charset: utf-8 |
Accept-Encoding: gzip, deflate |
Accept-Language: en-US |
常用的HTTP响应头
Access-Control-Allow-Origin: |
Accept-Patch: text/example;charset=utf-8 |
Accept-Ranges: bytes |
Age: 12 |
开始实验:
Payload:
http
://your-ip:8080/
%0
d
%0
aSet-Cookie:
%20
a=1
可注入Set-Cookie头
构造一个XSS漏洞
CRLF是”回车 + 换行”(rn)的简称。在HTTP协议中,HTTP Header与HTTP Body是用两个CRLF分隔的,浏览器就是根据这两个CRLF来取出HTTP 内容并显示出来。
注入两个CRLF就能造成一个无视浏览器Filter的反射型XSS,简单来说,通过服务器设置的$uri解析,加上两个CRLF使得可以将数据写入响应体
Payload:
http:
//
192.168
.
44.177
:
8080
/%0d%0a%0d%0a<script>alert(
'xss'
)<
/script>
但是还是无法成功反射执行js代码
为什么呢:浏览器的Filter是浏览器应对一些反射型XSS做的保护策略,当url中含有XSS相关特征的时候就会过滤掉不显示在页面中,所以不能触发XSS。
怎样才能关掉filter?一般来说用户这边是不行的,只有数据包中http头含有X-XSS-Protection并且值为0的时候,浏览器才不会开启filter。所以,可以将X-XSS-Protection:0注入到数据包中,再用两个CRLF来注入XSS代码,这样就成功地绕过了浏览器filter,并且执行我们的反射型XSS
注入一个X-XSS-Protection:0到数据包中
Payload:
http
://192.168.44.177:8080/
%0
aX-XSS-Protection:
%200
%0
d
%0
a
%0
d
%0
a<img
%20
src=1
%20
onerror=alert(/xss/)>
实际上确实使得回显X-XSS-Protection:0了,但是还是没有成功返回xss代码,网上看了一些资料说可能和现在浏览器有关,或者content-Length有关,测试到这里停止了,如果您有见解,感谢分享!
Mistake 2. 目录穿越漏洞
Nginx在配置别名(Alias)的时候,如果忘记加/,将造成一个目录穿越漏洞。
错误的配置文件示例(原本的目的是为了让用户访问到/home/目录下的文件):
location
/files {
alias
/home/;
}
./:代表目前所在的目录。
. ./:代表上一层目录。
/:代表根目录。
alias指定路径是location的内容(这里是/files),有一种替换的效果,比如配置以上内容后,访问路径当中含有/files,会被替换为/home/。
Payload:
http:
//your-ip:8081/files../
成功穿越到根目录:
作者和微信公众号平台共有,重在学习交流,不以任何盈利为目的,欢迎转载。
由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。公众号内容中部分攻防技巧等只允许在目标授权的情况下进行使用,大部分文章来自各大安全社区,个人博客,如有侵权请立即联系公众号进行删除。若不同意以上警告信息请立即退出浏览!!!
敲敲小黑板:《刑法》第二百八十五条 【非法侵入计算机信息系统罪;非法获取计算机信息系统数据、非法控制计算机信息系统罪】违反国家规定,侵入国家事务、国防建设、尖端科学技术领域的计算机信息系统的,处三年以下有期徒刑或者拘役。违反国家规定,侵入前款规定以外的计算机信息系统或者采用其他技术手段,获取该计算机信息系统中存储、处理或者传输的数据,或者对该计算机信息系统实施非法控制,情节严重的,处三年以下有期徒刑或者拘役,并处或者单处罚金;情节特别严重的,处三年以上七年以下有期徒刑,并处罚金。
原文始发于微信公众号(巢安实验室):Nginx 配置错误导致漏洞
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论