代码审计——目录遍历详解

简介: 代码审计——目录遍历详解

01 漏洞描述



目录遍历,即利用路径回溯符“../”跳出程序本身的限制目录实现下载任意文件。

例如Web应用源码目录、Web应用配置文件、敏感的系统文(/etc/passwd、/etc/paswd)等。

一个正常的Web功能请求

如果Web应用存在路径遍历漏洞,则攻击者可以构造以下请求服务器敏感文件


image.png


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 漏洞案例

image.png

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
image.png

05 修复方案


1、要下载的文件地址保存至数据库中。

2、文件路径保存至数据库,让用户提交文件对应ID下载文件。

3、用户下载文件之前需要进行权限判断。

4、文件放在web无法直接访问的目录下。

5、非必要情况下不提供目录遍历服务。

6、公开文件可放置在web应用程序下载目录中通过链接进行下载。

目录
相关文章
|
6月前
|
API 开发工具 开发者
HarmonyOS NEXT实战:拨打电话
本课程介绍如何在HarmonyOS SDK中使用Telephony Kit实现拨打电话功能。通过CallPhoneDemoPage示例,讲解如何输入电话号码并调用makeCall接口拨号,涉及call模块的使用及设备通话能力检测。
7949 0
|
Ubuntu Linux 虚拟化
LinuxUbuntu安装VMware tools Segmentation fault (core dumped)怎么解决
更新操作系统和内核:使用apt-get或apt命令更新你的Ubuntu操作系统和内核。运行以下命令更新软件包:
2146 0
|
SQL 微服务
成功解决 :status 500 reading CouponFeignService#saveSpuBounds(SpuBoundTo)
这篇文章讲述了作者在微服务项目开发中遇到的一个具体问题:使用Feign进行远程服务调用时出现了`status 500`错误。文章详细描述了排查过程,包括检查Feign配置和被调用服务的日志信息,最终确定问题是由于Lombok插件的`@Data`注解导致。作者通过将`@Data`注解注释掉并手动生成get、set方法解决了问题,并提供了成功调用远程服务后的截图。
成功解决 :status 500 reading CouponFeignService#saveSpuBounds(SpuBoundTo)
|
供应链 监控 Java
【开题报告】基于SpringBoot的药店药品管理系统的设计与实现
【开题报告】基于SpringBoot的药店药品管理系统的设计与实现
1298 0
|
存储
[ACTF新生赛2020]easyre 题解
[ACTF新生赛2020]easyre 题解
1105 0
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的驾校信息管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的驾校信息管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
292 1
|
存储 前端开发 JavaScript
反射型 XSS 攻击演示(附链接)
反射型 XSS 攻击演示(附链接)
通过二进制头识别文件类型
通过二进制头识别文件类型,可以使用UE或者WinHex软件打开 1.JPEG/JPG - 文件头标识 (2 bytes): $ff, $d8 (SOI) (JPEG文件标识)  - 文件结束标识 (2 bytes): $ff, $d9 (EOI)  2.
2438 0
|
机器学习/深度学习 算法 前端开发
【机器学习基础】机器学习的模型评估(评估方法及性能度量原理及主要公式)
【机器学习基础】机器学习的模型评估(评估方法及性能度量原理及主要公式)
1812 0
|
Web App开发
记一次burp抓包出错排查
记一次burp抓包出错排查
968 0