1. 漏洞背景与原理剖析
uWSGI作为一款高性能的Web服务器网关接口,在Python、PHP等语言环境中被广泛使用。2018年曝光的CVE-2018-7490漏洞,本质上是一个典型的路径规范化缺陷。当PHP插件处理用户请求时,未能正确校验DOCUMENT_ROOT的边界,导致攻击者可以通过构造特殊的路径序列突破目录限制。
这个漏洞的有趣之处在于其利用方式——使用..%2f(即URL编码后的../)实现目录回溯。就像现实中的"穿墙术",攻击者通过连续叠加这种特殊字符,可以像爬楼梯一样逐级突破目录限制。我在实际测试中发现,大多数情况下需要至少两个..%2f才能跳出Web根目录。
漏洞影响范围明确限定在uWSGI 2.0.17之前的版本,但值得注意的是,很多容器化部署的环境由于使用基础镜像的滞后性,即使在新版本发布后仍然存在风险。这提醒我们:版本号只是表面,真正的安全在于完整的依赖链管理。
2. 靶场环境搭建与初步探测
在Vulfocus靶场中复现这个漏洞时,首先需要获取目标地址。启动靶机后通常会得到类似http://123.58.224.8:31858的访问入口。这里有个实用技巧:建议先用curl进行初步探测,比浏览器更直观:
curl -v "http://123.58.224.8:31858"通过响应头可以确认服务器类型和uWSGI版本信息。我习惯先检查几个关键点:
- 是否存在
uWSGI标识头 - 是否有
PHP相关字段 - 默认页面是否暴露框架特征
确认环境符合条件后,就可以尝试基础payload了。原始文章直接跳到了/etc/passwd读取,但实际测试中我建议分步骤验证:
- 先测试单层穿越:
/..%2fREADME.md - 尝试跳出web目录:
/..%2f..%2f/etc/passwd - 验证写入能力(如果可能):
/..%2f..%2f/tmp/test
3. 深度利用与路径探测技巧
当基础payload生效后,真正的挑战才开始。就像我去年在内部红队演练时遇到的场景:明明能读到/etc/passwd,却找不到flag文件。这时候需要系统性的路径探测方法:
3.1 敏感文件字典攻击
准备一个包含常见路径的字典文件,用Burp Suite的Intruder模块批量测试:
/etc/shadow /root/.bash_history /var/www/html/config.php /tmp/flag3.2 路径智能猜测
当遇到"Not Found"时,不要轻易放弃。我总结了几种思路:
- 版本特征匹配:通过
/proc/version获取系统信息,推测路径规范 - 环境变量检查:尝试读取
/proc/self/environ - 进程列表分析:
/proc/self/cmdline可能暴露工作目录
3.3 靶场特性利用
Vulfocus靶场往往会有意设置障碍,这时需要:
- 仔细检查首页HTML源码,可能有注释线索
- 尝试非常规路径如
/uploads/..%2f..%2fflag - 使用靶场自带的搜索功能(如文中提到的flag搜索)
4. 防御方案与实战思考
升级uWSGI固然是最直接的解决方案,但在企业环境中还需要纵深防御:
- 容器层面:使用只读文件系统(read-only rootfs)
- Web配置:设置
php.ini中的open_basedir限制 - 网络层:WAF规则应拦截异常的
%2f序列
在最近一次客户渗透测试中,我发现即使打了补丁的系统,如果配置不当仍然可能通过..%252f(双重编码)绕过防护。这提醒我们:安全是一个持续的过程,不是一次性的修补。
最后分享一个实用技巧:在Vulfocus这类CTF环境中,当所有常规方法都失效时,不妨试试/proc/self/cwd/flag——有些题目会把flag放在当前工作目录。这种思路转换往往能打开新局面。