一、目录穿越漏洞

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. ranger2.1.0源码编译以及安装

    ranger2.1.0源码编译以及安装 编译环境准备 环境需求 示例版本 JDK8 Java(TM) SE Runtime Environment (build 1.8.0_231-b11) mave ...

  2. AI识别检验报告 -PaddleNLP UIE-X 在医疗领域的实战

    目录 UIE-X在医疗领域的实战 1.项目背景 2.案例简介 3.环境准备 数据转换 5.模型微调 6.模型评估 7.Taskflow一键部署 UIE-X在医疗领域的实战 PaddleNLP全新发布U ...

  3. JVM方法区

    JVM方法区 <Java虚拟机规范>中明确说明:"尽管所有的方法区在逻辑上是属于堆的一部分,但一些简单的实现可能不会选择去进行垃圾收集或者进行压缩."但对于HotSpo ...

  4. GSAP 基础

    GreenSock Animation Platform (GSAP) 是一个业界知名的动画库,它被1100多万个网站使用,有超过50%的获奖的网站都是用了它.不管是在原生环境中,还是任意的框架中,你 ...

  5. start_HTTPServer

    alias alias wser='sh /Users/enzhao/suanec/libs/envs/start_HTTPServer.sh' /Users/enzhao/suanec/libs/e ...

  6. 【分享】如何才能简洁高效不失优雅的爆破ZIP文件?

    0x01 前言 在CTF比赛中,压缩包密码的爆破一直是一个热门话题.在这个过程中,简洁高效的方法是至关重要的.本文将介绍一些实用的技巧和工具,帮助您高效地爆破ZIP文件密码,而不失优雅.我们将探讨一些 ...

  7. Linux下发现一个高安全性的系统管理工具

    软件 AnySetup 主要功能 主要功能是对Linux操作系统下的基本配置进行管理.多种服务配置进行管理.安全配置进行管理等.如:操作系统的升级管理,软件包的安装.更新和卸载管理,软件仓库源的管理, ...

  8. STM32中SWD下载不进去的解决方法

    这是我第一次写自己的博客,希望以后写博客可以当做自己的个人习惯并坚持下去,作为技术分享,也欢迎各位大佬前来指正.本人本科学习的机械电子工程,了解机械制图.嵌入式编程.目前刚好学习了PCB制板,正在向着 ...

  9. jmeter 二次开发详解

    背景: JMeter 是一个功能强大的性能测试工具,但它可能无法满足特定项目或组织的特定需求.通过进行二次开发,可以定制 JMeter,使其适应具体项目的需求.例如,可能需要添加自定义的 测试元件.报 ...

  10. Ascend C保姆级教程:我的第一份Ascend C代码

    本文分享自华为云社区<Ascend C保姆级教程:我的第一份Ascend C代码>,作者:昇腾CANN . Ascend C是昇腾AI异构计算架构CANN针对算子开发场景推出的编程语言,原 ...