文末可下载本篇笔记
一、什么是目录遍历漏洞
目录遍历(路径遍历)是由于web服务器或者web应用程序对用户输入的文件名称的安全性验证不足导致的一种安全漏洞,使得攻击者通过利用一些特殊字符就可以绕过服务器的安全限制,访问任意的文件(可以是web根目录以外的文件),甚至执行系统命令。
二、目录遍历原理
程序在实现上没有充分过滤用户输入的../之类的目录跳转符,导致恶意用户可以通过提交目录跳转来遍历服务器上的任意文件。导致目录遍历的原因:
1、服务器配置不当造成
2、代码过滤不严谨
三、测试是否存在目录遍历
1、删除一个路径,查看是否可以查看到上一级目录的文件
如:127.0.0.1/upload/image/test.jpg ,我们可以将test.jpg去掉,查看是否可以查看到image目录
2、利用web漏洞扫描器进行扫描
3、利用搜索引擎挖掘
例如:使用谷歌语法搜索目标站点,目标站点:test.com
在谷歌搜索:site:test.com intitle:index of ,(根据实际情况,不一定是index)
4、利用../(目录跳转符)进行测试
例如:127.0.0.1/index.php/?Filepath=test.php
可以看到这里的参数Filepath,很显然这 就是文件路径的意思,那这里加上../观察页面的变化(典型特征:?file=content /?filename=xx.html /?filepath=xx.php /?dir= /?path=等等)
http://test.com/xx/xx/xx/test.php?Filepath=../../../xxx.jpg
漏洞利用如上,通常我们的手法是利用../一个一个地加,直到页面出现敏感信息。
四、目录遍历限制绕过方式
-
加密参数传递的数据
在Web应用程序对文件名进行加密之后再提交,比如:”/?filename=ZmFuLnBkZg==“,在参数filename用的是base64加密,而攻击者想要绕过,只需要将文件名加密后再提交即可。所以说,采用一些有规律或者轻易能识别的加密方式,也是存在风险的。
-
编码绕过
尝试使用不同的编码转换进行过滤性的绕过,比如:url编码,通过对参数进行url编码提交,/?filename=%66%61%6E%2E%70%64%66 来绕过
-
目录限定绕过
在有些Web应用程序是通过限定目录权限来分离的,当然这样的做法不值得推荐,攻击者可以通过某些特殊的符号”~“来绕过,例如:"/?filename=~/../image"。加入一个这样的符号,就可以直接跳转到硬盘目录下了。
-
绕过文件后缀过滤
一些Web应用程序在读取文件前,会对提交的文件后缀进行检测,攻击者可以在文件名后放一个空字节的编码,来绕过这样的文件类型的检查。例如:../../../../etc/passwd%00.jpg,(字符串中止字符)Web应用程序使用的Api会允许字符串中包含空字符,当实际获取文件名时,则由系统的Api会直接截断,从而解析成为../../../../etc/passwd。
在Linux系统中也可以使用URL编码的换行符,例如../../../etc/passwd%0a.jpg。(换行)如果文件系统在获取含有换行符的文件名,会截断为文件名,同样也可以使用%20,例如:../../../index.jsp%20(空格)
-
双写进行绕过,例如”/?filename=....//....//....//etc/passwd“
-
绕过来路验证
Http Referer:Http Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面过来的
注:在Windows中可以使用../ 也可以使用.. ,这都是有效的目录遍历,在Linux1中只可以使用../
五、靶场演示
BurpSuit官网演示
靶场地址:https://portswigger.net/web-security/file-path-traversal
目标:能够读取/etc/passwd/下的内容
第一关
打开靶场,然后抓包观察,看其是否有目录遍历的特征
发现有?filename=44.jpg,符合目录遍历的特征,那么可以将这个数据包发送到Repeater模块进行测试,并将44.jpg修改为/etc/passwd进行测试
发现并没有读取到,猜测是不在该目录下,使用../返回根目录
发现可以读取到/etc/passwd下的内容,至于向上退多少级,宜多不宜少,比如需要向上退3级,写四个../,写5个../都是可以的,但是要写一个是不行的。
第二关
同样打开抓包发现有目录遍历的特征,将其发送到Repeater模块进行测试,直接将其修改为filename=/etc/passwd 进行测试
可以读取到文件中的内容,考察的是绝对路径读取
第三关
同样打开抓包发现有目录遍历的特征,将其发送到Repeater模块进行测试,直接将其修改为filename=/etc/passwd 进行测试
同样使用第一关的相对路径,发现还是不可以,这一关其实是考察的双写绕过,他会将../进行过滤
**注:常见的双写绕过....//解释为../ ..../解释为.. **
第四关
同样打开抓包发现有目录遍历的特征,将其发送到Repeater模块进行测试,直接将其修改为filename=/etc/passwd 进行测试
用前几关的方式是无法进行绕过的,我们去尝试用URL编码进行一下绕过
发现还是不可以,那进行两次编码试一下,就是再将..%2F进行一次URL编码
这样的话可以实现绕过
当然也可以用burpsuit自带的Fuzz模糊测试,将抓到的数据包发送到Intruder模块中,将filename设置为变量
设置Payloads
点击开始进行测试
发现有一个成功的,然后可以将其选中,将探测点改为/etc/passwd
第五关
同样打开抓包发现有目录遍历的特征,将其发送到Repeater模块进行测试,直接将其修改为filename=/etc/passwd 进行测试,发现不可以绕过,我们也可以用前四关的方法同样去测试一下,还是不可以绕过
看下这个提示
应用程序可能要求用户提供的文件名以预期的基本文件夹开头,例如/var/www/images。在这种情况下,可能可以包含所需的基本文件夹,后跟适当的遍历序列。例如:filename=/var/www/images/../../../etc/passwd。
我们用其给的方法进行测试,发现可以绕过
第六关
这一关做了限制,他的末尾必须是要以.jpg结尾,所以需要用到截断
六、危害
1、读取的文件可能包括应用程序代码和数据、后端系统的凭据以及敏感的操作系统文件
2、在某些情况下,攻击者可能能够写入服务器上的任意文件,从而允许他们修改应用程序数据或行为,并最终完全控制服务器
3、未授权访问敏感信息
攻击者可以通过目录遍历漏洞访问系统上的敏感文件,如:
配置文件**:可能包含数据库连接信息、API密钥等。
密码文件**:如 /etc/passwd
和 /etc/shadow
(在Unix/Linux系统中),可能包含用户凭证。
日志文件**:可能包含敏感的操作记录和错误信息,帮助攻击者了解系统内部结构和运行状态。
4、信息泄露
通过读取敏感文件,攻击者可以获取到系统的内部信息,如:
服务器环境配置。
应用程序源代码和配置。
用户数据和交易记录。
5、权限提升
在某些情况下,攻击者可以通过读取系统文件来获取更高权限。例如:
-
读取包含凭证的文件,进行进一步的身份冒充。 -
获取到具有更高权限用户的凭证,从而提升攻击者的权限。
6、代码执行
如果攻击者能够访问包含脚本或代码文件的目录,可能会进一步利用这些文件进行恶意操作,例如:
-
修改服务器端脚本,注入恶意代码。 -
上传或修改文件,使服务器执行攻击者的代码。
7、破坏系统完整性
攻击者可能通过访问和修改关键文件来破坏系统的正常运行。例如:
-
修改配置文件,使系统服务崩溃或行为异常。 -
替换或篡改系统文件,影响系统的稳定性和安全性。
8、服务中断
访问和修改某些关键文件可能导致服务中断或系统崩溃,例如:
删除或修改系统的配置文件。
破坏应用程序依赖的文件,导致应用程序无法正常运行。
七、防御措施
为了防止目录遍历漏洞,需要采取以下防御措施:
-
输入验证和清理: -
严格验证用户输入,移除或拒绝任何包含 ../
或其他路径遍历字符的输入。 -
使用正则表达式或其他方法限制输入仅包含合法字符和路径。 -
路径标准化: -
在处理路径之前,将路径标准化(规范化),移除冗余的目录遍历字符。 -
确保规范化后的路径仍在允许访问的目录范围内。 -
使用基于白名单的方法: -
仅允许访问特定目录中的文件,通过白名单限制文件访问。 -
最小权限原则: -
限制应用程序的权限,使其只能访问必要的文件和目录。 -
使用沙箱环境隔离应用程序,防止其访问系统的敏感文件。 -
定期安全测试: -
定期进行安全测试和代码审计,发现并修复潜在的目录遍历漏洞。
通过实施这些措施,可以有效降低目录遍历漏洞的风险,保护系统的安全性和完整性。
原文始发于微信公众号(星光安全):目录遍历(Directory Traversal)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论