一、目录穿越漏洞

1、什么是目录穿越

  所谓的目录穿越指利用操作系统中的文件系统对目录的表示。在文件系统路径中,".."表示上一级目录,当你使用"../"时,你正在引用当前目录的上一级目录。如果你使用"../../",你实际上在两次".."的基础上,再次引用上一级目录,从而返回到上两级目录。

  例子:假设你目前所在目录为:C:\Windows\System32\drivers\etc

  • 使用"../" 一次返回上一级目录,即:C:\Windows\System32\drivers
  • 使用"../../" 一次返回上一级目录,即:C:\Windows\System32

  这是因为在文件系统路径中,每个".."都表示回到上一级目录。所以多个连续的".."会连续返回到更高级别的目录。然而在漏洞利用中Windows和Linux系统会有区别,后续漏洞利用中会提到。

2、目录穿越漏洞成因

  目录穿越漏洞,也叫做目录遍历/路径遍历漏洞。常发生于文件上传,文件下载,文件下载等处。由于后端直接接收前端传过来的文件名或路径,没有对其进行检测与过滤,导致攻击者利用../的方式进行目录穿越,达到任意文件读取/下载,任意文件删除,或将任意文件上传到指定目录等。

3、目录穿越漏洞的利用

  Windows中目录穿越漏洞由于操作系统可能导致只能在设定好的盘符下进行穿越,不能越过其他盘符读取,如:读取日志文件,后端代码F:/wwwroot/logs + "前端传递的文件名"。此时通过../进行目录穿越只能在F盘下进行读取,不能读取F盘以外的任何文件,如:C:\windows\win.ini。而Linux中却不受到这种限制,只要有足够的权限可以读任意目录下的文件。

  一般目录穿越导致的主要为任意文件读取,一般都是读取配置文件,因为配置文件中保存着大量敏感信息,如:各种数据库连接地址与账号密码

4、案例代码演示

  环境:

    jdk 1.8(1.8.0_211)
    Maven 3.9.1
    IDEA 2022.3.3

  创建spring项目

  

  使用IDEA新建一个项目,如下图所示,按需配置。这里记得选择2.x的版本

  

  演示代码如下:

参考自:https://github.com/j3ers3/Hello-Java-Sec/blob/master/src/main/java/com/best/hello/controller/Traversal.java

代码就是正常的文件读取操作,如果不理解学习一下java I/O

//    任意文件读取/下载
@ApiOperation(value = "任意文件读取/下载")
@GetMapping("readBuffer")
public String readbuffer(String filename,HttpServletResponse response) throws IOException { try (InputStream inputStream = new BufferedInputStream(Files.newInputStream(Paths.get(filename)))){
response.setHeader("Content-Disposition", "attachment; filename=" + filename);
response.setContentLength((int) Files.size(Paths.get(filename)));
response.setContentType("application/octet-stream"); // 使用 Apache Commons IO 库的工具方法将输入流中的数据拷贝到输出流中
IOUtils.copy(inputStream, response.getOutputStream());
return "文件下载成功:" + filename;
}catch (IOException e){
return "文件下载失败:" + filename;
}
}

任意文件读取:

任意路径遍历:

5、绕过方式

  5.1、url编码绕过

  单次url编码,../编码后..%2f,%2e%2e%2f。

  5.2、双/多重url编码

  进行双重url编码,多了个25

. = %252e
/ = %252f
\ = %255c

  5.3、Unicode的URL编码

. = %u002e
/ = %u2215
\ = %u2216

  5.4、UTF-8的Unicode编码

. = %c0%2e, %e0%40%ae, %c0ae
/ = %c0%af, %e0%80%af, %c0%2f
\ = %c0%5c, %c0%80%5c

  5.5、超长UTF-8编码

. = %c0%2e, %e0%40%ae, %c0ae
/ = %c0%af, %e0%80%af, %c0%2f
\ = %c0%5c, %c0%80%5c

  5.6、空字节截断

  也就是大家熟知的00截断,用于判断后缀名,使用空字节URL编码绕过(出现几率非常小)

../../../../../passwd%00.jpg

6、漏洞修复

通过前面原理介绍,目录穿越是由于文件系统的特性所导致的,通过../进行目录的跨越。修复只需要检测字符".."与"/"即可,在对应语言中加入检测即可,以java为例:写一个工具类检测即可

public class Security {

//    目录穿越检验
public static boolean checkTraversal(String content){
return content.contains("..") || content.contains("/");
}
}

Java代码审计之目录穿越(任意文件下载/读取)的更多相关文章

  1. 2020/1/31 PHP代码审计之目录穿越漏洞

    0x00 目录穿越 目录穿越(Directory Traversal)攻击是黑客能够在Web应用程序所在的根目录以外的文件夹上,任意的存取被限制的文件夹,执行命令或查找数据.目录穿越攻击,也与人称为P ...

  2. 代码审计-phpcms9.6.2任意文件下载漏洞

    漏洞文件: phpcms\modules\content\down.php 1.在download函数中对文件的校验部分 首先 if(preg_match('/(php|phtml|php3|php4 ...

  3. [CISCN2019 华北赛区 Day1 Web1]Dropbox-phar文件能够上传到服务器端实现任意文件读取

    0x00知识点 phar是什么: 我们先来了解一下流包装 大多数PHP文件操作允许使用各种URL协议去访问文件路径:如data://,zlib://或php://.例如常见的 include('php ...

  4. 2020/2/1 PHP代码审计之任意文件读取及删除漏洞

    在开始学习之前先简单记录一下自己现在的思路吧..现在接触的基本都是无防护的漏洞也就是最简单的一些漏洞.我的想法就是以代审思路为主,之前一直在打CTF,白盒的思维我觉得和CTF这种黑盒有很大区别.自己的 ...

  5. 禅知Pro 1.6 前台任意文件读取 | 代码审计

    禅知 Pro v1.6 前台任意文件读取 | 代码审计 蝉知专业版是基于蝉知企业门户系统开源版开发,继承了蝉知本身的优秀功能.相对于蝉知开源版增强了商品的属性自定义.属性价格定制.物流跟踪.微信支付. ...

  6. PHP代码审计笔记--任意文件下载漏洞

    在文件下载操作中,文件名及路径由客户端传入的参数控制,并且未进行有效的过滤,导致用户可恶意下载任意文件.  0x01 客户端下载 常见于系统中存在文件(附件/文档等资源)下载的地方. 漏洞示例代码: ...

  7. [代码审计]XiaoCms(后台任意文件上传至getshell,任意目录删除,会话固定漏洞)

    0x00 前言 这段时间就一直在搞代码审计了.针对自己的审计方法做一下总结,记录一下步骤. 审计没他,基础要牢,思路要清晰,姿势要多且正. 下面是自己审计的步骤,正在逐步调整,寻求效率最高. 0x01 ...

  8. 代码审计-(Ear Music).任意文件下载漏洞

    0x01 代码分析 后台地址:192.168.5.176/admin.php admin admin 安装后的界面 在后台发布了一首新歌后,前台点进去到一个“下载LRC歌词”功能点的时候发现是使用re ...

  9. ThinkAdmin v6 未授权列目录/任意文件读取复现

    大佬的审计文章:https://github.com/zoujingli/ThinkAdmin/issues/244 任意文件读取 POC curl http://127.0.0.1/admin.ht ...

  10. 【漏洞复现】ThinkAdmin v5和v6 未授权列目录任意文件读取(CVE-2020-25540)

    ThinkAdmin v5和v6 未授权列目录/任意文件读取(CVE-2020-25540) 漏洞简介 ThinkAdmin是一套基于ThinkPHP框架的通用后台管理系统.ThinkAdmin v6 ...

随机推荐

  1. 华为P9黑屏的解决方案-更换屏幕

    解决办法(系统软件) 1.回退系统版本,b198或者b139固件. 2.升级版本,到最新版本.新版本使用时并没有发现这个问题. 解决方法(系统设置) 点开设置-电池-选择进入超级省电模式,然后退出超级 ...

  2. SVE学习记录- SVE特性以及寄存器

    本文地址:https://www.cnblogs.com/wanger-sjtu/p/SVE_learn_0.html SVE对比NEON有几个新增的地方. 变长的向量 支持Gather-load & ...

  3. MAUI Blazor Android 输入框软键盘遮挡问题2.0

    前言 关于MAUI Blazor Android 输入框软键盘遮挡问题,之前的文章已经有了答案,MAUI Blazor Android 输入框软键盘遮挡问题 但是这个方案一直存在一点小的瑕疵 在小窗模 ...

  4. iptables防火墙调试,想打印个日志就这么难

    背景 怎么会讲这个话题,这个说来真的长了.但是,长话短说,也是可以的. 我前面的文章提到,线上的服务用了c3p0数据库连接池,会偶发连接泄露问题,而分析到最后,又怀疑是db侧主动关闭连接,或者是服务所 ...

  5. EasyExcel中使用表头模板示例

    解决方案 在EasyExcel的官方示例中,使用模板导出Excel,其结果仍然还会重新打印表头.不满足使用表头模板的需求.在参考源码后,找到如下解决方案. String templateFileNam ...

  6. CF1855B Longest Divisors Interval 题解

    题意: 给定一个数 \(n\),求一个连续区间 \([l,r]\) 使得 \(n\) 是区间内每个数的倍数,最大化这个区间的长度(多组数据). 思路: 逆向思考一波,( 如果一个数 \(x\) 不是 ...

  7. IOS Safari、微信小程序 img或者其他标签元素出现黑边、黑线阴影

    这个问题最开始出现在小程序上,然后在社区找到一个一样得案例 案例:https://developers.weixin.qq.com/community/develop/doc/000608420706 ...

  8. jmeter对请求响应结果进行整段内容提取方法

    通过正则表达式提取器,将上一个请求(A请求)响应数据中的整段内容提取,传给下一个需要该提取数据的请求(B请求). 1. 请求接口响应结果 2. 添加正则表达式提取器 设置变量名为"tt&qu ...

  9. C#程序变量统一管理例子 - 开源研究系列文章

    今天讲讲关于C#应用程序中使用到的变量的统一管理的代码例子. 我们知道,在C#里使用变量,除了private私有变量外,程序中使用到的公共变量就需要进行统一的存放和管理.这里笔者使用到的公共变量管理库 ...

  10. 深入理解Linux内核——内存管理(1)

    提要:本系列文章主要参考MIT 6.828课程以及两本书籍<深入理解Linux内核> <深入Linux内核架构>对Linux内核内容进行总结. 内存管理的实现覆盖了多个领域: ...