news 2026/6/10 16:00:09

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/6/10 11:22:49

亲测好用8个AI论文写作软件,本科生搞定论文不求人!

亲测好用8个AI论文写作软件,本科生搞定论文不求人! AI 工具如何让论文写作变得轻松高效 在当今这个信息爆炸的时代,本科生的论文写作任务日益繁重,尤其是在面对大量文献阅读、数据分析和文字表达时,许多同学都会感到力…

作者头像 李华
网站建设 2026/6/10 11:19:27

分享一个MySQL 8.0复制架构主从自动切换脚本

/* by 01022.hk - online tools website : 01022.hk/zh/formatc.html */ #!/bin/bash # # 基于GTID的MySQL 8.0 一主一从架构主从切换脚本 # 版本: 3.0 # 优化内容: 全变量配置、增强可配置性、改进错误处理 # # >>>>>>>>>>>> 第一部分&a…

作者头像 李华
网站建设 2026/6/10 9:36:18

《深入剖析 NumPy ndarray:为何比 Python List 快 50~100 倍?》

《深入剖析 NumPy ndarray:为何比 Python List 快 50~100 倍?》 一、开篇引入:从 Python 到 NumPy 的速度革命 Python 以简洁优雅的语法和强大的生态系统闻名,从 Web 开发到数据科学、人工智能,它几乎无处不在。然而&…

作者头像 李华
网站建设 2026/6/10 11:13:05

告别论文问卷烦恼!百考通AI带你轻松搞定问卷设计与分析

作为一名刚经历过毕业论文“洗礼”的学长,我深刻理解同学们在设计问卷时的无助感。记得我当时为了设计一份像样的问卷,前后修改了十几遍,结果还被导师指出“结构混乱”、“信效度不足”。 幸运的是,现在有了像百考通AI这样的智能…

作者头像 李华
网站建设 2026/6/10 11:12:23

【记录】AU|什么是泛音和音高,在频谱上如何体现?人类和乐器的区别明显吗?走近基本知识:从泛音列到人声奥秘的声学探索

文章目录省流版基本操作观察结果详细版前言:一次好奇驱动的探索一、 实验准备:AU中的基础工具二、 核心发现:乐音 vs. 人声的频谱世界1. 谐波的秩序:乐器为何听起来“丰满”?2. 人声的“指纹”:声道如何塑造…

作者头像 李华