<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Web 安全 on 逍遥笔记</title><link>https://blog.7qiang.com/tags/web-%E5%AE%89%E5%85%A8/</link><description>Recent content in Web 安全 on 逍遥笔记</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><copyright>逍遥笔记</copyright><lastBuildDate>Thu, 13 Aug 2026 23:00:00 +0800</lastBuildDate><atom:link href="https://blog.7qiang.com/tags/web-%E5%AE%89%E5%85%A8/index.xml" rel="self" type="application/rss+xml"/><item><title>虚拟发卡系统回调伪造漏洞全链路拆解 — 从备份文件泄露到批量盗取卡密</title><link>https://blog.7qiang.com/posts/acg-faka-bepusdt-callback-forgery-analysis/</link><pubDate>Thu, 13 Aug 2026 23:00:00 +0800</pubDate><guid>https://blog.7qiang.com/posts/acg-faka-bepusdt-callback-forgery-analysis/</guid><description>&lt;img src="https://blog.7qiang.com/blog-cover-cyber-mask.gif" alt="Featured image of post 虚拟发卡系统回调伪造漏洞全链路拆解 — 从备份文件泄露到批量盗取卡密" /&gt;
 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;一分钟速读：&lt;/strong&gt; 一个朋友的虚拟发卡站在一夜之间被批量盗走了上百张卡密。攻击者没有碰数据库，没有拿 Shell，甚至没有登录后台——他只是向一个公开的回调接口发送了一条精心构造的&amp;quot;支付成功&amp;quot;通知，系统就乖乖地把卡密吐了出来。本文从攻击日志逆向还原完整攻击链，揭示密钥泄露的两条路径——&lt;strong&gt;备份文件暴露&lt;/strong&gt;（官方公告确认）与 &lt;strong&gt;Nginx 配置错误导致 Config.php 源码可读&lt;/strong&gt;（日志分析发现），拆解回调签名机制的致命弱点，并用同一套方法对五个同类站点进行实测审计。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="前言"&gt;前言
&lt;/h2&gt;&lt;p&gt;事发后，ACG-Faka 官方发布了安全公告：&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;严禁在网站根目录存放备份文件。&lt;/strong&gt; 近期排查发现，多个 V3 新版网站出现伪造支付回调，主要原因是在网站根目录存放了整站备份、数据库备份或 ZIP 压缩包。这些文件可被公网直接下载，其中通常包含支付密钥、货源接口密钥、数据库账号密码等敏感信息。攻击者获取后，可直接伪造支付回调并自动提取商品。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;公告一针见血：&lt;strong&gt;问题不在签名算法，而在密钥泄露。&lt;/strong&gt; 签名算法再安全，密钥被攻击者拿到了也白搭。&lt;/p&gt;
&lt;p&gt;那密钥是怎么泄露的？公告指出是备份文件，我们的日志分析还发现了另一条独立路径——Nginx 配置错误导致 PHP 源码直接暴露。两条路径殊途同归，都指向同一个运维盲区：&lt;strong&gt;敏感文件可被公网直接下载&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;虚拟发卡系统的核心流程很简单：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;用户下单 → 跳转支付网关 → 链上确认 → 网关回调通知 → 系统标记已付 → 释放卡密
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;问题出在第四步。支付网关（BEpusdt）向发卡系统（ACG-Faka）发送回调通知时，系统需要验证这条通知&lt;strong&gt;确实来自网关、而非攻击者伪造&lt;/strong&gt;。如果验证机制存在缺陷，攻击者就可以跳过真实支付，直接&amp;quot;通知&amp;quot;系统订单已付，白拿卡密。&lt;/p&gt;
&lt;p&gt;这不是假设场景。我拿到了一份真实攻击日志，下面是完整拆解。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="一攻击复盘从日志还原-660-条请求"&gt;一、攻击复盘：从日志还原 660 条请求
&lt;/h2&gt;&lt;h3 id="11-攻击时间线"&gt;1.1 攻击时间线
&lt;/h3&gt;&lt;p&gt;通过分析受害站点的 Nginx Access Log，攻击者（IP: &lt;code&gt;203.27.106.***&lt;/code&gt;）的行为可以清晰地分为四个阶段：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;时间&lt;/th&gt;
 &lt;th&gt;阶段&lt;/th&gt;
 &lt;th&gt;行为&lt;/th&gt;
 &lt;th&gt;日志特征&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;14:22&lt;/td&gt;
 &lt;td&gt;路径探测&lt;/td&gt;
 &lt;td&gt;尝试 &lt;code&gt;/callback/BEpusdt&lt;/code&gt; vs &lt;code&gt;/callback.BEpusdt&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;404 → 200，锁定正确路径格式&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;14:50&lt;/td&gt;
 &lt;td&gt;签名试探&lt;/td&gt;
 &lt;td&gt;发送全零签名 &lt;code&gt;000...000&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;29 字节响应 = &lt;code&gt;{&amp;quot;code&amp;quot;:0,&amp;quot;msg&amp;quot;:&amp;quot;sign error&amp;quot;}&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;17:01&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;源码窃取&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;反复请求 &lt;code&gt;/app/Pay/BEpusdt/Config/Config.php&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;200，响应体包含 PHP 源码&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;17:32&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;首次得手&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;发送携带正确签名的伪造回调&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;33 字节响应&lt;/strong&gt; = &lt;code&gt;{&amp;quot;code&amp;quot;:200,&amp;quot;msg&amp;quot;:&amp;quot;success&amp;quot;}&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;18:31+&lt;/td&gt;
 &lt;td&gt;批量收割&lt;/td&gt;
 &lt;td&gt;自动化脚本，每 6 秒一单&lt;/td&gt;
 &lt;td&gt;持续 33 字节成功响应&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;注意 14:50 到 17:01 之间的两小时空白——攻击者在第一次签名试探失败后，&lt;strong&gt;没有继续暴力枚举签名&lt;/strong&gt;，而是转向了一个完全不同的方向：读源码。&lt;/p&gt;
&lt;h3 id="12-响应大小指纹"&gt;1.2 响应大小指纹
&lt;/h3&gt;&lt;p&gt;Nginx 日志中的 &lt;code&gt;body_bytes_sent&lt;/code&gt; 字段暴露了一切：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;29 字节 → {&amp;#34;code&amp;#34;:0,&amp;#34;msg&amp;#34;:&amp;#34;sign error&amp;#34;} # 签名错误，攻击失败
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;35 字节 → {&amp;#34;code&amp;#34;:0,&amp;#34;msg&amp;#34;:&amp;#34;handle not found&amp;#34;} # 插件不存在
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;33 字节 → {&amp;#34;code&amp;#34;:200,&amp;#34;msg&amp;#34;:&amp;#34;success&amp;#34;} # 攻击成功，订单被标记已付
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;当日志中突然出现 33 字节的响应时，攻击已经得手了。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="二回调签名机制为什么能被伪造"&gt;二、回调签名机制：为什么能被伪造
&lt;/h2&gt;&lt;h3 id="21-bepusdt-的签名算法"&gt;2.1 BEpusdt 的签名算法
&lt;/h3&gt;&lt;p&gt;BEpusdt 是一个 USDT 收款网关，当链上确认收款后，它向商户系统发送 HTTP POST 回调。签名计算方式：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;signature = MD5( 按字母排序的参数字符串 + API_TOKEN )
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;具体来说：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 1. 取所有非空参数（排除 signature 本身）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;signature&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 2. 按 key 字母排序，拼接成 key=value&amp;amp; 格式&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sorted_str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;amp;&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 3. 末尾拼接 API Token，取 MD5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;signature&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;md5&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sorted_str&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;api_token&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;商户端验证时，用自己存储的 API Token 重新计算签名，与收到的签名做比对。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;这个算法本身没有问题。&lt;/strong&gt; 问题在于：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;如果 API Token 泄露了，攻击者可以算出合法签名&lt;/li&gt;
&lt;li&gt;如果 API Token 为空，签名 = &lt;code&gt;MD5(params + &amp;quot;&amp;quot;)&lt;/code&gt;，任何人都能算&lt;/li&gt;
&lt;li&gt;如果比对方式有缺陷（PHP 弱类型），签名验证可被绕过&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="22-acg-faka-的回调处理流程"&gt;2.2 ACG-Faka 的回调处理流程
&lt;/h3&gt;&lt;p&gt;ACG-Faka 收到回调请求后的处理链：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/user/api/order/callback.{Handle}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;路由到对应插件（BEpusdt / Epusdt / Alipay）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;插件的 Signature.php 验证签名
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;验证通过 → Order.php 更新订单状态 → 释放卡密
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;返回 &amp;#34;success&amp;#34;（BEpusdt）或 &amp;#34;ok&amp;#34;（Epusdt）
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;关键文件：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;文件&lt;/th&gt;
 &lt;th&gt;作用&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;app/Pay/BEpusdt/Config/Config.php&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;存储 API Token（签名密钥）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;app/Pay/BEpusdt/Impl/Signature.php&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;签名验证逻辑&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;app/Service/Bind/Order.php&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;订单状态更新&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="三根因分析密钥泄露的两条路径--两重代码缺陷"&gt;三、根因分析：密钥泄露的两条路径 + 两重代码缺陷
&lt;/h2&gt;&lt;p&gt;攻击成功的前提是拿到 API Token。从目前掌握的信息看，攻击者有&lt;strong&gt;两条互相独立的路径&lt;/strong&gt;可以拿到密钥，命中任何一条就够了。&lt;/p&gt;
&lt;h3 id="31-路径一备份文件泄露官方公告确认"&gt;3.1 路径一：备份文件泄露（官方公告确认）
&lt;/h3&gt;&lt;p&gt;这是官方通告明确指出的主因。很多站长习惯用宝塔面板的&amp;quot;一键备份&amp;quot;功能，把整站打包成 &lt;code&gt;.zip&lt;/code&gt; 或 &lt;code&gt;.tar.gz&lt;/code&gt; 放在网站根目录：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/www/wwwroot/faka/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── index.php
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── app/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ └── Pay/BEpusdt/Config/Config.php ← 包含 API Token
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── config/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ └── database.php ← 包含数据库密码
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── site_backup_20260810.zip ← 整站备份，包含以上所有文件
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── db_backup_20260810.sql ← 数据库导出，包含所有订单和卡密
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Nginx 默认会把 &lt;code&gt;.zip&lt;/code&gt; 当静态文件返回。攻击者只需猜到文件名（常见模式：&lt;code&gt;backup.zip&lt;/code&gt;、&lt;code&gt;www.zip&lt;/code&gt;、域名.zip、日期.zip），就能&lt;strong&gt;一次性下载全站源码 + 数据库&lt;/strong&gt;，其中包括支付密钥、数据库凭据、货源接口密钥——全部明文。&lt;/p&gt;
&lt;p&gt;这比后面要说的 Config.php 泄露更严重，因为&lt;strong&gt;数据库备份里连卡密都有&lt;/strong&gt;，攻击者甚至不需要走伪造回调这条弯路。&lt;/p&gt;
&lt;h3 id="32-路径二nginx-配置错误导致-configphp-直接暴露"&gt;3.2 路径二：Nginx 配置错误导致 Config.php 直接暴露
&lt;/h3&gt;&lt;p&gt;这是我们在日志分析中发现的另一条路径。ACG-Faka 的 PHP 配置文件存放在 &lt;code&gt;/app/Pay/BEpusdt/Config/Config.php&lt;/code&gt;。如果 Nginx 没有做目录级 deny：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-nginx" data-lang="nginx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ❌ 缺少这条规则，攻击者可以直接请求 PHP 文件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;location&lt;/span&gt; &lt;span class="p"&gt;~&lt;/span&gt;&lt;span class="sr"&gt;*&lt;/span&gt; &lt;span class="s"&gt;^/(app|config|runtime|vendor)/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;deny&lt;/span&gt; &lt;span class="s"&gt;all&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;后果因 Nginx 对 &lt;code&gt;.php&lt;/code&gt; 的路由配置而异：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Nginx 配置&lt;/th&gt;
 &lt;th&gt;请求 Config.php 的结果&lt;/th&gt;
 &lt;th&gt;危险等级&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.php&lt;/code&gt; 正确路由到 PHP-FPM&lt;/td&gt;
 &lt;td&gt;PHP 执行 &lt;code&gt;return [...]&lt;/code&gt;，输出为空（200 空响应）&lt;/td&gt;
 &lt;td&gt;⚠️ 中&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.php&lt;/code&gt; 未路由到 PHP-FPM（当静态文件返回）&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;PHP 源码原文输出，API Token 明文暴露&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;🔴 致命&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;第二种情况在宝塔面板上比想象中常见——如果 Nginx 的 &lt;code&gt;location ~ \.php$&lt;/code&gt; 规则只匹配了网站根目录下的 &lt;code&gt;.php&lt;/code&gt; 文件，深层路径（如 &lt;code&gt;/app/Pay/.../Config.php&lt;/code&gt;）的 &lt;code&gt;.php&lt;/code&gt; 可能不会交给 PHP-FPM 处理，而是被当成普通文本文件返回。&lt;/p&gt;
&lt;p&gt;攻击者直接看到了：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;&amp;lt;?&lt;/span&gt;&lt;span class="nx"&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;api_url&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;https://pay.example.com&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;api_token&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;a1b2c3d4e5f6...&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// ← 签名密钥，明文暴露
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;我们审计的五个站中，Config.php 都返回 200 空响应（PHP 正确执行了 &lt;code&gt;return []&lt;/code&gt;），Token 没有泄露。但&lt;strong&gt;路径可达本身就是隐患&lt;/strong&gt;——如果未来某次运维操作改了 PHP-FPM 配置，Token 就会暴露。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;两条路径的关系：&lt;/strong&gt; 备份文件是&amp;quot;一锅端&amp;quot;，Config.php 是&amp;quot;精准窃取&amp;quot;。攻击者会两条路都试——先扫备份文件（自动化成本低），扫不到再尝试直接读 Config.php。实际攻击日志中两种行为都有出现。&lt;/p&gt;
&lt;h3 id="33-代码缺陷一php-弱类型比较高危"&gt;3.3 代码缺陷一：PHP 弱类型比较（高危）
&lt;/h3&gt;&lt;p&gt;即使 Token 没有泄露，BEpusdt 插件的签名比对方式也可能存在问题。如果 Signature.php 使用了 PHP 的 &lt;code&gt;==&lt;/code&gt;（宽松比较）而非 &lt;code&gt;===&lt;/code&gt;（严格比较）或 &lt;code&gt;hash_equals()&lt;/code&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// ❌ 危险：PHP 弱类型比较
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$calculated_sign&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nv"&gt;$received_sign&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 攻击向量：
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// - signature=0 → int(0) == &amp;#34;any_string&amp;#34; 在特定条件下为 true
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// - signature=false → false == &amp;#34;&amp;#34; 为 true
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// - signature=[] → 数组与字符串比较行为不可预测
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;安全的实现应该是：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// ✅ 安全：类型检查 + 时序安全比较
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;is_string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$sign&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nv"&gt;$sign&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;hash_equals&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$calculated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$sign&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;hash_equals()&lt;/code&gt; 的作用有两个：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;防止类型混淆&lt;/strong&gt;——只接受字符串&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;防止时序攻击&lt;/strong&gt;——比较耗时恒定，不会因为前几位匹配而提前返回&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="34-代码缺陷二回调端点无访问控制中危"&gt;3.4 代码缺陷二：回调端点无访问控制（中危）
&lt;/h3&gt;&lt;p&gt;回调端点 &lt;code&gt;/user/api/order/callback.BEpusdt&lt;/code&gt; 对任何 IP 开放。攻击者可以从任意位置发送请求，系统只靠签名验证来区分合法回调与伪造请求。&lt;/p&gt;
&lt;p&gt;理想状态下，应该叠加 IP 白名单：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-nginx" data-lang="nginx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;location&lt;/span&gt; &lt;span class="p"&gt;~&lt;/span&gt;&lt;span class="sr"&gt;*&lt;/span&gt; &lt;span class="s"&gt;^/user/api/order/callback\.&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;allow&lt;/span&gt; &lt;span class="n"&gt;1.2.3.4&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;# 支付网关服务器 IP
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;deny&lt;/span&gt; &lt;span class="s"&gt;all&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;即使签名验证被绕过，IP 白名单也能兜底。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="四完整攻击链"&gt;四、完整攻击链
&lt;/h2&gt;&lt;p&gt;两条密钥泄露路径最终汇聚到同一个攻击终点：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ┌─────────────────────────┐ ┌─────────────────────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ 路径 A: 备份文件扫描 │ │ 路径 B: Config.php 直读 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ GET /backup.zip │ │ GET /app/Pay/BEpusdt/ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ GET /www.zip │ │ Config/Config.php │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ GET /db_2026.sql │ │ (Nginx 未路由到 PHP-FPM) │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ → 下载整站+数据库 │ │ → PHP 源码明文返回 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └────────────┬────────────┘ └──────────────┬──────────────┘
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ ┌────────────────────┐ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └────►│ API Token 泄露 ★ │◄────┘
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └─────────┬──────────┘
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ┌───────────────▼───────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ Step 1: 路径探测 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ GET /user/api/order/callback. │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ → 确认 BEpusdt Handle 存在 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └───────────────┬───────────────┘
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ┌───────────────▼───────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ Step 2: 伪造合法回调 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ 用窃取的 Token 计算 MD5 签名 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ POST callback.BEpusdt │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ → &amp;#34;success&amp;#34; (33B) ★ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └───────────────┬───────────────┘
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ┌───────────────▼───────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ Step 3: 批量收割 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ 自动化创建订单 → 伪造回调 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ → 查询卡密 → 每 6 秒一单 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └───────────────────────────────┘
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;整个过程不需要任何漏洞利用工具，只需要 &lt;code&gt;curl&lt;/code&gt; 和 &lt;code&gt;md5sum&lt;/code&gt;。路径 A 甚至不需要走回调——数据库备份里直接就有卡密。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="五五站实测审计"&gt;五、五站实测审计
&lt;/h2&gt;&lt;p&gt;拿到攻击手法后，我用同一套方法对五个同类站点进行了黑盒审计。测试矩阵包含 13+ 种攻击向量，每次攻击后通过 API 验证订单状态是否变化。&lt;/p&gt;
&lt;h3 id="51-攻击向量"&gt;5.1 攻击向量
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;#&lt;/th&gt;
 &lt;th&gt;向量&lt;/th&gt;
 &lt;th&gt;目标&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;A1&lt;/td&gt;
 &lt;td&gt;全零签名 / 随机签名&lt;/td&gt;
 &lt;td&gt;基础验签能力&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;A2&lt;/td&gt;
 &lt;td&gt;空签名 / 缺失签名字段&lt;/td&gt;
 &lt;td&gt;空值绕过&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;A3&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;signature=0&lt;/code&gt; (int)&lt;/td&gt;
 &lt;td&gt;PHP &lt;code&gt;==&lt;/code&gt; 弱类型：&lt;code&gt;0 == &amp;quot;string&amp;quot;&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;A4&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;signature=false&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;PHP &lt;code&gt;==&lt;/code&gt; 弱类型：&lt;code&gt;false == &amp;quot;&amp;quot;&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;A5&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;signature=[]&lt;/code&gt; (数组)&lt;/td&gt;
 &lt;td&gt;PHP 数组比较行为异常&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;A6&lt;/td&gt;
 &lt;td&gt;空密钥 MD5 签名&lt;/td&gt;
 &lt;td&gt;Token 为空时可伪造&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;A7&lt;/td&gt;
 &lt;td&gt;空密钥 HMAC-SHA256&lt;/td&gt;
 &lt;td&gt;同上，适配 Epusdt 插件&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;A8&lt;/td&gt;
 &lt;td&gt;金额篡改 (0.01)&lt;/td&gt;
 &lt;td&gt;金额绑定验证&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;A9&lt;/td&gt;
 &lt;td&gt;非成功 status 值&lt;/td&gt;
 &lt;td&gt;状态字段校验&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;A10&lt;/td&gt;
 &lt;td&gt;form-urlencoded 格式&lt;/td&gt;
 &lt;td&gt;Content-Type 混淆&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;A11&lt;/td&gt;
 &lt;td&gt;路径穿越 Handle&lt;/td&gt;
 &lt;td&gt;插件路由安全&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="52-审计结果"&gt;5.2 审计结果
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;站点&lt;/th&gt;
 &lt;th&gt;框架&lt;/th&gt;
 &lt;th&gt;回调安全&lt;/th&gt;
 &lt;th&gt;状态验证&lt;/th&gt;
 &lt;th&gt;源码泄露&lt;/th&gt;
 &lt;th&gt;CF 防护&lt;/th&gt;
 &lt;th&gt;综合&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;站点 A&lt;/td&gt;
 &lt;td&gt;ACG-Faka&lt;/td&gt;
 &lt;td&gt;✅ 34/34 SAFE&lt;/td&gt;
 &lt;td&gt;有 API&lt;/td&gt;
 &lt;td&gt;路径泄露&lt;/td&gt;
 &lt;td&gt;无&lt;/td&gt;
 &lt;td&gt;⚠️ 中&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;站点 B&lt;/td&gt;
 &lt;td&gt;ACG-Faka&lt;/td&gt;
 &lt;td&gt;✅ 全部 SAFE&lt;/td&gt;
 &lt;td&gt;有 API&lt;/td&gt;
 &lt;td&gt;路径泄露&lt;/td&gt;
 &lt;td&gt;无&lt;/td&gt;
 &lt;td&gt;⚠️ 中&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;站点 C&lt;/td&gt;
 &lt;td&gt;Next.js/Vercel&lt;/td&gt;
 &lt;td&gt;N/A&lt;/td&gt;
 &lt;td&gt;需认证&lt;/td&gt;
 &lt;td&gt;无&lt;/td&gt;
 &lt;td&gt;全站&lt;/td&gt;
 &lt;td&gt;✅ 低&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;站点 D&lt;/td&gt;
 &lt;td&gt;ACG-Faka&lt;/td&gt;
 &lt;td&gt;✅ 全部 SAFE&lt;/td&gt;
 &lt;td&gt;无 (404)&lt;/td&gt;
 &lt;td&gt;路径+composer&lt;/td&gt;
 &lt;td&gt;无&lt;/td&gt;
 &lt;td&gt;⚠️ 中&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;站点 E&lt;/td&gt;
 &lt;td&gt;ACG-Faka&lt;/td&gt;
 &lt;td&gt;✅ 64/64 SAFE&lt;/td&gt;
 &lt;td&gt;有 API&lt;/td&gt;
 &lt;td&gt;路径+composer&lt;/td&gt;
 &lt;td&gt;无&lt;/td&gt;
 &lt;td&gt;⚠️ 中&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;关键发现：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;回调签名验证全部正常&lt;/strong&gt;——五个站都没有被伪造回调突破&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;但四个 ACG-Faka 站都有源码路径泄露&lt;/strong&gt;——攻击者可以看到 Fatal Error 中暴露的物理路径&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Config.php 虽然返回 200 空&lt;/strong&gt;（PHP 正确执行了），但路径可达本身就是隐患&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;唯一一个 Next.js + Vercel 站&lt;/strong&gt;完全不受此类攻击影响——非 PHP 框架，无弱类型问题，Vercel 不暴露源码&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="53-为什么这五个站没被攻破"&gt;5.3 为什么这五个站没被攻破
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;没有备份文件暴露&lt;/strong&gt;——五个站的 Web 根目录下没有扫到可下载的 &lt;code&gt;.zip&lt;/code&gt; / &lt;code&gt;.sql&lt;/code&gt; / &lt;code&gt;.bak&lt;/code&gt; 文件&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Config.php 正确走了 PHP-FPM 路由&lt;/strong&gt;——返回 200 空响应，Token 没有泄露&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;但隐患仍在：四个 ACG-Faka 站的 &lt;code&gt;/app/&lt;/code&gt; 路径仍然可达，只是 PHP-FPM 兜住了。如果未来某次运维操作改错了 PHP-FPM 配置，或者站长在根目录放了一次备份文件，攻击者立刻就能得手。这是一颗定时炸弹。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="六防御方案"&gt;六、防御方案
&lt;/h2&gt;&lt;h3 id="61-p0-紧急修复立即执行"&gt;6.1 P0 紧急修复（立即执行）
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;清理并封锁备份文件&lt;/strong&gt;——这是最紧急的一步：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 1. 立即删除 Web 根目录下的所有备份文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;find /www/wwwroot/faka/ -maxdepth &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="se"&gt;\(&lt;/span&gt; -name &lt;span class="s2"&gt;&amp;#34;*.zip&amp;#34;&lt;/span&gt; -o -name &lt;span class="s2"&gt;&amp;#34;*.tar.gz&amp;#34;&lt;/span&gt; -o -name &lt;span class="s2"&gt;&amp;#34;*.rar&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -o -name &lt;span class="s2"&gt;&amp;#34;*.sql&amp;#34;&lt;/span&gt; -o -name &lt;span class="s2"&gt;&amp;#34;*.bak&amp;#34;&lt;/span&gt; -o -name &lt;span class="s2"&gt;&amp;#34;*.7z&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\)&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -exec rm -f &lt;span class="o"&gt;{}&lt;/span&gt; &lt;span class="se"&gt;\;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 2. 在 Nginx 中彻底封锁备份文件下载&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-nginx" data-lang="nginx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 封锁所有备份/归档文件类型
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;location&lt;/span&gt; &lt;span class="p"&gt;~&lt;/span&gt;&lt;span class="sr"&gt;*&lt;/span&gt; &lt;span class="s"&gt;\.(zip|tar\.gz|rar|sql|bak|7z|gz|tgz)&lt;/span&gt;$ &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;deny&lt;/span&gt; &lt;span class="s"&gt;all&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;403&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Nginx 封锁源码目录&lt;/strong&gt;——阻断 Config.php 泄露路径：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-nginx" data-lang="nginx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 阻止所有对 PHP 源码、配置、运行时文件的直接访问
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;location&lt;/span&gt; &lt;span class="p"&gt;~&lt;/span&gt;&lt;span class="sr"&gt;*&lt;/span&gt; &lt;span class="s"&gt;^/(app|config|runtime|vendor)/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;deny&lt;/span&gt; &lt;span class="s"&gt;all&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;403&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 阻止敏感文件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;location&lt;/span&gt; &lt;span class="p"&gt;~&lt;/span&gt;&lt;span class="sr"&gt;*&lt;/span&gt; &lt;span class="s"&gt;(composer\.(json|lock)|\.env|\.git)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;deny&lt;/span&gt; &lt;span class="s"&gt;all&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;403&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;更换所有凭据&lt;/strong&gt;——如果曾经在 Web 目录放过备份文件，&lt;strong&gt;必须假设已泄露&lt;/strong&gt;，一律重置：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;API Token（支付密钥）&lt;/li&gt;
&lt;li&gt;数据库密码&lt;/li&gt;
&lt;li&gt;货源接口密钥&lt;/li&gt;
&lt;li&gt;后台管理员密码&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;升级签名验证&lt;/strong&gt;——确认 Signature.php 使用 &lt;code&gt;hash_equals()&lt;/code&gt; + &lt;code&gt;is_string()&lt;/code&gt; 类型检查：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;safetyEquals&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mixed&lt;/span&gt; &lt;span class="nv"&gt;$str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$local&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;bool&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;is_string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nv"&gt;$str&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;hash_equals&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$local&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$str&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="62-p1-加固措施"&gt;6.2 P1 加固措施
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;回调端点 IP 白名单&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-nginx" data-lang="nginx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;location&lt;/span&gt; &lt;span class="p"&gt;~&lt;/span&gt;&lt;span class="sr"&gt;*&lt;/span&gt; &lt;span class="s"&gt;^/user/api/order/callback\.&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;allow&lt;/span&gt; &lt;span class="s"&gt;支付网关IP&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;deny&lt;/span&gt; &lt;span class="s"&gt;all&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;签名算法升级&lt;/strong&gt;——从 MD5 升级到 HMAC-SHA256：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// MD5 拼接（BEpusdt 默认）→ 容易被长度扩展攻击
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$sign&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;md5&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$sorted_string&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$token&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// HMAC-SHA256（推荐）→ 密钥参与哈希内部运算，无法伪造
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$sign&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;hash_hmac&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;sha256&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$sorted_string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$token&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="63-p2-监控告警"&gt;6.3 P2 监控告警
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;回调端点频率限制（单 IP 每分钟 ≤ 10 次）&lt;/li&gt;
&lt;li&gt;异常响应监控：连续出现 33 字节（success）响应时触发告警&lt;/li&gt;
&lt;li&gt;回调日志独立记录：IP、签名、时间、订单号，便于事后追溯&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="64-架构层面"&gt;6.4 架构层面
&lt;/h3&gt;&lt;p&gt;如果条件允许，考虑迁移到非 PHP 框架（如 Next.js + Vercel），从根本上消除 PHP 弱类型比较和源码泄露的风险。审计中唯一零风险的站点正是这种架构。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="七总结"&gt;七、总结
&lt;/h2&gt;&lt;p&gt;这次攻击的本质不是密码学层面的签名绕过，而是&lt;strong&gt;运维层面的密钥泄露&lt;/strong&gt;。攻击者有两条路可走：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;路径 A: Web 根目录残留备份文件（.zip / .sql）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; → 攻击者下载备份 → 解压得到全部凭据（甚至直接拿到卡密）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;路径 B: Nginx 配置错误，Config.php 当静态文件返回
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; → 攻击者读取 PHP 源码 → 得到 API Token
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;两条路殊途同归：
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; → 用 Token 计算合法 MD5 签名
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; → 伪造回调通知
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; → 系统认为已付款
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; → 卡密被释放
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;官方通告指向路径 A，日志分析发现路径 B。多个受害站点同时存在两个问题。&lt;/p&gt;
&lt;p&gt;修复其实不复杂——删备份文件、加 Nginx deny 规则、换密钥，三步就能阻断整条链。但现实是，四个受审计的 ACG-Faka 站点连 &lt;code&gt;/app/&lt;/code&gt; 目录的 deny 规则都没有。&lt;/p&gt;
&lt;p&gt;安全不是只靠签名算法。&lt;strong&gt;签名验证是最后一道防线，不应该是唯一一道。&lt;/strong&gt; 纵深防御意味着即使签名被绕过，IP 白名单能兜底；即使白名单没配，源码和备份至少不应该暴露密钥。任何一层失守都不会导致全盘崩溃——这才是安全架构的正确姿势。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;本文所有测试均在授权范围内进行，已获得站点所有者许可。文中不包含任何真实域名和凭据。&lt;/em&gt;&lt;/p&gt;</description></item><item><title>一次 Nginx Lua 木马应急响应实录：从移动端跳转博彩站到 root 级入侵溯源</title><link>https://blog.7qiang.com/posts/nginx-lua-malware-incident-response-2026/</link><pubDate>Sun, 21 Jun 2026 17:00:00 +0800</pubDate><guid>https://blog.7qiang.com/posts/nginx-lua-malware-incident-response-2026/</guid><description>&lt;img src="https://blog.7qiang.com/blog-cover-cyber-mask.gif" alt="Featured image of post 一次 Nginx Lua 木马应急响应实录：从移动端跳转博彩站到 root 级入侵溯源" /&gt;&lt;section class="xiaoyao-contact-card" aria-label="联系逍遥"&gt;
 &lt;img class="xiaoyao-contact-card__qr" src="https://blog.7qiang.com/contact-qr.png" width="690" height="690" loading="lazy" decoding="async" alt="逍遥微信二维码"&gt;
 &lt;div class="xiaoyao-contact-card__content"&gt;
 &lt;h3 class="xiaoyao-contact-card__title"&gt;联系逍遥&lt;/h3&gt;
 &lt;p class="xiaoyao-contact-card__description"&gt;扫码添加微信，或点击下方按钮复制联系方式。&lt;/p&gt;
 &lt;div class="xiaoyao-contact-buttons" data-contact-buttons&gt;
 &lt;button class="xiaoyao-contact-button xiaoyao-contact-button--wechat" type="button" data-copy-contact="plus6566" data-copy-label="微信号"&gt;
 &lt;span class="xiaoyao-contact-button__label"&gt;微信&lt;/span&gt;
 &lt;span class="xiaoyao-contact-button__value"&gt;plus6566&lt;/span&gt;
 &lt;span class="xiaoyao-contact-button__status" data-copy-status&gt;点击复制&lt;/span&gt;
 &lt;/button&gt;
 &lt;button class="xiaoyao-contact-button xiaoyao-contact-button--qq" type="button" data-copy-contact="826215906" data-copy-label="QQ 号"&gt;
 &lt;span class="xiaoyao-contact-button__label"&gt;QQ&lt;/span&gt;
 &lt;span class="xiaoyao-contact-button__value"&gt;826215906&lt;/span&gt;
 &lt;span class="xiaoyao-contact-button__status" data-copy-status&gt;点击复制&lt;/span&gt;
 &lt;/button&gt;
 &lt;span class="xiaoyao-contact-feedback" role="status" aria-live="polite"&gt;&lt;/span&gt;
&lt;/div&gt;

 &lt;/div&gt;
&lt;/section&gt;

&lt;p&gt;进微信群请联系博主，各位觉得文章对你有帮助的话可否打赏一些呀~&lt;/p&gt;
&lt;hr&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;事件等级&lt;/strong&gt;：🔴 严重 — 已确认 root 级入侵
&lt;strong&gt;攻击链&lt;/strong&gt;：root SSH 认证登录 → Nginx Lua 木马植入 → 服务脚本持久化 → 日志清洗
&lt;strong&gt;持久化方式&lt;/strong&gt;：init.d 服务脚本回灌 + chattr +i 文件锁定 + 时间戳伪造
&lt;strong&gt;处置结果&lt;/strong&gt;：活跃链路已切断，已知残留已隔离，证据已归档&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="一事件概述"&gt;一、事件概述
&lt;/h2&gt;&lt;p&gt;某电商站点运维人员收到用户反馈：&lt;strong&gt;移动端访问站点时偶发跳转到博彩风格的外部页面，桌面端访问正常&lt;/strong&gt;。同时该站点通过 CDN 访问时频繁出现 &lt;code&gt;520&lt;/code&gt; 错误。&lt;/p&gt;
&lt;p&gt;初步排查后发现，这不是前端 Bug，也不是支付插件异常，而是一次&lt;strong&gt;已经落证的服务器侧入侵事件&lt;/strong&gt;。攻击者通过已认证的 root SSH 会话进入系统，在 Nginx 层植入 Lua 恶意模块实现流量劫持，并配合了服务脚本持久化、文件不可变属性锁定和日志清洗等全套反取证手段。&lt;/p&gt;
&lt;p&gt;本文脱敏后完整记录此次应急响应的全流程，包括排查思路、取证方法、处置步骤和经验教训。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="二事件影响"&gt;二、事件影响
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;业务层面&lt;/strong&gt;：移动端用户访问站点时被服务端重定向到外部博彩风格域名，直接影响用户体验和业务信誉。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CDN 层面&lt;/strong&gt;：CDN 出现间歇性 &lt;code&gt;520&lt;/code&gt; 错误，并非单纯的 CDN 问题，而是叠加了 Nginx worker 进程崩溃风险。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;支付链路&lt;/strong&gt;：排查期间发现支付反代服务偶发超时，经分析属于 Docker 网络桥接配置问题，与 Lua 木马无直接关联。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;运维安全&lt;/strong&gt;：root 密码登录仍处于开放状态，且系统日志被清洗，导致部分入侵入口无法百分百回溯。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="三核心时间线"&gt;三、核心时间线
&lt;/h2&gt;&lt;h3 id="31-首次入侵约一个月前"&gt;3.1 首次入侵（约一个月前）
&lt;/h3&gt;&lt;p&gt;HIDS 记录到一条真实的 root SSH 会话，该会话执行了以下操作：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;动作&lt;/th&gt;
 &lt;th&gt;说明&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;修改 Nginx 配置文件&lt;/td&gt;
 &lt;td&gt;操作 &lt;code&gt;proxy.conf&lt;/code&gt; 等反向代理配置&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;植入恶意 Lua 文件&lt;/td&gt;
 &lt;td&gt;将恶意 WAF 脚本写入 Nginx 相关目录&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;锁定文件&lt;/td&gt;
 &lt;td&gt;对植入文件执行 &lt;code&gt;chattr +i&lt;/code&gt; 使其不可变&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;伪造时间戳&lt;/td&gt;
 &lt;td&gt;修改文件修改时间，掩盖植入时间点&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;重启 Nginx&lt;/td&gt;
 &lt;td&gt;执行 &lt;code&gt;nginx -t &amp;amp;&amp;amp; /etc/init.d/nginx restart&lt;/code&gt; 使木马生效&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;清洗日志&lt;/td&gt;
 &lt;td&gt;清空 &lt;code&gt;/var/log/auth.log&lt;/code&gt;、&lt;code&gt;wtmp&lt;/code&gt;、&lt;code&gt;btmp&lt;/code&gt;、审计日志&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;清除痕迹&lt;/td&gt;
 &lt;td&gt;执行 &lt;code&gt;history -c&lt;/code&gt; 和 &lt;code&gt;lastlog&lt;/code&gt; 清除命令历史和登录记录&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;关键判断&lt;/strong&gt;：这不是端口扫描或爆破尝试，而是「已认证」的入侵行为——攻击者拥有合法的 root 凭据。&lt;/p&gt;
&lt;h3 id="32-第二次落地事发当天凌晨"&gt;3.2 第二次落地（事发当天凌晨）
&lt;/h3&gt;&lt;p&gt;系统出现第二段落地行为：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;服务启动脚本 &lt;code&gt;/etc/init.d/nginx&lt;/code&gt; 被植入恶意回灌逻辑&lt;/li&gt;
&lt;li&gt;出现可疑的 &lt;code&gt;.so&lt;/code&gt; 动态库文件&lt;/li&gt;
&lt;li&gt;出现隐藏标记文件，内容为木马版本标识&lt;/li&gt;
&lt;li&gt;内核日志出现 Nginx worker 进程的段错误&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;关键判断&lt;/strong&gt;：这不是临时文件误报，而是服务重启级的持久化链路——即使当前恶意文件被删除，重启 Nginx 后木马会自动复活。&lt;/p&gt;
&lt;h3 id="33-应急响应窗口"&gt;3.3 应急响应窗口
&lt;/h3&gt;&lt;p&gt;从用户反馈到完整处置，应急响应推进路径如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;复现移动端 UA 与桌面端访问表现差异&lt;/li&gt;
&lt;li&gt;对比应用层日志和 Nginx 访问日志&lt;/li&gt;
&lt;li&gt;确认异常 &lt;code&gt;302&lt;/code&gt; 重定向出现在 Nginx 层而非 PHP 应用层&lt;/li&gt;
&lt;li&gt;通过 &lt;code&gt;nginx -T&lt;/code&gt; 导出全量配置，顺 Lua 加载路径定位恶意模块&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;先备份证据&lt;/strong&gt;，再替换为 no-op 空壳&lt;/li&gt;
&lt;li&gt;深挖持久化点，确认 init.d 脚本回灌逻辑&lt;/li&gt;
&lt;li&gt;清理认证面、隔离残留样本、打包证据并记录哈希&lt;/li&gt;
&lt;li&gt;复测移动端、桌面端、支付接口和关键服务状态&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="四排查分析过程"&gt;四、排查分析过程
&lt;/h2&gt;&lt;h3 id="41-区分问题层级"&gt;4.1 区分问题层级
&lt;/h3&gt;&lt;p&gt;用户报障后，首先要判断异常发生在哪一层：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;层级&lt;/th&gt;
 &lt;th&gt;如果是这层的问题&lt;/th&gt;
 &lt;th&gt;实际表现&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;前端 / CDN 缓存&lt;/td&gt;
 &lt;td&gt;服务端日志仍返回正常 HTML&lt;/td&gt;
 &lt;td&gt;❌ 服务端日志存在异常 302&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;PHP 应用层&lt;/td&gt;
 &lt;td&gt;应用代码、路由或日志中能找到跳转逻辑&lt;/td&gt;
 &lt;td&gt;❌ 应用层无异常&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Nginx 请求入口层&lt;/td&gt;
 &lt;td&gt;访问日志出现应用无感知的 302&lt;/td&gt;
 &lt;td&gt;✅ 命中了&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;本次通过移动端 UA 请求复现了 &lt;code&gt;302&lt;/code&gt;，并发现跳转参数中包含原始域名和设备类型，说明跳转逻辑在 HTTP 请求入口层——也就是 Nginx 层被劫持。&lt;/p&gt;
&lt;h3 id="42-访问日志分析"&gt;4.2 访问日志分析
&lt;/h3&gt;&lt;p&gt;访问日志中出现了关键特征：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;正常路径如 /、/item/1、/products → 间歇性 302，与正常 200 混杂
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这个特征非常关键：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;正常业务跳转通常有稳定规则（如未登录跳登录页）&lt;/li&gt;
&lt;li&gt;恶意流量劫持常按设备类型、流量比例、来源 Referer 或时间随机触发&lt;/li&gt;
&lt;li&gt;本次恶意 Lua 中确实存在&lt;strong&gt;移动端比例控制逻辑&lt;/strong&gt;——只在部分移动端请求中触发跳转&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="43-定位-nginx-lua-加载链"&gt;4.3 定位 Nginx Lua 加载链
&lt;/h3&gt;&lt;p&gt;审计 &lt;code&gt;nginx -T&lt;/code&gt; 全量配置后，重点排查以下位置：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;lua_package_path&lt;/code&gt; — Lua 模块搜索路径&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rewrite_by_lua&lt;/code&gt; / &lt;code&gt;access_by_lua&lt;/code&gt; — 请求阶段 Lua 钩子&lt;/li&gt;
&lt;li&gt;&lt;code&gt;include luawaf.conf&lt;/code&gt; — WAF 配置文件&lt;/li&gt;
&lt;li&gt;Nginx Lua 库目录&lt;/li&gt;
&lt;li&gt;WAF 脚本目录&lt;/li&gt;
&lt;li&gt;反向代理配置文件&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最终确认活跃恶意模块是一个伪装成正常模块名的 &lt;code&gt;.lua&lt;/code&gt; 文件，内容包含：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;外部博彩风格跳转域名&lt;/li&gt;
&lt;li&gt;移动端 UA 识别和比例触发逻辑&lt;/li&gt;
&lt;li&gt;远程配置拉取功能&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ngx.redirect()&lt;/code&gt; 跳转实现&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;与线上表现完全一致。&lt;/p&gt;
&lt;h3 id="44-先取证再处置"&gt;4.4 先取证再处置
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;本次没有直接删除任何可疑文件。&lt;/strong&gt; 原因：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;直接删除会破坏法证链，无法回溯入侵过程&lt;/li&gt;
&lt;li&gt;直接删除 Lua 文件可能导致仍存在的调用点把 Nginx 打挂&lt;/li&gt;
&lt;li&gt;攻击者使用了 &lt;code&gt;chattr +i&lt;/code&gt;、时间戳伪造和重启回灌，单点删除不能解决持久化&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;处置策略：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;将恶意原件保留到证据备份目录&lt;/li&gt;
&lt;li&gt;生产路径中的恶意 Lua 替换为同名 no-op 空壳模块&lt;/li&gt;
&lt;li&gt;保留导出函数签名，避免隐藏调用点异常&lt;/li&gt;
&lt;li&gt;执行 &lt;code&gt;nginx -t&lt;/code&gt; 验证配置后再 reload&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="45-追踪持久化机制"&gt;4.5 追踪持久化机制
&lt;/h3&gt;&lt;p&gt;仅替换当前活跃恶意模块后，不能认为修复完成。后续检查发现 init.d 服务脚本已被改造：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;从外部 URL 拉取远程载荷&lt;/li&gt;
&lt;li&gt;向 Nginx 配置文件写入 Lua 钩子&lt;/li&gt;
&lt;li&gt;操作 &lt;code&gt;lua_package_path&lt;/code&gt; 确保模块加载&lt;/li&gt;
&lt;li&gt;操作 &lt;code&gt;ld.so.preload&lt;/code&gt; 预加载共享库&lt;/li&gt;
&lt;li&gt;配合 &lt;code&gt;chattr +i&lt;/code&gt; 保护植入文件&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;这就是木马的复活机制&lt;/strong&gt;——只要 Nginx 服务重启，远程载荷会重新落地，配置会被重新注入。清理当前文件而不处理服务脚本，等于什么都没修。&lt;/p&gt;
&lt;h3 id="46-用-hids-建立根因证据链"&gt;4.6 用 HIDS 建立根因证据链
&lt;/h3&gt;&lt;p&gt;系统日志和 shell history 被清空后，常规取证手段失效。本次的关键证据来自 HIDS（主机入侵检测系统）的日志：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HIDS 中保留了 root SSH 会话记录及命令样本&lt;/li&gt;
&lt;li&gt;能证明约一个月前已发生真实入侵&lt;/li&gt;
&lt;li&gt;这个证据比猜测 IP 来源、猜测插件漏洞有价值得多&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;教训&lt;/strong&gt;：HIDS 日志是日志清洗后唯一可信的证据源，必须保证不被同机单点覆盖，最好外送或异地备份。&lt;/p&gt;
&lt;h3 id="47-扩展扫描残留"&gt;4.7 扩展扫描残留
&lt;/h3&gt;&lt;p&gt;切断已知攻击链后，继续检查：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;检查项&lt;/th&gt;
 &lt;th&gt;内容&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;进程&lt;/td&gt;
 &lt;td&gt;当前进程列表、高 CPU 进程&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;端口&lt;/td&gt;
 &lt;td&gt;监听端口和对应进程&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;服务&lt;/td&gt;
 &lt;td&gt;systemd 启用服务和 timer&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;定时任务&lt;/td&gt;
 &lt;td&gt;root 与系统级 crontab&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;预加载&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;/etc/ld.so.preload&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;启动脚本&lt;/td&gt;
 &lt;td&gt;shell profile、自启动脚本&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;认证文件&lt;/td&gt;
 &lt;td&gt;authorized_keys、uid=0 账户&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;SUID&lt;/td&gt;
 &lt;td&gt;SUID 提权文件&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Nginx worker&lt;/td&gt;
 &lt;td&gt;当前加载的动态库映射&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;近期变更&lt;/td&gt;
 &lt;td&gt;最近修改的系统文件&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;IOC 搜索&lt;/td&gt;
 &lt;td&gt;恶意模块名、可疑域名、隐藏标记文件&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;最终确认并隔离了三个残留工件：隐藏标记文件、恶意动态库、异常数据文件。&lt;/p&gt;
&lt;h3 id="48-认证面收敛避免自锁"&gt;4.8 认证面收敛（避免自锁）
&lt;/h3&gt;&lt;p&gt;发现 root 已泄露后，凭据轮换必须做，但不能为了「看起来更安全」直接关闭当前唯一的远程入口。&lt;/p&gt;
&lt;p&gt;本次策略：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;清空 root 的 authorized_keys&lt;/li&gt;
&lt;li&gt;隔离未确认但仍需使用的 SSH 密钥&lt;/li&gt;
&lt;li&gt;确认没有其他 uid=0 账户或异常用户的认证文件&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;暂时保留&lt;/strong&gt; root 密码登录，等待新管理员入口就绪后再关闭&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这是安全和可运维之间的必要取舍——没有替代入口时直接关闭 root 登录，只会把正常运维锁在外面。&lt;/p&gt;
&lt;h3 id="49-四层验证"&gt;4.9 四层验证
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;验证层次&lt;/th&gt;
 &lt;th&gt;检查内容&lt;/th&gt;
 &lt;th&gt;结论&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;配置层&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;nginx -t&lt;/code&gt;、&lt;code&gt;nginx -T&lt;/code&gt; 全量导出&lt;/td&gt;
 &lt;td&gt;✅ 无语法错误，无恶意 include&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;运行层&lt;/td&gt;
 &lt;td&gt;进程、端口、worker 映射库、内核日志&lt;/td&gt;
 &lt;td&gt;✅ 无崩溃，无异常动态库加载&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;业务层&lt;/td&gt;
 &lt;td&gt;移动端 UA / 桌面端 UA 访问核心页面&lt;/td&gt;
 &lt;td&gt;✅ 200 正常，无跳转&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;支付层&lt;/td&gt;
 &lt;td&gt;支付配置接口、支付回调日志&lt;/td&gt;
 &lt;td&gt;✅ 200 正常&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;只看服务状态 &lt;code&gt;active&lt;/code&gt; 不等于业务可用；只看页面返回 &lt;code&gt;200&lt;/code&gt; 也不等于木马已清理。必须四层同时验证。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="五处置措施总结"&gt;五、处置措施总结
&lt;/h2&gt;&lt;h3 id="已执行操作"&gt;已执行操作
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;将恶意 Lua 模块替换为 no-op 安全空壳&lt;/li&gt;
&lt;li&gt;将恶意 WAF 脚本替换为安全空壳&lt;/li&gt;
&lt;li&gt;移除 init.d 服务脚本中的恶意回灌逻辑&lt;/li&gt;
&lt;li&gt;移除 Nginx 全局配置中的异常 &lt;code&gt;lua_package_path&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;去除攻击者遗留在相关文件上的 &lt;code&gt;immutable&lt;/code&gt; 属性&lt;/li&gt;
&lt;li&gt;隔离隐藏标记文件、恶意动态库、异常数据文件&lt;/li&gt;
&lt;li&gt;清理 root 本机 SSH 私钥驻留&lt;/li&gt;
&lt;li&gt;归档完整事件证据并生成 SHA256 校验值&lt;/li&gt;
&lt;li&gt;恢复 Docker bridge 网关，修复支付反代超时问题&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="后续动作"&gt;后续动作
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;24 小时内：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;持续观察 Nginx 访问日志中的异常状态码&lt;/li&gt;
&lt;li&gt;持续观察内核日志中的 worker 崩溃&lt;/li&gt;
&lt;li&gt;观察支付链路的稳定性&lt;/li&gt;
&lt;li&gt;保存 CDN 安全事件和访问日志&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;1-3 天内：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;新建非 root 管理员用户并配置公钥&lt;/li&gt;
&lt;li&gt;验证新入口可用后，关闭 root 密码直接登录&lt;/li&gt;
&lt;li&gt;轮换面板密码、API key、部署密钥和数据库密码&lt;/li&gt;
&lt;li&gt;将关键日志外送或定时同步到异地&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;中期：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;评估系统重装和业务迁移窗口&lt;/li&gt;
&lt;li&gt;用干净系统重新部署服务栈&lt;/li&gt;
&lt;li&gt;只迁移业务数据，不迁移旧系统脚本和二进制&lt;/li&gt;
&lt;li&gt;建立上线后基线：端口清单、文件哈希、日志保留策略&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="六经验教训"&gt;六、经验教训
&lt;/h2&gt;&lt;h3 id="1-偶发跳转必须优先怀疑请求入口层"&gt;1. 偶发跳转必须优先怀疑请求入口层
&lt;/h3&gt;&lt;p&gt;移动端跳转博彩站、桌面端偶发正常——这是典型的&lt;strong&gt;按 UA 或比例触发的流量劫持&lt;/strong&gt;特征。不能只从前端缓存或应用路由找原因，必须第一时间查 Nginx 层的异常。&lt;/p&gt;
&lt;h3 id="2-cdn-520-可能是源站进程崩溃"&gt;2. CDN 520 可能是源站进程崩溃
&lt;/h3&gt;&lt;p&gt;CDN 的 520 错误表示源站连接异常。本次 520 与恶意 &lt;code&gt;.so&lt;/code&gt; 文件导致的 Nginx worker 进程崩溃直接相关。排查 CDN 错误时必须同时看源站内核日志和 worker 状态。&lt;/p&gt;
&lt;h3 id="3-单点删除木马不等于修复"&gt;3. 单点删除木马不等于修复
&lt;/h3&gt;&lt;p&gt;攻击者使用了：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;服务脚本持久化（重启复活）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;chattr +i&lt;/code&gt; 文件不可变属性（防删除）&lt;/li&gt;
&lt;li&gt;时间戳伪造（掩盖时间线）&lt;/li&gt;
&lt;li&gt;日志清洗（销毁证据）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;只替换一个恶意文件会留下重启复活的风险，必须深挖持久化链。&lt;/p&gt;
&lt;h3 id="4-证据保存必须早于清理"&gt;4. 证据保存必须早于清理
&lt;/h3&gt;&lt;p&gt;先打包证据、记录哈希、保留备份，再清理生产路径。否则后续无法解释完整的入侵链，也无法判断是否存在第二阶段攻击。&lt;/p&gt;
&lt;h3 id="5-安全加固不能盲目锁死"&gt;5. 安全加固不能盲目锁死
&lt;/h3&gt;&lt;p&gt;关闭 root 密码登录是正确方向，但前提是&lt;strong&gt;有可验证的新管理员入口&lt;/strong&gt;。没有替代入口就直接关闭，等于把自己也锁在门外。&lt;/p&gt;
&lt;h3 id="6-hids-是日志清洗后唯一的可信证据源"&gt;6. HIDS 是日志清洗后唯一的可信证据源
&lt;/h3&gt;&lt;p&gt;系统日志被清空后，HIDS 日志成为了唯一能证明入侵时间点和攻击行为的关键证据。后续必须保证 HIDS 日志异地存储，不能被同机攻击者一并清理。&lt;/p&gt;
&lt;h3 id="7-运行态问题要和入侵事件分层处理"&gt;7. 运行态问题要和入侵事件分层处理
&lt;/h3&gt;&lt;p&gt;本次排查中发现的支付反代超时问题，经分析是 Docker 网络配置问题，与 Lua 木马无关。应急响应中必须严格区分：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;安全事件（入侵、木马、持久化）&lt;/li&gt;
&lt;li&gt;运行态故障（网络、配置漂移、资源耗尽）&lt;/li&gt;
&lt;li&gt;业务 Bug（代码逻辑、支付流程）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;混为一谈会误导排查方向，浪费时间。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="七应急响应检查清单"&gt;七、应急响应检查清单
&lt;/h2&gt;&lt;p&gt;以下模板可直接复用于类似事件的排查：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mf"&gt;1.&lt;/span&gt; &lt;span class="err"&gt;复现用户侧异常&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;记录&lt;/span&gt; &lt;span class="n"&gt;UA&lt;/span&gt;&lt;span class="err"&gt;、&lt;/span&gt;&lt;span class="n"&gt;URL&lt;/span&gt;&lt;span class="err"&gt;、时间、响应码、跳转目标&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mf"&gt;2.&lt;/span&gt; &lt;span class="err"&gt;分层对比日志&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;CDN&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="n"&gt;Nginx&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="err"&gt;应用&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="err"&gt;系统日志，定位异常发生层级&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mf"&gt;3.&lt;/span&gt; &lt;span class="err"&gt;审计&lt;/span&gt; &lt;span class="n"&gt;Web&lt;/span&gt; &lt;span class="err"&gt;服务器配置&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;导出全量配置，检查&lt;/span&gt; &lt;span class="n"&gt;Lua&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;WAF&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;include&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;proxy&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;rewrite&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="err"&gt;动态模块&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mf"&gt;4.&lt;/span&gt; &lt;span class="err"&gt;搜索&lt;/span&gt; &lt;span class="n"&gt;IOC&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;关键词搜索，但不要在取证前删除任何文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mf"&gt;5.&lt;/span&gt; &lt;span class="err"&gt;取证归档&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;对可疑文件做&lt;/span&gt; &lt;span class="n"&gt;stat&lt;/span&gt;&lt;span class="err"&gt;、&lt;/span&gt;&lt;span class="n"&gt;lsattr&lt;/span&gt;&lt;span class="err"&gt;、&lt;/span&gt;&lt;span class="n"&gt;sha256sum&lt;/span&gt;&lt;span class="err"&gt;、备份归档&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mf"&gt;6.&lt;/span&gt; &lt;span class="err"&gt;检查持久化点&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="err"&gt;、&lt;/span&gt;&lt;span class="n"&gt;init&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="err"&gt;、&lt;/span&gt;&lt;span class="n"&gt;cron&lt;/span&gt;&lt;span class="err"&gt;、&lt;/span&gt;&lt;span class="n"&gt;profile&lt;/span&gt;&lt;span class="err"&gt;、&lt;/span&gt;&lt;span class="n"&gt;ld&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;so&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;preload&lt;/span&gt;&lt;span class="err"&gt;、&lt;/span&gt;&lt;span class="n"&gt;Docker&lt;/span&gt; &lt;span class="n"&gt;entrypoint&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mf"&gt;7.&lt;/span&gt; &lt;span class="err"&gt;检查认证面&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;uid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="err"&gt;账户、&lt;/span&gt;&lt;span class="n"&gt;authorized_keys&lt;/span&gt;&lt;span class="err"&gt;、私钥、面板用户、&lt;/span&gt;&lt;span class="n"&gt;API&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mf"&gt;8.&lt;/span&gt; &lt;span class="err"&gt;检查运行态&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;进程、端口、&lt;/span&gt;&lt;span class="n"&gt;worker&lt;/span&gt; &lt;span class="err"&gt;映射库、内核崩溃日志&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mf"&gt;9.&lt;/span&gt; &lt;span class="err"&gt;最小化清理&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;先切断活跃链路，再处理持久化机制和残留文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mf"&gt;10.&lt;/span&gt; &lt;span class="err"&gt;重新验证&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;配置层&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="err"&gt;运行层&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="err"&gt;业务层&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="err"&gt;支付层，四层全部验证&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mf"&gt;11.&lt;/span&gt; &lt;span class="err"&gt;归档与复盘&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;归档证据和哈希，记录回滚点与剩余风险&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="八判断边界"&gt;八、判断边界
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;可以确认的：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;存在已认证的 root SSH 入侵行为&lt;/li&gt;
&lt;li&gt;存在 Nginx 服务脚本级持久化机制&lt;/li&gt;
&lt;li&gt;移动端博彩跳转来自服务端 Nginx Lua 恶意模块&lt;/li&gt;
&lt;li&gt;恶意动态库与 Nginx worker 进程崩溃相关&lt;/li&gt;
&lt;li&gt;已知活跃链路已切断，已知残留已隔离&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;不能百分百确认的：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;最初 root 凭据是如何泄露的&lt;/li&gt;
&lt;li&gt;是否还存在未知 rootkit 或内核级隐藏组件&lt;/li&gt;
&lt;li&gt;不同时间点的两次操作是否完全同源&lt;/li&gt;
&lt;li&gt;不重装系统的情况下机器是否永远可信&lt;/li&gt;
&lt;/ul&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;因此后续安全策略不应停留在「已清理木马」，而应按「已发生 root 级入侵后的恢复流程」推进——最终闭环仍是重装系统、重建凭据、重新部署业务。&lt;/strong&gt;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;本文由真实应急响应案例脱敏整理，涉及域名、IP、路径等信息已做匿名化处理。&lt;/em&gt;&lt;/p&gt;</description></item><item><title>CVE-2026-33032：Nginx UI MCP 未授权访问漏洞详解 (CVSS 9.8)</title><link>https://blog.7qiang.com/posts/cve-2026-33032-nginx-ui-mcp-takeover/</link><pubDate>Fri, 17 Apr 2026 04:30:00 +0800</pubDate><guid>https://blog.7qiang.com/posts/cve-2026-33032-nginx-ui-mcp-takeover/</guid><description>&lt;img src="https://blog.7qiang.com/blog-cover-cyber-mask.gif" alt="Featured image of post CVE-2026-33032：Nginx UI MCP 未授权访问漏洞详解 (CVSS 9.8)" /&gt;&lt;p&gt;&lt;section class="xiaoyao-contact-card" aria-label="联系逍遥"&gt;
 &lt;img class="xiaoyao-contact-card__qr" src="https://blog.7qiang.com/contact-qr.png" width="690" height="690" loading="lazy" decoding="async" alt="逍遥微信二维码"&gt;
 &lt;div class="xiaoyao-contact-card__content"&gt;
 &lt;h3 class="xiaoyao-contact-card__title"&gt;联系逍遥&lt;/h3&gt;
 &lt;p class="xiaoyao-contact-card__description"&gt;扫码添加微信，或点击下方按钮复制联系方式。&lt;/p&gt;
 &lt;div class="xiaoyao-contact-buttons" data-contact-buttons&gt;
 &lt;button class="xiaoyao-contact-button xiaoyao-contact-button--wechat" type="button" data-copy-contact="plus6566" data-copy-label="微信号"&gt;
 &lt;span class="xiaoyao-contact-button__label"&gt;微信&lt;/span&gt;
 &lt;span class="xiaoyao-contact-button__value"&gt;plus6566&lt;/span&gt;
 &lt;span class="xiaoyao-contact-button__status" data-copy-status&gt;点击复制&lt;/span&gt;
 &lt;/button&gt;
 &lt;button class="xiaoyao-contact-button xiaoyao-contact-button--qq" type="button" data-copy-contact="826215906" data-copy-label="QQ 号"&gt;
 &lt;span class="xiaoyao-contact-button__label"&gt;QQ&lt;/span&gt;
 &lt;span class="xiaoyao-contact-button__value"&gt;826215906&lt;/span&gt;
 &lt;span class="xiaoyao-contact-button__status" data-copy-status&gt;点击复制&lt;/span&gt;
 &lt;/button&gt;
 &lt;span class="xiaoyao-contact-feedback" role="status" aria-live="polite"&gt;&lt;/span&gt;
&lt;/div&gt;

 &lt;/div&gt;
&lt;/section&gt;

进微信群请联系博主，各位觉得文章对你有帮助的话可否打赏一些呀~&lt;/p&gt;
&lt;hr&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;漏洞等级&lt;/strong&gt;: 🔴 CRITICAL (CVSS 9.8)
&lt;strong&gt;影响版本&lt;/strong&gt;: Nginx UI ≤ 2.3.5
&lt;strong&gt;CVE 编号&lt;/strong&gt;: CVE-2026-33032
&lt;strong&gt;CWE 编号&lt;/strong&gt;: CWE-306 (关键功能缺少认证)
&lt;strong&gt;披露日期&lt;/strong&gt;: 2026-03-30
&lt;strong&gt;最后更新&lt;/strong&gt;: 2026-04-16&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="漏洞概述"&gt;漏洞概述
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;CVE-2026-33032&lt;/strong&gt; 是 Nginx UI（Nginx 服务器的 Web 管理界面）中的一个&lt;strong&gt;严重未授权访问漏洞&lt;/strong&gt;。攻击者可以利用该漏洞在无需任何身份认证的情况下，通过 MCP (Model Context Protocol) 集成端点执行任意管理操作，包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;🔄 重启 Nginx 服务&lt;/li&gt;
&lt;li&gt;📝 创建/修改/删除 Nginx 配置文件&lt;/li&gt;
&lt;li&gt;⚡ 触发自动配置重载&lt;/li&gt;
&lt;li&gt;🎯 &lt;strong&gt;完全接管 Nginx 服务&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;该漏洞的 CVSS 3.1 基础评分为 &lt;strong&gt;9.8 (CRITICAL)&lt;/strong&gt;，攻击向量为网络 (AV:N)，攻击复杂度低 (AC:L)，无需权限 (PR:N)，无需用户交互 (UI:N)，对机密性、完整性、可用性均有高影响 (C:H/I:H/A:H)。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="漏洞原理"&gt;漏洞原理
&lt;/h2&gt;&lt;h3 id="问题根源"&gt;问题根源
&lt;/h3&gt;&lt;p&gt;Nginx UI 的 MCP 集成暴露了两个 HTTP 端点：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;端点&lt;/th&gt;
 &lt;th&gt;认证要求&lt;/th&gt;
 &lt;th&gt;状态&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;/mcp&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;IP 白名单 + AuthRequired() 中间件&lt;/td&gt;
 &lt;td&gt;✅ 安全&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;/mcp_message&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;仅 IP 白名单&lt;/td&gt;
 &lt;td&gt;❌ 存在漏洞&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="致命缺陷"&gt;致命缺陷
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;/mcp_message&lt;/code&gt; 端点的问题在于：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;仅应用 IP 白名单检查&lt;/strong&gt;，没有身份认证&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;默认 IP 白名单为空&lt;/strong&gt; (&lt;code&gt;[]&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;空白的 IP 白名单被中间件解释为 &lt;strong&gt;“允许所有 IP”&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这意味着任何能够访问 Nginx UI 的网络攻击者都可以：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;任意攻击者 → /mcp_message → 调用所有 MCP 工具 → 完全控制 Nginx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="代码层面分析"&gt;代码层面分析
&lt;/h3&gt;&lt;p&gt;根据 GitHub 安全公告 (GHSA-h6c2-x2m2-mwhf)，问题出在中间件配置上：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// /mcp 端点 - 正确配置
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/mcp&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ipWhitelistMiddleware&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;AuthRequired&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="nx"&gt;mcpHandler&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// /mcp_message 端点 - 错误配置
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/mcp_message&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ipWhitelistMiddleware&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;mcpHandler&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// ⚠️ 缺少 AuthRequired() 中间件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// ⚠️ 默认 ipWhitelist = [] 被解释为允许所有
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="影响范围"&gt;影响范围
&lt;/h2&gt;&lt;h3 id="受影响版本"&gt;受影响版本
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;软件&lt;/th&gt;
 &lt;th&gt;受影响版本&lt;/th&gt;
 &lt;th&gt;修复版本&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Nginx UI&lt;/td&gt;
 &lt;td&gt;≤ 2.3.5&lt;/td&gt;
 &lt;td&gt;暂无公开补丁&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="cpe-标识"&gt;CPE 标识
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cpe:2.3:a:nginxui:nginx_ui:*:*:*:*:*:*:*:* versions up to (including) 2.3.5
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="潜在影响"&gt;潜在影响
&lt;/h3&gt;&lt;p&gt;如果 Nginx UI 暴露在公网或不受信任的网络中，攻击者可以：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;服务中断&lt;/strong&gt;: 重启 Nginx 导致网站下线&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;配置篡改&lt;/strong&gt;: 修改 Nginx 配置植入恶意规则&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;反向代理滥用&lt;/strong&gt;: 配置反向代理进行流量劫持&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SSRF 攻击&lt;/strong&gt;: 利用 Nginx 的 proxy_pass 功能内网探测&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WebShell 部署&lt;/strong&gt;: 通过配置写入恶意脚本&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="漏洞复现"&gt;漏洞复现
&lt;/h2&gt;&lt;h3 id="环境准备"&gt;环境准备
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 安装受影响的 Nginx UI 版本&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run -d --name nginx-ui &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -p 8080:80 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -p 9000:9000 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 0xjacky/nginx-ui:2.3.5
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="检测步骤"&gt;检测步骤
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;步骤 1&lt;/strong&gt;: 确认 Nginx UI 可访问&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -I http://target-ip:9000/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# HTTP/1.1 200 OK 表示服务在线&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;步骤 2&lt;/strong&gt;: 测试 /mcp_message 端点&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -X POST http://target-ip:9000/mcp_message &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -H &lt;span class="s2"&gt;&amp;#34;Content-Type: application/json&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -d &lt;span class="s1"&gt;&amp;#39;{&amp;#34;method&amp;#34;:&amp;#34;tools/call&amp;#34;,&amp;#34;params&amp;#34;:{&amp;#34;name&amp;#34;:&amp;#34;nginx.restart&amp;#34;}}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;步骤 3&lt;/strong&gt;: 如果返回成功响应，说明存在漏洞&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;result&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;status&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;success&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;message&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Nginx restarted&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="攻击利用链"&gt;攻击利用链
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1. 信息收集
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └─→ 扫描 9000 端口 (默认 Nginx UI 端口)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2. 漏洞验证
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └─→ 访问 /mcp_message 端点测试未授权访问
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3. 权限提升
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └─→ 调用 MCP 工具读取/修改 Nginx 配置
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4. 持久化控制
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └─→ 修改配置植入后门或反向代理规则
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;5. 横向移动
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └─→ 利用 Nginx 作为跳板探测内网
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="临时缓解方案"&gt;临时缓解方案
&lt;/h2&gt;&lt;p&gt;⚠️ &lt;strong&gt;截至 2026-04-17，官方尚未发布修复补丁&lt;/strong&gt;。建议采取以下临时缓解措施：&lt;/p&gt;
&lt;h3 id="方案-1-网络隔离-推荐"&gt;方案 1: 网络隔离 (推荐)
&lt;/h3&gt;&lt;p&gt;将 Nginx UI 限制在内部网络访问：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 防火墙规则 (UFW 示例)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ufw deny 9000/tcp
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ufw allow from 10.0.0.0/8 to any port &lt;span class="m"&gt;9000&lt;/span&gt; proto tcp
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ufw allow from 192.168.0.0/16 to any port &lt;span class="m"&gt;9000&lt;/span&gt; proto tcp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="方案-2-nginx-反向代理认证"&gt;方案 2: Nginx 反向代理认证
&lt;/h3&gt;&lt;p&gt;在 Nginx UI 前部署认证层：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-nginx" data-lang="nginx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;nginx-ui.example.com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="s"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;auth_basic&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Nginx&lt;/span&gt; &lt;span class="s"&gt;UI&lt;/span&gt; &lt;span class="s"&gt;Admin&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;auth_basic_user_file&lt;/span&gt; &lt;span class="s"&gt;/etc/nginx/.htpasswd&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 仅允许受信任 IP 访问 MCP 端点
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="s"&gt;/mcp_message&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;allow&lt;/span&gt; &lt;span class="n"&gt;10.0.0.0&lt;/span&gt;&lt;span class="s"&gt;/8&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;allow&lt;/span&gt; &lt;span class="n"&gt;192.168.0.0&lt;/span&gt;&lt;span class="s"&gt;/16&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;deny&lt;/span&gt; &lt;span class="s"&gt;all&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_pass&lt;/span&gt; &lt;span class="s"&gt;http://127.0.0.1:9000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="方案-3-禁用-mcp-功能"&gt;方案 3: 禁用 MCP 功能
&lt;/h3&gt;&lt;p&gt;如果不需要 MCP 集成，可以在配置中禁用：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Nginx UI 配置文件&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;mcp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="方案-4-修改-ip-白名单"&gt;方案 4: 修改 IP 白名单
&lt;/h3&gt;&lt;p&gt;在 Nginx UI 配置中显式设置 IP 白名单：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;mcp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ip_whitelist&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="m"&gt;127.0.0.1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="m"&gt;10.0.0.1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 仅允许可信 IP&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="检测与监控"&gt;检测与监控
&lt;/h2&gt;&lt;h3 id="日志审计"&gt;日志审计
&lt;/h3&gt;&lt;p&gt;检查 Nginx UI 访问日志中的可疑请求：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 搜索 /mcp_message 端点访问&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;grep &lt;span class="s2"&gt;&amp;#34;/mcp_message&amp;#34;&lt;/span&gt; /var/log/nginx-ui/access.log
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 检测异常 POST 请求&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;grep &lt;span class="s2"&gt;&amp;#34;POST /mcp_message&amp;#34;&lt;/span&gt; /var/log/nginx-ui/access.log &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; awk &lt;span class="s1"&gt;&amp;#39;{print $1}&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sort &lt;span class="p"&gt;|&lt;/span&gt; uniq -c &lt;span class="p"&gt;|&lt;/span&gt; sort -rn
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="siem-规则"&gt;SIEM 规则
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Splunk 检测规则&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;index=nginx_ui&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;uri_path=&amp;#34;/mcp_message&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;http_method=POST&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;status=200&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;| stats count by src_ip, user_agent&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;| where count &amp;gt; 5&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="网络监控"&gt;网络监控
&lt;/h3&gt;&lt;p&gt;监控对 Nginx UI 端点的异常访问：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 使用 tcpdump 捕获可疑流量&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tcpdump -i eth0 &lt;span class="s1"&gt;&amp;#39;port 9000 and tcp[((tcp[12:1] &amp;amp; 0xf0) &amp;gt;&amp;gt; 2):4] = 0x504f5354&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 过滤 POST 请求&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="时间线"&gt;时间线
&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;日期&lt;/th&gt;
 &lt;th&gt;事件&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;2026-03-30&lt;/td&gt;
 &lt;td&gt;GitHub 收到漏洞报告，分配 CVE-2026-33032&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;2026-03-30&lt;/td&gt;
 &lt;td&gt;GitHub 发布安全公告 (GHSA-h6c2-x2m2-mwhf)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;2026-04-01&lt;/td&gt;
 &lt;td&gt;NIST NVD 收录该漏洞&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;2026-04-16&lt;/td&gt;
 &lt;td&gt;NVD 更新漏洞记录，添加参考链接&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;2026-04-17&lt;/td&gt;
 &lt;td&gt;暂无官方补丁发布&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="参考资源"&gt;参考资源
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://nvd.nist.gov/vuln/detail/CVE-2026-33032" target="_blank" rel="noopener"
 &gt;NVD CVE-2026-33032&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/0xJacky/nginx-ui/security/advisories/GHSA-h6c2-x2m2-mwhf" target="_blank" rel="noopener"
 &gt;GitHub 安全公告&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://websec.net/blog/cve-2026-33032-unauthenticated-nginx-ui-mcp-takeover-69e1200f9fceb1f3fbe9c47f" target="_blank" rel="noopener"
 &gt;WebSec 漏洞分析&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://cwe.mitre.org/data/definitions/306.html" target="_blank" rel="noopener"
 &gt;CWE-306: Missing Authentication for Critical Function&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/0xJacky/nginx-ui" target="_blank" rel="noopener"
 &gt;Nginx UI GitHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="总结"&gt;总结
&lt;/h2&gt;&lt;p&gt;CVE-2026-33032 是一个典型的&lt;strong&gt;认证缺失漏洞&lt;/strong&gt;，根源在于开发者错误地认为 IP 白名单可以替代身份认证。这个案例提醒我们：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;防御深度&lt;/strong&gt;: 单一安全措施（IP 白名单）不足以保护敏感功能&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;默认安全&lt;/strong&gt;: 默认配置应该是安全的（空名单应解释为&amp;quot;拒绝所有&amp;quot;）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;及时更新&lt;/strong&gt;: 使用 Nginx UI 的管理员应密切关注官方补丁发布&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;🔔 &lt;strong&gt;建议&lt;/strong&gt;: 如果你正在使用 Nginx UI ≤ 2.3.5，请立即实施上述缓解措施，并监控官方仓库获取补丁更新。&lt;/p&gt;</description></item></channel></rss>