Always keep a beginner's mind, don't forget the begin|

dr4w

园龄:1年粉丝:1关注:2

杂记

nginx常见漏洞解析

什么是中间件:

它是一类提供系统软件和应用软件之间连接,便于各部件之间沟通放入软件,他们借助中间件在不同技术架构之间共享信息与资源

image-20240528232104085

url导致的crlf注入漏洞

http的结构中,状态行和首部中的每行以crlf结束,首部与主体之间由一空行分隔

CRLF 指的是回车符(CR,ASCII 13,\r,%0d) 换行符(LF,ASCII 10,\n,%0a)。

两种情景

  1. 用户访问http://example.com/aabbcc,自动跳转到https://example.com/aabbcc
  2. 用户访问http://example.com/aabbcc,自动跳转到http://www.example.com/aabbcc
location / {
    return 302 https://$host$uri;
}
#因为`$uri`是解码以后的请求路径,所以可能就会包含换行符,也就造成了一个CRLF注入漏洞。
利用方式

使用vulhub中的漏洞库,用docker来拉取,读取文档了解8080端口对应crlf注入漏洞

C:\Users\86198>curl -I http://192.168.218.131:8080/%0d%0aSet-Cookie:%20a=1
HTTP/1.1 302 Moved Temporarily
Server: nginx/1.13.0
Date: Tue, 28 May 2024 16:00:18 GMT
Content-Type: text/html
Content-Length: 161
Connection: keep-alive
Location: http://192.168.218.131:8080/
Set-Cookie: a=1

通过这种注入,我们可以篡改用户的请求报文

我们使用burp抓包可以看到另一种可能性:在我们发送两个连续的换行\r\n,可以直接修改返回报文的返回体。插入js代码引发xss

/%0d%0a%0d%0a<script>alert(1)</script>

image-20240529001327625

至于为什么是两个连续的\r\n是因为主体要和首部一行分割

预防措施

在配置中使用完整的url不能解码

location / {
    return 302 https://$host$request_uri;
}

目录穿越漏洞

这个常见于Nginx做反向代理的情况,动态的部分被proxy_pass传递给后端端口,而静态文件需要Nginx来处理。

假设静态文件存储在/home/目录下,而该目录在url中名字为files,那么就需要用alia

s设置目录的别名来替换:

location /files {
    alias /home/;
}
利用方式

此时,访问http://example.com/files/readme.txt,就可以获取/home/readme.txt文件。

但我们注意到,url/files没有加后缀/,而alias设置的/home/是有后缀/的,这个/就导致我们可以从/home/目录穿越到他的上层目录:

image-20240529233143397

这样就有了一个目录穿越漏洞

预防措施
location /files/ {
	alias: /home/;
}

在进行alies配置的过程中一定保证location后的匹配路径和别名路径一致。否则就会引发这样的路径穿越漏洞。

http header头被覆盖

nginx的配置文件中,分为Server,Location这些配置块,并且存在包含关系,内部是可以继承外部的一些配置,但是当子类配置后,会将覆盖掉父类配置的相同类型的头,造成漏洞

server {
    ...
    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;
    }
}

/test2location中添加了X-Content-Type-Options头,nginx仅载入模块内部的头部修改信息,则会导致在父块中配置的 add_header Content-Security-Policy "default-src 'self'";无法在/test2中生效。从而使/test2这里无法获得防御功能

Content Security Policy设置
Content-Security-Policy: default-src 'self'; script-src 'self' https://example.com; img-src 'self' data:; style-src 'self' 'unsafe-inline'; font-src 'self' https://example.com;

Content Security Policy (CSP) 是一种加固 Web 应用的安全性的技术,通过在网站页面中设置 CSP Header 来限制页面中能够执行的脚本、样式、图片等资源

这个 CSP 规则禁止所有来自第三方网站的资源,只允许本网站的资源加载。其中 script-src 只允许本网站和 example.com 的脚本加载,img-src 只允许本网站和 data: URI 的图片加载,style-src 只允许本网站和内联样式加载,font-src 只允许本网站和 example.com 的字体加载

利用方式

image-20240530000926055

#这是转到的JS文件,获取锚点也就是#后面的内容添加到<p>标签内部
window.onload = function() {
    var m = document.getElementById('m');
    m.innerHTML = location.hash.substr(1);
}

这个东西会对写入的xss进行转义。

所以可以利用写法可以写为:

http://127.0.0.:8082/test2#<script>alert(1)</script>
预防措施

配置头部信息修改时细分到最小块,这样才能最大限度的保证每一个小块的头部配置都是正确的。当然,也可以写到父块中,但是子块在进行头部个性化修改时,切记将父块中的头配置给子块复制一份。

server {
        listen 8082;
 
        root /usr/share/nginx/html;
 
        index index.html;
 
        server_name _;
 
    autoindex on;
 
    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;
        add_header Content-Security-Policy "default-src 'self'";
        add_header X-Frame-Options DENY;
        rewrite ^(.*)$ /xss.html break;
    }
}

Nginx越界读取缓存漏洞

影响版本Nginx 0.5.6 ~ 1.13.2

影响说明:信息泄漏

环境说明Nginx 1.13.2

环境搭建: 此次环境使用docker环境搭建,环境采用地址Vulhub

引发:

Nginx在反向代理站点的时候,通常会将一些文件进行缓存,特别是静态文件。缓存的部分存储在文件中,每个缓存文件包括“文件头”+“HTTP返回包头”+“HTTP返回包体”。如果二次请求命中了该缓存文件,则Nginx会直接将该文件中的“HTTP返回包体”返回给用户。

如果我的请求中包含Range头,Nginx将会根据我指定的start和end位置,返回指定长度的内容。而如果我构造了两个负的位置,如(-600, -9223372036854774591),将可能读取到负位置的数据。如果这次请求又命中了缓存文件,则可能就可以读取到缓存文件中位于“HTTP返回包体”前的“文件头”、“HTTP返回包头”等内容。

缓存

当请求服务器的资源时,如果在缓存服务器中存在,则直接返回,不在访问应用服务器,可以降低应用服务器的负载。 例如网站的首页的缓存,nginx的默认缓存路径在/tmp/nginx下,例如:当请求服务器的资源时,如果在缓存服务器中存在,则直接返回,不在访问应用服务器,可以降低应用服务器的负载。

image-20240531084109194

漏洞利用

使用curl工具测试下,命令如下,执行后发现,返回的内容是正常的。

curl -i http://127.0.0.1:8080 -r 0-612

image-20240531085519539

想要读取缓存头,读取前600个字节

直接利用

image-20240531085932437

本文作者:dr4w

本文链接:https://www.cnblogs.com/zMeedA/p/18223754

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   dr4w  阅读(18)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起