news 2026/5/30 13:09:47

NginxDeny绕过-玄武杯2025-眼见不为实

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
NginxDeny绕过-玄武杯2025-眼见不为实

一、附件代码

# pylint: disable=missing-module-docstring,missing-function-docstring import os from flask import Flask, render_template app = Flask(__name__, template_folder="templates") @app.route("/") def index(): return render_template("index.html") @app.route("/secret") def secret(): return os.getenv("FLAG", "NSSCTF{default}") if __name__ == "__main__": app.run("0.0.0.0", 8080, debug=False)

这是一个简单的 Flask 应用,定义了两个路由:

● 根路径/:返回首页

● /secret路径:返回环境变量中的 flag 值,这显然是我们需要获取的目标

应用运行在本地 8080 端口,而 Nginx 作为反向代理监听 80 端口,将请求转发给这个 Flask 应用。

Nginx 配置:

server { listen 80; server_name localhost; location ~* ^/secret/?$ { deny all; return 403; } location ~* ^/secret/ { deny all; return 403; } location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }


● 第一个 location 块:~* ^/secret/?$ 匹配/secret或/secret/路径,使用deny all禁止访问

● 第二个 location 块:~* ^/secret/ 匹配以/secret/开头的路径,同样禁止访问

● 其他所有请求都通过proxy_pass转发到本地 8080 端口的 Flask 应用

二、漏洞分析

这个 Nginx 配置存在路径解析绕过漏洞,主要原因在于 Nginx 的正则匹配规则与后端flask实际路径处理逻辑之间存在不一致性。

1. 正则匹配的局限性:配置中使用的正则表达式^/secret/?$和^/secret/看似能覆盖所有与/secret相关的路径,但没有考虑到特殊 Unicode 字符的情况。

2. Nginx 的 Unicode 字符处理机制:Nginx 在处理 URL 中的某些 Unicode 字符时,会将其规范化或忽略,而正则匹配则是基于原始字符进行的。这种差异导致攻击者可以构造特殊 URL,既能够绕过 Nginx 的正则匹配,又能被正确解析为/secret路径。

3. 关键漏洞点:当请求中包含某些特殊 Unicode 字符时,例如 U+2026(水平省略号…)、U+0085(下一行字符)等,Nginx 的正则匹配会认为这不是/secret路径而允许访问,但其内部路径解析机制会忽略这些特殊字符,最终仍然将请求转发到/secret路径。

也就是说,Nginx 使用正则表达式匹配 URL。如果我们在 /secret 后面加上特定的 Unicode 字符(如 \x85),Nginx 会认为 /secret\x85 不匹配 ^/secret/?$(因为多了一个字符),也不匹配 ^/secret/(因为 \x85 不是 /),从而放行请求。当请求转发到后端的 Python Flask应用时,Python 的 WSGI 层或 Flask 框架在处理 URL 时,会将 \x85 (Next Line) 或 \xa0 (Non-breaking space) 等字符视为空白符或无效字符进行“标准化”处理,最终将其解析为 /secret,从而成功执行代码并返回 Flag。

三、漏洞利用

带上路径/secret访问,bp抓包拦截。改成a0也行

四、总结

考点:Nginx 路径解析差异绕过 / Unicode 标准化漏洞。
• 核心机制:
• Nginx 是基于正则 (Regex) 匹配字符串的,对特殊字符非常敏感。
• Python (Flask/Werkzeug) 是基于语义解析 URL 的,会在路由匹配前进行解码和清理。
• 利用 \x85 (Next Line) 或 \xa0 (NBSP) 等高位 Unicode 字符,可以骗过 Nginx 的正则拦截,同时让后端应用将 \x85 (Next Line) 或 \xa0 (Non-breaking space) 等字符视为空白符或无效字符进行“标准化”处理,“视而不见”地解析出正确路径。

不同版本的Nginx搭配后端做反代时的deny绕过参考:

http://missmoon.cn/archives/nnginx-deny

https://xz.aliyun.com/news/14403

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/30 0:19:30

数据库笔记

SQL数据库所有数据有相同的字段名(键),可以像表格那样存。字段名作为每一列的头。但是很明显不适合存字段为数组、列表、字典的数据。NoSQL数据库不像表格那样存的数据库。每个数据条目的成员不固定。事务把一系列操作按顺序写成一个脚本&…

作者头像 李华
网站建设 2026/5/20 18:15:56

UVM-phase中的object机制

在class uvm_phase extends uvm_object中1. 类的作用和结构这个类是 uvm_phase,它管理测试平台中阶段的 objection 机制。UVM 使用 objection 机制来控制仿真的执行时间,防止测试提前结束。核心成员:systemveriloguvm_objection phase_done; …

作者头像 李华
网站建设 2026/5/20 14:56:31

FeignRequestInterceptor 原理详解

FeignRequestInterceptor是 OpenFeign 的请求拦截器机制,其工作原理如下:1. 核心设计模式责任链模式:Feign 通过拦截器链在请求发送前和接收后执行自定义逻辑。// 拦截器接口定义 public interface RequestInterceptor {void apply(RequestTe…

作者头像 李华
网站建设 2026/5/24 12:00:59

AI 写论文哪个软件最好?虎贲等考 AI 凭 “学术闭环” 登顶首选

毕业季的论文攻坚战,“AI 写论文哪个软件最好” 成了学子圈的终极拷问。有的软件文献引用虚拟无据,有的 AI 痕迹明显被导师打回,有的功能碎片化需反复切换工具 —— 真正靠谱的 AI 写作软件,不仅要 “写得快”,更要 “…

作者头像 李华
网站建设 2026/5/20 20:54:25

网络安全技术核心框架:一文理清从原理到实践的知识体系

1.网络安全的概念 网络安全的定义 ISO对网络安全的定义:网络系统的软件、硬件以及系统中存储和传输的数据受到保护,不因偶然的或者恶意的原因而遭到破坏、更改、泄露,网络系统连续可靠正常地运行,网络服务不中断。 网络安全的属…

作者头像 李华
网站建设 2026/5/21 0:01:01

Aurix TC387 Can配置记录

一、MCMCAN介绍fSYN is supplied from fMCANH and fASYN is supplied from fMCAN from CCU. fSYN is used as the clock source for Register and RAM interface,fASYN is used to generate the nominal and fast CAN FD baudrates. It is recommended to use fASYN as 80, 40,…

作者头像 李华