java-sec-code学习之path_traversal
前言
开始我的java代码审计学习,使用的环境是idea
项目是java-sec-code:https://github.com/JoyChou93/java-sec-code
从java代码审计从零开始的第一更,会从网上找各种资源整合学习
0x01 从原版java代码分析
进入controller文件
/src/main/java/org/joychou/controller/PathTraversal.java
在PathTraversal类前面我们可以看到有一个@RestController注解
他是Sring中的一种注解,@RestController的作用等同于@Controller + @ResponseBody。
先来看@Controller注解:它是声明该类是一个控制器类,也就是我们常说的MVC框架中的C,一般在控制器类下面还需要加一个@RequestMapping注解,用来映射不同的请求,比如GET,POST等。
1 |
|
@ResponseBody注解是将相应的返回值以指定的格式返回给http response,一般是返回JSON格式,不加这个注解的话只能进行跳转。很麻烦,所以Spring4之后加了新的注解@RestController
来看原版的文件穿越代码
我们使用的是windows,工作目录为E:\java-sec-code
我们在工作路径下创建个1.txt可以轻松读取
没有进行对文件路径过滤的,在linux下我们就可以进行目录穿越,去对非工作目录的内容进行读取,造成数据泄露。
1 | http://localhost:8080/path_traversal/vul?filepath=../../../../../etc/passwd |
因此我们来看官方的过滤处理。
0x02 官方过滤处理
可以看到加了一个条件判断,我们跟进。
先对路径进行url解码,以防url编码绕过下面的过滤条件,再对url路径进行判断,若是存在 .. 或者路径首字符为 / 则被禁止读取
测试如下
从根源上解决了Linux系统路径穿越问题。
0x03 存在的问题
如果是拿windows复现的小伙伴就很容易发现,windows的盘符首字母一般不是*/*,若是直接给他个绝对路径,还是可以读取出来的
所以还是多添加几个条件吧。