Nginx 路径绕过
字数 1025 2025-09-01 11:25:54

Nginx路径解析绕过漏洞分析与利用

漏洞概述

本漏洞涉及Nginx作为反向代理时,由于正则匹配规则与实际路径处理逻辑之间的不一致性,导致攻击者可以通过构造包含特殊Unicode字符的URL绕过访问控制限制,访问被保护的资源路径。

环境分析

应用架构

  1. 后端服务:Flask应用运行在本地8080端口,提供两个路由:

    • /:返回欢迎信息"Hello, CTFer!"
    • /secret:返回环境变量中的flag值
  2. 前端代理:Nginx监听80端口,作为反向代理将请求转发给Flask应用

Nginx配置关键部分

location ~* ^/secret/?$ {
    deny all;
}

location ~* ^/secret/ {
    deny all;
}

location / {
    proxy_pass http://localhost:8080;
}

配置意图:完全禁止对/secret及其子路径的访问

漏洞原理

正则匹配的局限性

  1. 配置中使用的正则表达式^/secret/?$^/secret/看似能覆盖所有与/secret相关的路径
  2. 但未考虑特殊Unicode字符的处理差异

Nginx的Unicode字符处理机制

  1. Nginx在处理URL中的某些Unicode字符时,会将其规范化或忽略
  2. 正则匹配是基于原始字符进行的
  3. 这种处理差异导致安全绕过

关键漏洞点

  1. 当请求中包含某些特殊Unicode字符时:
    • 正则匹配认为这不是/secret路径而允许访问
    • 内部路径解析机制会忽略这些特殊字符
    • 最终仍将请求转发到/secret路径

漏洞利用方法

利用步骤

  1. 测试正常访问

    • 直接访问/secret返回403禁止访问
    • 确认Nginx版本信息未泄露(减少防御方信息)
  2. 构造特殊URL

    • /secret路径后添加特殊Unicode字符
    • 使用十六进制编码表示这些字符
  3. 推荐使用的特殊字符

    • \x85:对应Unicode U+0085(下一行字符)
    • \xa0:对应Unicode U+00A0(非-breaking空格)
  4. 验证方法

    • 使用请求工具的"显示不可见字符"功能(如\n按钮)
    • 查看Hex编码确认特殊字符已添加

实际利用示例

构造如下URL进行访问:

http://example.com/secret\x85

http://example.com/secret\xa0

防御措施

  1. Nginx配置改进

    • 使用更严格的正则表达式
    • 考虑所有可能的Unicode变体
  2. 应用层防御

    • 在后端应用中进行路径验证
    • 规范化所有传入的路径
  3. 其他措施

    • 定期更新Nginx到最新版本
    • 进行安全配置审计

总结

该漏洞展示了Web安全中一个常见问题:当不同组件对输入的处理方式不一致时,可能产生安全绕过。理解Nginx的路径解析机制与正则匹配的差异是发现和防御此类漏洞的关键。

Nginx路径解析绕过漏洞分析与利用 漏洞概述 本漏洞涉及Nginx作为反向代理时,由于正则匹配规则与实际路径处理逻辑之间的不一致性,导致攻击者可以通过构造包含特殊Unicode字符的URL绕过访问控制限制,访问被保护的资源路径。 环境分析 应用架构 后端服务 :Flask应用运行在本地8080端口,提供两个路由: / :返回欢迎信息"Hello, CTFer !" /secret :返回环境变量中的flag值 前端代理 :Nginx监听80端口,作为反向代理将请求转发给Flask应用 Nginx配置关键部分 配置意图:完全禁止对 /secret 及其子路径的访问 漏洞原理 正则匹配的局限性 配置中使用的正则表达式 ^/secret/?$ 和 ^/secret/ 看似能覆盖所有与 /secret 相关的路径 但未考虑特殊Unicode字符的处理差异 Nginx的Unicode字符处理机制 Nginx在处理URL中的某些Unicode字符时,会将其规范化或忽略 正则匹配是基于原始字符进行的 这种处理差异导致安全绕过 关键漏洞点 当请求中包含某些特殊Unicode字符时: 正则匹配认为这不是 /secret 路径而允许访问 内部路径解析机制会忽略这些特殊字符 最终仍将请求转发到 /secret 路径 漏洞利用方法 利用步骤 测试正常访问 : 直接访问 /secret 返回403禁止访问 确认Nginx版本信息未泄露(减少防御方信息) 构造特殊URL : 在 /secret 路径后添加特殊Unicode字符 使用十六进制编码表示这些字符 推荐使用的特殊字符 : \x85 :对应Unicode U+0085(下一行字符) \xa0 :对应Unicode U+00A0(非-breaking空格) 验证方法 : 使用请求工具的"显示不可见字符"功能(如 \n 按钮) 查看Hex编码确认特殊字符已添加 实际利用示例 构造如下URL进行访问: 或 防御措施 Nginx配置改进 : 使用更严格的正则表达式 考虑所有可能的Unicode变体 应用层防御 : 在后端应用中进行路径验证 规范化所有传入的路径 其他措施 : 定期更新Nginx到最新版本 进行安全配置审计 总结 该漏洞展示了Web安全中一个常见问题:当不同组件对输入的处理方式不一致时,可能产生安全绕过。理解Nginx的路径解析机制与正则匹配的差异是发现和防御此类漏洞的关键。