01 漏洞描述
目录遍历,即利用路径回溯符“../”跳出程序本身的限制目录实现下载任意文件。
例如Web应用源码目录、Web应用配置文件、敏感的系统文(/etc/passwd、/etc/paswd)等。
一个正常的Web功能请求为http://www.test.com/lownload.php?file=test.php。
如果Web应用存在路径遍历漏洞,则入侵者可以构造以下请求服务器敏感文件:
http://www.test.com/lownload.php?file1=../../../../../../../../../../../../etc/passwd
02 审计要点
目录遍历漏洞发生的根本原因是系统自带查询功能,如果接收用户提交文件的目录地址数据,且服务端未有任何过滤就把目录下的文件列表发给用户,会造成目录遍历安全威胁。
当判断代码中是否存在目录遍历漏洞时,可从以下4点进行判断:
1、参数是否用户可控?是否直接拼接http请求数据?或者调用存储在数据库中的数据?
2、是否配置了全局过滤器,检查过滤器的配置,是否所有的目录查询请求都经过过滤器处理,过滤器的过滤规则是否符合安全要求?
3、是否判断了文件下载的权限?系统是否会对输入文件路径进行访问权限判断?
4、是否判断了文件下载路径,是否预先设置好文件白名单?对输入的特殊字符是否存在敏感字符过滤?
03 漏洞特征
当系统处理用户请求下载文件时,若允许让用户提交文件目录地址,把目录下的文件列表发给用户,会造成目录遍历安全威胁。
Java
String path = request.getParameter("path");
java.io.OutputStream os = response.getOutputStream();
java.io.FileInputStream fis = new java.io.FileInputStream(path);
byte[] b = new byte[1024];
int i = 0;
while ((i = fis.read(b)) > 0 ){
os.write(b, 0, i);
}
fis.close();
os.flush();
os.close();
上述代码根据用户提交的path,未经过安全校验,可直接从服务器上获取指定文件,展示给用户,导致了目录遍历漏洞。
PHP
<php
//Thepagewewishtodisplay
$file=$_GET['page'];
//Inputvalidation
$file=str_replace(array("http://","https://"),"",$file);
$file=str_replace(array("../","..\""),"",$file);
>
上述代码使用了str_replace函数,对page参数进行了一定的处理,将”http:// ”、”https://”、 ” ../”、”..\”替换为空字符,即删除。但这里可以利…/./…/./xampp/htdocs/dvwa/php.ini来绕过检测。
04 漏洞案例
String path = request.getParameter("path");
java.io.OutputStream os = response.getOutputStream();
java.io.FileInputStream fis = new java.io.FileInputStream(path);
byte[] b = new byte[1024];
int i = 0;
while ((i = fis.read(b)) > 0 ){
os.write(b, 0, i);
}
fis.close();
os.flush();
os.close();
如上述代码所示,用户提交的path,未经过安全校验,可直接从服务器上获取指定文件,展示给用户,导致了目录遍历漏洞。
漏洞验证示例如下:
http://127.0.0.1/resin-doc/viewfile/?file=index.jsp
05 修复方案
1、要下载的文件地址保存至数据库中。
2、文件路径保存至数据库,让用户提交文件对应ID下载文件。
3、用户下载文件之前需要进行权限判断。
4、文件放在web无法直接访问的目录下。
5、非必要情况下不提供目录遍历服务。
6、公开文件可放置在web应用程序下载目录中通过链接进行下载。
标签:审计,文件,遍历,..,详解,path,os,目录 From: https://blog.51cto.com/u_16170213/6547540