路径穿越基础介绍

你的 web 服务器不过是我的文件管理器罢了 :-\

1 什么是路径穿越

路径穿越,path-traversal,也称为路径遍历、目录穿越/遍历(directory traversal),是一种能让攻击者通过使用一些类似 ../目录控制序列访问 web 服务器上任意文件的安全漏洞。

任意文件主要包括:

  • 程序源码和数据
  • 服务端证书
  • 敏感的系统文件,/etc/passwd

path-traversal 被 OWASP 收录的 Broken Access Control(BAC,越权访问)一栏,BAC 可是 OWASP Top 10 2021 版中的 No.1 哦。

2 测试方法

寻找路径穿越漏洞分两步:

  1. 输入向量枚举,定位注入点。
  2. 测试,绕过

2.1 不同OS的敏感文件位置

需要了解 web app 服务端的架构、操作系统及其文件管理方式,就算存在路径穿越但你不知道你想要的文件放哪就尴尬了。

  • Unix-like OS:
    • root directory: /
    • directory separator: /
    • 网站根目录:/var/www/, /var/www/images/
    • 常用 payload: ../../../etc/passwd
  • Windows OS:
    • root directory: <drive letter>:
    • directory separator: \ or /

2.2 举个栗子

以 PortSwigger Labs 中的一个简单例子进行说明:

开启 burp 再打开一个页面。

观察 HTTP history,找到一个 GET 图片文件的请求,这里可能存在路径穿越。(一堆 google 自动发的包,裂开

这里能直接看到一个访问请求,我就不枚举用户输入向量了,一般情况要要测试用户所有可能的输入向量,包括 GET 和 POST 等请求。

网页源码里面也能看到。

发送到 Repeater 重放,测试。

得到的响应报文如下,可以看到已经拿到了 /etc/passwd 的内容了。

3 常规防御与绕过

3.1 使用绝对路径

删掉所有目录遍历序列,如 ../no case, no learning

1
filename=/etc/passwd

3.2 双写绕过

仅将 ../ 替换为空,未对替换处理后的 filename 进行二次检查(non-recursively) no case, no learning

1
filename=....//..././..././etc/passwd

3.3 编码绕过

先放一个好用的编码工具:CyberChef

3.3.1 URL 编码 与 double URL 编码

../..\ 各个部分url 编码的排列组合,我简单列几个。

  • %2E%2E%2F –> ../
  • %2E%2E/ –> ../
  • ..%2F –> ../
  • %252E%252E%252F
  • ..%5C –> ..\
  • %2E%2E%5C –> ..\
  • %252E%252E%255C –> ..\

3.3.2 unicode 编码

  • \u002E\u002E\u002F –> ../
  • \u002E\u002E\u005C –> ..\

3.3.3 其他非标准编码

  • ..%c0%af
  • ..%ef%bc%8f

3.4 其他绕过方式

3.4.1 %00 截断

某些情况下 web app 会验证文件的扩展名,如必须以 .png 结尾等。如果简单构造 filename=../../../etc/passwd.png 显然无法拿到我们想要的文件。

而截断机制既能绕过输入有效性验证,又能在解析文件时拿到我们想要的文件。 no case, no learning

%00 截断:

1
filename=../../../etc/passwd%00.jpg

#todo

  • 调研其他截断机制?

3.4.2 必须包含某些路径

有些 web app 要求文件名中必须包含某些特定的目录 (base folder),这时我们仍可以使用 ../ 拿到我们想要的内容。no case, no learning

1
filename=/var/www/images/../../../etc/passwd

#todo

  • 汇总常见 Payload

4 防御手段

最有效的防御方法就是缩小攻击面,典型的例子:中国防火墙 Great Firewall。对于路径穿越的防御也同样适用,避免用户与 filesystem APIs 交互能有效减少路径穿越攻击的风险。

但大部分情况下无法避免用户提供的输入与 filesystem APIs 交互,防御方法如下:

  1. 使用白名单用户输入进行验证与过滤
  2. 使用当前操作系统路径规范化函数规范化路径后,进行过滤,最后再进行相关调用

5 工具

说实话感觉这玩意手动测试的话也太麻烦了。

一些常用的工具:

常回来看看:

6 参考链接