目录遍历

本文最后更新于:2023-06-25 16:18

前言

参考链接:

  • https://blog.csdn.net/angry_program/article/details/107855078
  • https://portswigger.net/web-security/file-path-traversal

目录遍历(穿越)(Directory traversal)是一个常见的 web 漏洞,在权限满足的情况下,攻击者可以利用该漏洞读取服务器上的文件,这可能包括应用程序代码和数据,后端系统的登录信息以及敏感的操作系统文件。在某些情况下,攻击者可能能够写入服务器上的任意文件,允许他们修改应用程序数据或行为,并最终完全控制服务器。

我觉得还有就是,服务端可能会对返回的内容进行限制,比如不是图片的内容在浏览器不解析,但是 burp 会以文本的形式将文件读取出来,从而将这种攻击方式得到了应用。

这个目录遍历,跟任意文件读取/下载我感觉是差不多的东西

漏洞原理

漏洞原理这部分我参考的是原文链接里面的内容

比如 web 需要显示一个商品的图像,在 HTML 代码中一般是通过相对路径的方式加载的,如:

1
<img src="/loadImage?filename=214.png">

使用filename参数加载图像,图片文件的位置可能映射在/var/www/images/路径上,所以真实路径是/var/www/images/214.png,要返回图像,应用程序将请求的文件名附加到此基本目录并使用文件系统API来读取文件的内容。在上述情况下,应用程序从以下文件路径读取:

1
/var/www/images/214.png

如果该应用程序没有针对目录遍历攻击实施任何防御措施,攻击者可以请求以下 URL 从服务器的文件系统中检索任意文件:

1
https://www.xxx.com/loadImage?file=../../../etc/passwd

前提当然是服务端有类似请求的参数,这种情况一般还是看网页的需求是不是这样加载图片。

filename 的参数值与真实路径结合起来就是:/var/www/images/../../../etc/passwd,其等价于/etc/passwd

在基于 Unix 的操作系统上,这是一个标准文件,其中包含在服务器上注册的用户的详细信息。

在 Windows 上,../..\都是有效的目录遍历序列,检索标准操作系统文件的等效攻击是:

1
https://insecure-website.com/loadImage?filename=..\..\..\windows\win.ini

示例

示例内容均来自 burp-lab。

Lab_1: File path traversal, simple case

在网站上的图片上【右键】-【复制图片链接】,将复制的链接复制到浏览器的搜索栏中,即可访问该图片。

我们可以看到参数为12.jpg,将其替换为../../../../etc/passwd。猜测 web 服务器的图片文件路径为/var/www/images,但只是猜测,我们可以多加几个../,在向上跳转到/目录后,后面的../就不再有效果了。

注意:不是变为12.jpg/../../../../etc/passwd,而是去掉12.jpg,因为在 Linux 系统中,如果命令是cat /var/www/images/12.jpg/../../../../etc/passwd,系统会提示cat xxxx: not directory,也就是说文件不能被包含在路径中(Windows 系统没有这个问题),应该是不同的操作系统的处理方式不一致导致的。

Lab_2: File path traversal, traversal sequences blocked with absolute path bypass

使用相同的方式获取图片链接,在filename参数后,将图片改为/etc/passwd,正如实验标题那样,只能使用绝对路径。

参考文章中说:“web 网站会采取目录遍历的防御措施,如过滤../上一级等关键字,简单的过滤通常会被绕过,有时可以直接采用绝对路径,无需../返回上一级目录进行遍历。”确实是这样。

Lab_3: File path traversal, traversal sequences stripped non-recursively

实验提示,在应用程序使用用户输入的文件名之前,会将路径遍历序列../去除,所以我们可以通过双写../的方式绕过。双写不是说连着写两遍../,而是在其中再加入一个变为..../,这样应用程序即使过滤了../,剩余的部分也会组成../,从而完成路径跳转的功能。

Lab_4: File path traversal, traversal sequences stripped with superfluous URL-decode

实验提示,在应用程序使用用户提供的路径前,会对路径进行url解码。这样的话,我们可以将目录遍历的内容进行 url 编码后再提交。

. => %2e / => %2f % => %25(双重 url 编码)

尝试仅对/进行 url 编码,失败。

尝试对../../../../etc/passwd进行编码,失败。

尝试对/进行 url 编码后=>%2f,再对%进行编码=>%252f,成功。

Lab_5: File path traversal, validation of start of path

实验提示,应用程序接收参数时,会验证提供的路径是否是从预期的文件夹开始。我们通过复制图片的链接发现,filename的值以/var/www/images/开头,所以我们可以在后面加上../进行目录跳转。

1
https://0a76009004f29df6c00d0ec0005b00e1.web-security-academy.net/image?filename=/var/www/images/56.jpg

56.jpg应去掉,原理同上。

Lab_6: File path traversal, validation of file extension with null byte bypass

实验提示:应用程序验证提供的文件名是否以预期的文件扩展名结束。我们通过之前的方式获取到图片链接,猜测这个实验应该是对 filename 的文件类型进行了限制,只有当作图片时才会解析。这时我们可以通过%00字符(空字节)进行截断。

尝试使用绝对路径的截断,失败。

使用../进行跳转并截断,成功。

总之,目录遍历漏洞不会仅限于一个绕过姿势,通常会配合多个姿势进行组合攻击。

防御

防止文件路径遍历漏洞的最有效方法是避免将用户提供的输入完全传递给文件系统API。如果认为不可避免的是将用户提供的输入传递给文件系统API,则应同时使用两层防御,以防止受到攻击:

  1. 应用程序应在处理之前验证用户输入。理想情况下,验证应与允许值的白名单进行比较。如果所需的功能无法做到这一点,则验证应验证输入内容仅包含允许的内容,例如纯字母数字字符。
  2. 验证提供的输入后,应用程序应将输入附加到基本目录,并使用平台文件系统API规范化路径。验证规范化路径以预期的基本目录开头。

下面是一些简单的 Java 代码示例,用于根据用户输入验证文件的规范路径:

1
2
3
4
File file = new File(BASE_DIRECTORY, userInput);
if (file.getCanonicalPath().startsWith(BASE_DIRECTORY)) {
// process file
}

系统敏感文件

从上面实验可知,目录遍历漏洞是可以读取系统敏感文件的,而系统敏感文件有很多,保不齐哪些就是有用的,用来做信息收集也不错。

Windows 敏感文件

1
2
3
4
5
6
7
8
C:\boot.ini	//查看系统版本
C:\Windows\System32\inetsrv\MetaBase.xml // IIS配置文件
C:\Windows\repair\sam //存储系统初次安装的密码
C:\Program Files\mysql\my.ini // Mysql配置
C:\Program Files\mysql\data\mysql\user.MYD // Mysql root
C:\Windows\php.ini // php配置信息
C:\Windows\my.ini // Mysql配置信息
C:\Windows\win.ini // Windows系统的一个基本系统配置文件

Linux 敏感文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/root/.ssh/authorized_keys
/root/.ssh/id_rsa
/root/.ssh/id_ras.keystore
/root/.ssh/known_hosts //记录每个访问计算机用户的公钥
/etc/passwd
/etc/shadow
/usr/local/app/php5/lib/php.ini //PHP配置文件
/etc/my.cnf //mysql配置文件
/etc/httpd/conf/httpd.conf //apache配置文件
/root/.bash_history //用户历史命令记录文件
/root/.mysql_history //mysql历史命令记录文件
/proc/mounts //记录系统挂载设备
/porc/config.gz //内核配置文件
/var/lib/mlocate/mlocate.db //全文件路径
/porc/self/cmdline //当前进程的cmdline参数

https://mp.weixin.qq.com/s/va0tzUQ-rRIV5uSoq_q4JA

偏方

.png cat ....

在其他参数上加负号


目录遍历
https://ahtoh.cn/2022/07/07/目录遍历/
作者
ahtoh
发布于
2022-07-07 21:18
许可协议