目录
一、目录遍历
1、意义
二、通过目录遍历阅读任意文件
1、示例
实验1:文件路径遍历(简单)
三、利用文件路径遍历漏洞的常见障碍
1、对于../等的限制
实验2:文件路径遍历(用绝对路径旁路阻止遍历序列)
2、嵌套遍历序列
实验3:文件路径遍历(非递归地剥离遍历序列)
3、编码绕过
实验4:文件路径遍历(用多余的URL解码剥离遍历序列)
4、基文件夹开头
实验5:文件路径遍历(验证路径起始)
5、文件扩展名固定
实验6:文件路径遍历(空字节旁路验证文件扩展名)
四、如何防止目录遍历攻击
一、目录遍历
1、意义
1、目录遍历(也称为文件路径遍历)是一个Web安全漏洞,使得攻击者能够读取运行应用程序的服务器上的任意文件(包括应用程序代码和数据、后端系统的凭据以及敏感的操作系统文件)
——
2、在某些情况下,攻击者可能能够写入服务器上的任意文件,从而允许他们修改应用程序数据或行为,并最终完全控制服务器
二、通过目录遍历阅读任意文件
1、示例
1、销售商品图像的购物应用程序: 图像通过HTML加载,如 <img src="/loadImage?filename=218.png"> 该loadImage图像URL采用filename参数并返回指定文件的内容 映像文件本身存储在磁盘上的位置/var/www/images/。为返回映像,应用程序将请求的文件名附加到此基目录,并使用文件系统API读取文件的内容。 文件路径:/var/www/images/218.png
2、攻击者: 如果应用程序未对目录遍历进行防御,请求以下URL,从服务器的文件系统中检索任意文件: https://insecure-website.com/loadImage?filename=../../../etc/passwd 这将导致应用程序从以下文件路径读取: /var/www/images/../../../etc/passwd (../表示向上一级目录) Unix的操作系统上: ../ Windows: ../ and ..\ 都是有效的目录遍历序列 系统文件: https://insecure-website.com/loadImage?filename=..\..\..\windows\win.ini
涉及实验:
实验1:文件路径遍历(简单)
实验1:文件路径遍历(简单)
信息:
需要我们检索/etc/passwd的内容
part1:
随便点开一个博客
(同时抓包)
第三个数据包就带有filename参数进行检索内容,修改filename参数
part2:
发送到repeater进行分析
../../../etc/passwd
检索出了密码
在拦截的数据包中修改后取消拦截
三、利用文件路径遍历漏洞的常见障碍
1、对于../等的限制
1、将用户输入放置到文件路径中的应用程序实现了某种类型的防御路径遍历攻击,而这些攻击通常可以被绕过
————
2、如果应用程序从用户提供的文件名中剥离或阻止目录遍历序列,那么就有可能使用各种技术绕过防御
如,使用文件系统根目录的绝对路径(filename=/etc/passwd)直接引用文件,而不使用任何遍历序列。
————
涉及实验:
实验2:文件路径遍历(用绝对路径旁路阻止遍历序列)
实验2:文件路径遍历(用绝对路径旁路阻止遍历序列)
信息:
绝对路径/etc/passwd
part1:
点击一个博客
第三个数据包的filename参数
part2:
发到repeater
题目提示的绝对路径/etc/passwd
账号密码回显
修改数据包,并关闭拦截
2、嵌套遍历序列
如....// or ....\/ ,当内部序列被剥离时(过滤一遍),它将恢复为简单的遍历序列
————
涉及实验:
实验3:文件路径遍历(非递归地剥离遍历序列)
实验3:文件路径遍历(非递归地剥离遍历序列)
信息:
还是告诉了/etc/passwd
part1:
拦截到第三个数据包
part2:
发送到repeater
使用嵌套遍历....//....//....//etc/passwd
数据包修改,并关闭拦截
3、编码绕过
1、除去遍历序列:在某些上下文中,如在URL路径或filename的参数multipart/form-data请求时,Web服务器可能会在将输入传递到应用程序之前去除任何目录遍历序列。
2、编码绕过:有时可以通过URL编码或甚至双URL编码来绕过这种清理,../ 字符,一次编码%2e%2e%2f、二次编码%252e%252e%252f。各种非标准编码,如..%c0%af或..%ef%bc%8f,也可能起到作用
3、工具:BP Intruder提供了一个预定义的负载列表(将GitHub或自己收集的特殊编码导入,观察哪些可以使用),其中包含各种可供尝试的编码路径遍历序列。
涉及实验:
实验4:文件路径遍历(用多余的URL解码剥离遍历序列)
实验4:文件路径遍历(用多余的URL解码剥离遍历序列)
信息:
还是告诉了/etc/passwd
part1:
拦截到第三个数据包
part2:
发送到repeater
URL编码一次
URL编码二次
使用编码绕过..%252f..%252f..%252fetc/passwd
数据包修改,并关闭拦截
4、基文件夹开头
要求用户提供的文件名必须以预期的基文件夹开头
如,/var/www/images
需要包括基本文件夹,加上遍历序列:
filename=/var/www/images/../../../etc/passwd
涉及实验:
实验5:文件路径遍历(验证路径起始)
实验5:文件路径遍历(验证路径起始)
信息:
还是告诉了/etc/passwd
part1:
拦截到第四个数据包
part2:
发送到repeater
带基路径的遍历/var/www/images/../../../etc/passwd
数据包修改,并关闭拦截
5、文件扩展名固定
应用程序要求用户提供的文件名必须以预期的文件扩展名(如.png)结尾,则可以使用空字节在所需扩展名之前有效地终止文件路径,如
filename=../../../etc/passwd%00.png(实战中可能得考虑更多办法,如在hex中改为%0a换行截断等方法)
涉及实验:
实验6:文件路径遍历(空字节旁路验证文件扩展名)
实验6:文件路径遍历(空字节旁路验证文件扩展名)
信息:
还是告诉了/etc/passwd
part1:
拦截到第三个数据包
part2:
发送到repeater
直接上路径,可能没什么有用报错信息
就得结合场景自己尝试了(原文件为图片,就可能会检测后缀,如果是上传,就可能还会检测文件类型了)
带上图片的后缀,并空字节截断后缀
../../../etc/passwd%00.png
数据包修改,并关闭拦截
四、如何防止目录遍历攻击
1、防止文件路径遍历漏洞的最有效方法是完全避免将用户提供的输入传递给文件系统API。许多执行此操作的应用程序函数可以重写,以便以更安全的方式提供相同的行为。
2、如果认为将用户提供的输入传递给文件系统API是不可避免的,那么应该同时使用两层防御来防止攻击:
————
(2)白名单(输入前):应用程序应该在处理用户输入之前对其进行验证。理想情况下,验证应该与允许值的白名单进行比较。如果对于所需的功能来说这是不可能的,那么验证应该验证输入是否只包含允许的内容,比如纯字母数字字符。
————
(2)符合路径规范(输入后):验证提供的输入后,应用程序应将输入附加到基目录,并使用平台文件系统API规范化路径。应用程序应验证规范化路径是否从预期的基目录开始。