• nginx $uri导致的CRLF注入漏洞


     路径:nginx/insecure-configuration

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

    8080:CRLF注入漏洞

    8081: 目录穿越漏洞

    8082: add_header被覆盖

    $uri导致的CRLF注入漏洞

    Nginx会将$uri进行解码,导致传入%0d%0a即可引入换行符,造成CRLF注入漏洞。

    错误的配置文件示例(原本的目的是为了让http的请求跳转到https上):

    下面两种情景十分常见:

    1.用户访问http://example.com/aabbcc,自动跳转到https://example.com/aabbcc

    将会301跳转到https;随着现在https的普及,很多站点都强制使用https访问,这样的跳转非常常见。

    2.用户访问http://example.com/aabbcc,自动跳转到http://www.example.com/aabbcc

    该场景主要是为了统一用户访问的域名,更加有益于SEO优化。

    在跳转的过程中,我们需要保证用户访问的页面不变,所以需要从Nginx获取用户请求的文件路径。查看Nginx文档,可以发现有三个表示uri的变量:

    1. $uri

    2. $document_uri

    3. $request_uri

    解释一下,1和2表示的是解码以后的请求路径,不带参数;3表示的是完整的URI(没有解码)。那么,如果运维配置了下列的代码:

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

    因为$uri是解码以后的请求路径,所以可能就会包含换行符,也就造成了一个CRLF注入漏洞

    这个CRLF注入漏洞可以导致会话固定漏洞、设置Cookie引发的CSRF漏洞或者XSS漏洞。其中,我们通过注入两个\r\n即可控制HTTP体进行XSS,但因为浏览器认为这是一个300跳转,所以并不会显示我们注入的内容。

    这个情况下,我们可以利用一些技巧:比如使用CSP头来iframe的地址,这样浏览器就不会跳转,进而执行我们插入的HTML:

    7f13f178fa394e0197e13cb41d677c99.png

    如何修复这个CRLF漏洞?正确的做法应该是如下:

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

    另外,由$uri导致的CRLF注入漏洞不仅可能出现在上述两个场景中,理论上,只要是可以设置HTTP头的场景都会出现这个问题。

    由于我的8080端口访问报错,出现此页面不能正确地重定向,导致无法进行复现,但我们要掌握原理,了解该漏洞的问题之处以及防御。

     

     

     

  • 相关阅读:
    .net wpf程序 移花接木
    AppLink上的小鹅通能实现什么操作呢?
    【图像评价指标】PSNR LPIPS LMD SSIM FID
    查询所有HIVE表分区数据量
    【Spring】Spring源码中占位符解析器PropertyPlaceholderHelper的使用
    HTML笔记
    【字符串压缩】
    如何将LLM 集成到自动化生产系统
    数据库系统原理与应用教程(075)—— MySQL 练习题:操作题 151-159(十九):综合练习
    理论修炼---View事件分发的快速理解
  • 原文地址:https://blog.csdn.net/weixin_60719780/article/details/128186625