目录遍历

先上一张图看看什么是目录遍历漏洞。


对,目录遍历就长成这样子

一般遇到目录遍历漏洞,我们常做的就是去寻找有价值的东西去下载,比如数据库


一般是没有index.php就可能出现像这样的一个目录遍历的漏洞,但是一般情况下index文件都会有的。

那么怎么去找目录遍历漏洞,一般是输入到文件目录,看页面响应,

比如站点上的一张图片的的连接为:http://192.168.24.190/Images/185_01.jpg

我们把图片删除,只保留目录:http://192.168.24.190/Images/

浏览器看看


那这样子就是存在目录遍历漏洞。


一. 什么是目录遍历漏洞

目录遍历(路径遍历)是由于web服务器或者web应用程序对用户输入的文件名称的安全性验证不足而导致的一种安全漏洞,使得攻击者通过利用一些特殊字符就可以绕过服务器的安全限制,访问任意的文件(可以使web根目录以外的文件),甚至执行系统命令。

二. 目录遍历漏洞原理

程序在实现上没有充分过滤用户输入的…/之类的目录跳转符,导致恶意用户可以通过提交目录跳转来遍历服务器上的任意文件。

三. 目录遍历漏洞实例

读取文件的url:

http://www.test.com/my.jsp?file=abc.html

恶意url:

http://www.test.com/my.jsp?file=../../Windows.system.ini

四. 目录遍历漏洞的防御

1.对用户的输入进行验证,特别是路径替代字符“…/”

2.尽可能采用白名单的形式,验证所有输入

3.合理配置web服务器的目录权限

4.程序出错时,不要显示内部相关细节

五.出现场景

出现在文件读取或者展示图片等对文件读取交互的功能块。

六、漏洞实例

(1)利用Web应用代码进行目录遍历攻击的实例

在包含动态页面的Web应用中,输入往往是通过GET或是POST的请求方法从浏览器获得,以下是一个GET的Http URL请求示例:

http://test.webarticles.com/show.asp?view=oldarchive.html

利用这个URL,浏览器向服务器发送了对动态页面show.asp的请求,并且伴有值为oldarchive.html的view参数,当请求 在Web服务器端执行时,show.asp会从服务器的文件系统中取得oldarchive.html文件,并将其返回给客户端的浏览器,那么攻击者就可 以假定show.asp能够从文件系统中获取文件并编制如下的URL:

http://test.webarticles.com/show.asp?view=../../../../../Windows/system.ini

那么,这就能够从文件系统中获取system.ini文件并返回给用户,…/的含义这里就不用多说了,相信大家都会明白。攻击者不得不去猜测需要往上多少层才能找到Windows目录,但可想而知,这其实并不困难,经过若干次的尝试后总会找到的。

(2)利用Web服务器进行目录遍历攻击的实例:

除了Web应用的代码以外,Web服务器本身也有可能无法抵御目录遍历攻击。这有可能存在于Web服务器软件或是一些存放在服务器上的示例脚本中。

在最近的Web服务器软件中,这个问题已经得到了解决,但是在网上的很多Web服务器仍然使用着老版本的IIS和Apache,而它们则可能仍然无法抵御这类攻击。即使你使用了已经解决了这个漏洞的版本的Web服务器软件,你仍然可能会有一些对黑客来说是很明显的存有敏感缺省脚本的目录。

例如,如下的一个URL请求,它使用了IIS的脚本目录来移动目录并执行指令:http://server.com/scripts/..\../Windows/System32/cmd.exe?/c+dir+c:\

这个请求会返回C:\目录下所有文件的列表,它使通过调用cmd.exe然后再用dir c:\来实现的,%5c是web服务器的转换符,用来代表一些常见字符,这里表示的是“\”

新版本的Web服务器软件会检查这些转换符并限制它们通过,但对于一些老版本的服务器软件仍然存在这个问题。

如何判断是否存在目录遍历漏洞?

最好的方式就是使用Web漏洞扫描器,Web漏洞扫描器能够遍历你Web站点的所有目录以判断是否存在目录遍历漏洞,如果有它会报告该漏洞并给出解决的方法,除了目录遍历漏洞以外,Web应用扫描还能检查SQL注入、跨站点脚本攻击以及其他的漏洞。


路径遍历漏洞隐藏一般在文件读取或者展示图片功能块这样的通过参数提交上来的文件名


在Java中,目录遍历验证通常是为了安全地访问文件系统,防止恶意用户尝试访问不应他们访问的文件。这种验证通常涉及到以下几个步骤: 1. 使用`java.io.File`类:这个类提供了一系列方法,如`list()`、`listFiles()`等,用于获取指定路径下的文件和子目录。 2. 使用绝对路径和相对路径:确保只遍历预期的目录结构,避免通配符或其他可能导致无限递归的路径。 3. 权限控制:通过`FilePermission`或`PathPermission`来进行细粒度的权限检查,确保只有拥有相应权限的应用程序才能访问某些文件。 4. 避免循环引用:当遍历目录树时,检查并避免陷入循环,比如某个子目录反复包含自身。 5. 输入验证:如果从用户输入或网络获取路径,务必进行适当的清理和转义,以防止恶意用户构造恶意路径。 6. 使用`Files.walk()`:这是一个递归方法,可以方便地处理目录遍历,并能提供一种更现代的方式进行路径和权限的管理。 ```java import java.io.File; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; public void traverseDirectory(String directoryPath) { try (Stream<Path> paths = Files.walk(Paths.get(directoryPath))) { paths.forEach(path -> { if (!path.toFile().isDirectory()) { // 检查是否是文件而不是目录 checkPermissions(path); // 自定义的权限检查函数 } }); } catch (IOException e) { System.err.println("Error traversing directory: " + e.getMessage()); } } private void checkPermissions(Path path) { // 实现具体的权限检查逻辑,例如使用Files.isReadable(path, standardUserContext) } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值