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

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

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

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路径下进行登录
先注册一个test的号,然后登录

然后打开个人中心

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

可以看到是updateinfo路径下的

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

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

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

然后放行

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

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

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

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

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

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

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

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

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

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

登录后台

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

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

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

源码这里也能看出来

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


/swagger-ui.html

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

/v2/api-docs

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

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

@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] 获取的是第一个路径段,这种匹配可能过于宽松
查看数据库

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

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

登录普通用户

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

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

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


2.学生编辑

3.教师编辑


,