目录穿越初探

7erry

我们在命令行中常常以./指代当前目录,../指代当前目录的父目录。而如果有这样一个程序

1
2
3
4
$path = $_GET['path'];
$cmd = "dir ./".$path;
echo $cmd;
exec($cmd);

正常情况下它的功能是显示并执行组合出来的执行,展示当前目录下与用户输入的目录名同名的目录内容,而如果我们输入了../这样的路径,则会显示出当前目录父目录的内容,更进一步的,通过多个../的组合,我们可以切换到根目录,而既然到了根目录,我们也就能到达所有目录,访问到一些开发者不希望用户访问的资源,例如可能一个站点上的文件7erry.com/image.png 实际映射到了服务器上的/var/www/images/image.png,而我们可以把文件路径修改为../../../etc/passwd,与真实路径组合后为/var/www/images/../../../etc/passwd等价于/etc/passwd,进而实现目录穿越的效果。有些时候甚至可以直接使用绝对路径进而
总结一下,目录穿越(也被称为目录遍历/directory traversal/path traversal)是通过使用 ../ 等目录控制序列或者文件的绝对路径来访问存储在文件系统上的任意文件和目录,特别是应用程序源代码、配置文件、重要的系统文件等。

攻击Payload

URL参数

  • ../
  • ..\
  • ..;/

在Unix操作系统上,../ 是一个标准的返回上一级路径的语法;
在Windows操作系统上, ../ 和 ..\ 都是返回上一级的语句。

Nginx Off by Slash

https://vuln.site.com/files../

UNC Bypass

\\localhost\c$\windows\win.ini

过滤绕过

双写绕过

....//

URL编码

16位Unicode

\u002e

超长UTF-8

\%e0%40%ae

防御

在进行文件操作相关的API前,应该对用户输入做过滤。较强的规则下可以使用白名单,仅允许纯字母或数字字符等。

若规则允许的字符较多,最好使用当前操作系统路径规范化函数规范化路径后,进行过滤,最后再进行相关调用。

Reference

Directory traversal by portswigger
Path Traversal by OWASP
path normalization
Breaking Parser Logic: Take Your Path Normalization Off and Pop 0days Out defcon

  • Title: 目录穿越初探
  • Author: 7erry
  • Created at : 2023-08-17 00:00:00
  • Updated at : 2023-08-17 00:00:00
  • Link: http://7erry.com/2023/08/17/目录穿越初探/
  • License: This work is licensed under CC BY-NC 4.0.