前言

开始我的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
2
3
4
5
6
7
8
9
10
11
@Controller
@RequestMapping("/user")
public class UserController {
   
   @RequestMapping("/users",method= RequestMethod.GET)
   public String users() {
       return "users";
  }
   
}
// 此时请求users方法的url路径就是:.../user/users

@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的盘符首字母一般不是*/*,若是直接给他个绝对路径,还是可以读取出来的

图片

所以还是多添加几个条件吧。

图片