小白也能懂的两次小小的Java代码审计
下载地址https://github.com/StarSea99/starsea-mall然后根据要求配置环境,配置Maven 数据库配置完成好可以启动页面开始审计,经典的一个目录在intercept 2025-11-24 11:59:16 Author: www.freebuf.com(查看原文) 阅读量:3 收藏

下载地址
https://github.com/StarSea99/starsea-mall
然后根据要求配置环境,配置Maven 数据库
配置完成好可以启动页面

image.png

开始审计,经典的一个目录

image.png

在interceptor是一个拦截器,下面是后端的admin登录判断,下面是对于用户购买商品数量的判断和用户登录的判断

1.限制未授权访问

先看admin判断的

image.png

public class AdminLoginInterceptor implements HandlerInterceptor {

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {
    String requestServletPath = request.getServletPath();
    if (requestServletPath.startsWith("/admin") && null == request.getSession().getAttribute("loginUser")) {
        request.getSession().setAttribute("errorMsg", "请登陆");
        response.sendRedirect(request.getContextPath() + "/admin/login");
        return false;
    } else {
        request.getSession().removeAttribute("errorMsg");
        return true;
    }
}

可以知道,做了一个if判断,判断这个路由是不是admin路径下的,而且startWish是限定了以admin字段开头并且检查是否为loginUser,表示是否是admin登录过了,如果不是,将会报错,然后重定向到admin/login路径下进行登录

2.逻辑洞

1.任意会员登录

先注册一个test的号,然后登录

image.png

然后打开个人中心

image.png

在更改个人信息里面进行抓包

image.png

可以看到是updateinfo路径下的

image.png

这段代码判断数据库有没有人员信息,有就会更新人员信息, 代码中直接将HttpSession传递给服务层用于更新用户信息,但没有明确指出如何确认当前操作的用户身份。这可能导致越权访问问题,即一个用户可能尝试修改另一个用户的信息。应确保只有经过授权的用户才能修改其自己的信息。

image.png

可以看到post提交的json格式当中出现了userId的字眼,去数据库中查找这个字段

image.png

可以看到确实有这个字段,而且其他用户也有字段。所以我们将这个userId 5 改为 2

image.png

然后放行

image.png

可以看到已经登录上了2的用户,登录1,2,3,4同理,然后只要遍历一下都能实现登录

2.修改订单实现0元购

image.png

随便抓一个包,这里抓长袖体恤的包

image.png

放行,可以看到已支付的放行后面显示已付款

image.png

可知支付成功需要orderNo订单号和payType支付类型

image.png

抓一个未支付的包,发现需要支付

image.png

再进行抓去支付的包,发现这里多了一个payType的,和代码分析的一样

image.png

查看数据库,发现订单及订单状态,已支付类型是1,未支付是0,待支付是2

image.png

所以我们将待支付的2可以改成已经支付的1,从而绕过支付

image.png

进行放行,可以看到已经显示已付款,成功绕过支付

image.png

查看数据库,也可以看到数据更新了

image.png

3.top10

1.任意文件上传(但是不能getshell)

登录后台

image.png

点击上传文件的地方,随便上传一个文件,发现对文件做了限制

image.png

用<?php
phpinfo();
?>
来证明一下,能解析说明就存在文件上传漏洞

image.png

发现这里的图片路径是时间格式生成的,即使没有文件上传漏洞,没有拿到shell,但是绕过前端限制可以做到任意文件上传

image.png

源码这里也能看出来

image.png

2.多处xss(没什么用)

可以看到源码里面没有对xss做防御

image.png

image.png

3.swagger敏感信息泄露(不能获取到管理员有用信息)

/swagger-ui.html

image.png

泄露管理员路径,但由于限制未授权访问,这里应该行不通

image.png

/v2/api-docs

image.png

项目地址: https://gitee.com/huang-yk/student-manage
项目下载到本地后IDEA打开,等待项目加载
配置Maven,修改数据库配置文件,然后启动,访问

image.png

1.代码审计
1.垂直越权+未授权+敏感信息泄露
找到拦截器看看对登录做了什么校验

image.png

@Override
public boolean preHandle(HttpServletRequest request,
    HttpServletResponse response, Object handler) throws Exception {

  HttpSession session = request.getSession();
  User user = (User) session.getAttribute(StrUtil.USER);
  if (user == null) {
    response.sendRedirect(request.getContextPath() + "/login/loginPage");
    return false;
  } else {
    String url = request.getRequestURI();
    List<Auth> list = user.getUrlList();
    for (Auth auth : list) {
      if (url.contains(auth.getUrl()) || auth.getUrl().contains(url.split("/")[0])) {
        return true;
      }
    }
  }
  response.sendRedirect(request.getContextPath() + "/404");
  return false;
}

第一 ,可以看到检查用户是否已登录,然后检查登录用户是否有权限访问当前请求的URL,若登录就进去,没登录就跳转登录界面
第二 ,
• 遍历权限列表,检查当前 URL 是否匹配任何权限规则
• 匹配规则1:当前 URL 包含权限 URL(url.contains(auth.getUrl()))
• 匹配规则2:权限 URL 包含当前 URL 的第一级路径(auth.getUrl().contains(url.split("/")[0]))
所以这里就有一些潜在问题
RL 匹配逻辑可能不够精确:
• 使用 contains() 方法可能导致误匹配(例如 /user 会匹配 /user/add 和 /admin/user)
• 考虑使用更精确的匹配方式,如 equals 或正则表达式
url.split("/")[0] 获取的是第一个路径段,这种匹配可能过于宽松
查看数据库

image.png

可以发现各自的身份权限所能访问的位置,其中管理员19个都能访问,而学生和老师分别为7个8个
根据上面的代码分析,我们进入管理员之后拥有权限,可以进行构造路径来进行垂直越权进行操作

image.png

可以发现进入管理员访问这个/student/list 可以发现能够遍历所有的人员信息

image.png

登录普通用户

image.png

拼接这个/student/list 依然可以访问,达到垂直越权加未授权加敏感信息泄露

image.png

2.多处XSS
查找是否有预编译的,或者xss相关的

image.png

发现没有对xss进行预编译的或者防护,而且添加的数据在进入数据库之前都没有进行判断或者进行校验,然后直接就是找个xss poc 直接插入就行了
1.公告编辑

image.png
image.png

2.学生编辑

image.png

3.教师编辑

image.png

image.png

,


文章来源: https://www.freebuf.com/articles/web/458769.html
如有侵权请联系:admin#unsafe.sh