Nginx 配置错误导致漏洞

admin 2023年5月18日18:30:24评论34 views字数 3090阅读10分18秒阅读模式

运行测试环境

~ 启动容器,无需编译

docker-compose up -d

~用于列出当前正在运行的Docker Compose服务的容器状态可以看到正常启动

docker ps

运行成功后,Nginx将会监听8080/8081/8082三个端口,分别对应三种漏洞这里讲解两种

Mistake 1.CRLF注入

8080对应CRLF注入漏洞

漏洞原理:

就是设置HTTP头的时候没有处理换行,导致了头注入
CRLFCRLF两个字符的拼接,它们分别代表”回车+换行”(rn)“,十六进制编码分别为0x0d0x0aURL编码为%0D%0ACRLF组合在一起即CRLF命令,它表示键盘上的"Enter"键,许多应用程序和网络协议使用这些命令作为分隔符。
而在HTTP协议中,HTTP header之间是由一个CRLF字符序列分隔开的,HTTP HeaderBody是用两个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指令通常与其他指令(如rootproxy_passtry_files等)结合使用,以定义请求的处理方式。

location指令有两种常见的用法:

精确匹配:

location = /path {// 处理路径为 /path 的请求}

上述配置表示只有当请求的路径完全匹配为 /path 时,该location块中的指令才会生效。

正则表达式匹配:

rubyCopy codelocation ~* .(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/%0d%0aSet-Cookie:%20a=1

可注入Set-Cookie头

Nginx 配置错误导致漏洞

Nginx 配置错误导致漏洞

构造一个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>

Nginx 配置错误导致漏洞

但是还是无法成功反射执行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/%0aX-XSS-Protection:%200%0d%0a%0d%0a<img%20src=1%20onerror=alert(/xss/)>

Nginx 配置错误导致漏洞

Nginx 配置错误导致漏洞

实际上确实使得回显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 配置错误导致漏洞

Nginx 配置错误导致漏洞作者和微信公众号平台共有,重在学习交流,不以任何盈利为目的,欢迎转载。

由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。公众号内容中部分攻防技巧等只允许在目标授权的情况下进行使用,大部分文章来自各大安全社区,个人博客,如有侵权请立即联系公众号进行删除。若不同意以上警告信息请立即退出浏览!!!

敲敲小黑板:《刑法》第二百八十五条 【非法侵入计算机信息系统罪;非法获取计算机信息系统数据、非法控制计算机信息系统罪】违反国家规定,侵入国家事务、国防建设、尖端科学技术领域的计算机信息系统的,处三年以下有期徒刑或者拘役。违反国家规定,侵入前款规定以外的计算机信息系统或者采用其他技术手段,获取该计算机信息系统中存储、处理或者传输的数据,或者对该计算机信息系统实施非法控制,情节严重的,处三年以下有期徒刑或者拘役,并处或者单处罚金;情节特别严重的,处三年以上七年以下有期徒刑,并处罚金。

原文始发于微信公众号(巢安实验室):Nginx 配置错误导致漏洞

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年5月18日18:30:24
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Nginx 配置错误导致漏洞https://cn-sec.com/archives/1744004.html

发表评论

匿名网友 填写信息