starsea-mall审计
平台搭建
jdk :1.8
mysql:8
下载链接:https://github.com/StarSea99/starsea-mall
修改src/main/resources/application.properties
data.username/data.passwd
自己搭建数据库并连接
复现分析
目录结构
首先尝试分析架构
- 表现层(Presentation Layer):
controller
和interceptor
属于这一层,负责处理HTTP请求和响应。 - 业务逻辑层(Business Logic Layer):
service
属于这一层,负责处理业务逻辑。 - 数据访问层(Data Access Layer):
dao
和entity
属于这一层,负责与数据库进行交互。 - 配置层(Configuration Layer):
config
属于这一层,负责项目的全局配置。 - 通用层(Common Layer):
common
和utils
属于这一层,提供通用的工具和常量。 - 数据传输层(Data Transfer Layer):
vo
属于这一层,负责数据传输。
首先就可以去查看controller和interceptor
interceptor
可以先查看intercepter去看鉴权的问题
AdminLoginInterceptor
主要的处理函数1
2
3
4
5
6
7
8
9
10
11public 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;
}
}访问url中路由开始是admin并且从Seesion中需要获取到loginUser为空就会先去跳转到login界面
MallCartNumberInterceptor
1
2
3
4
5
6
7
8
9
10
11public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {
//购物车中的数量会更改,但是在这些接口中并没有对session中的数据做修改,这里统一处理一下
if (null != request.getSession() && null != request.getSession().getAttribute(Constants.MALL_USER_SESSION_KEY)) {
//如果当前为登陆状态,就查询数据库并设置购物车中的数量值
UserVO newBeeMallUserVO = (UserVO) request.getSession().getAttribute(Constants.MALL_USER_SESSION_KEY);
//设置购物车中的数量
newBeeMallUserVO.setShopCartItemCount(shoppingCartItemMapper.selectCountByUserId(newBeeMallUserVO.getUserId()));
request.getSession().setAttribute(Constants.MALL_USER_SESSION_KEY, newBeeMallUserVO);
}
return true;
}
- MallLoginInterceptorSession中无信息就跳转到login
1
2
3
4
5
6
7
8
9
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {
if (null == request.getSession().getAttribute(Constants.MALL_USER_SESSION_KEY)) {
response.sendRedirect(request.getContextPath() + "/login");
return false;
} else {
return true;
}
}
controller
先去测前台用户的
就先审计mall目录下的文件
水平越权访问
审计到UserController中存在
1 |
|
修改个人信息存在updateinfo
打断点跟进
1 | public UserVO updateUserInfo(User mallUser, HttpSession httpSession) { |
1 | User userFromDB = userMapper.selectByPrimaryKey(userTemp.getUserId()); |
这里存在直接getUserId,通过抓包,发现UserId是明文传输,可以通过修改直接达到水平越权修改其他用户的信息
0元购
在OrderController中存在支付逻辑,查看思考是否存在支付逻辑漏洞
1 |
|
支付成功的逻辑是访问/paySuccess,然后就会有orderNo和payType参数,如果将未支付的单号orderNo当作值就会直接直接跳转到支付成功的界面,返回正常界面后发现已支付
越权查询订单
在OrderController中,存在
1 |
|
其中访问订单是/orders/{orderNo},并没有进行订单匹配用户,如果使用其他用户的订单号,就会存在越权访问到其他用户的单号
前台我查看到的内容差不多有问题的就这些,明显发现该系统严重缺乏鉴权意识
接下来查看后台是否能getshell
后台访问 /admin
账号密码 admin/111111
后台已经不用审计,直接测,有商品图片任意文件上传,和商品简介xss,但是前台访问简介xss代码并没有执行,也找不到其他可以进一步的内容了(没办法解析上传的文件),其实涉及危害并不大