ewbee-mall是一套电商系统,包括基础版本(Spring Boot+Thymeleaf)、前后端分离版本(Spring Boot+Vue 3+Element-Plus+Vue-Router 4+Pinia+Vant 4) 、秒杀版本、Go语言版本、微服务版本(Spring Cloud Alibaba+Nacos+Sentinel+Seata+Spring Cloud Gateway+OpenFeign+ELK)。 前台商城系统包含首页门户、商品分类、新品上线、首页轮播、商品推荐、商品搜索、商品展示、购物车、订单结算、订单流程、个人订单管理、会员中心、帮助中心等模块。 后台管理系统包含数据面板、轮播图管理、商品管理、订单管理、会员管理、分类管理、设置等模块。
pom.xml
有用的基本就这个 mybatis容易存在SQL注入漏洞
SQL注入
使用mybatis的依赖
直接搜索 ${
![28a3993f1d0d081dbb2e1a488f1d7a1e.png](https://img-blog.csdnimg.cn/img_convert/28a3993f1d0d081dbb2e1a488f1d7a1e.png)
<select id="findNewBeeMallGoodsList" parameterType="Map" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"/>
from tb_newbee_mall_goods_info
<where>
<if test="goodsName!=null and goodsName!=''">
and goods_name like CONCAT('%','${goodsName}','%')
</if>
<if test="goodsSellStatus!=null and goodsSellStatus!=''">
and goods_sell_status = #{goodsSellStatus}
</if>
<if test="startTime != null and startTime.trim() != ''">
and create_time > #{startTime}
</if>
<if test="endTime != null and endTime.trim() != ''">
and create_time < #{endTime}
</if>
</where>
order by goods_id desc
跳转到NewBeeMallGoodsMapper.xml
参数 goodName
![5a4ea948e0433632c723a9d87f1821b4.png](https://img-blog.csdnimg.cn/img_convert/5a4ea948e0433632c723a9d87f1821b4.png)
点击绿色小箭头
![541dac40ca40122c925ae553d8c99b14.png](https://img-blog.csdnimg.cn/img_convert/541dac40ca40122c925ae553d8c99b14.png)
![06dc6a29758e45af17b3df88b40695d4.png](https://img-blog.csdnimg.cn/img_convert/06dc6a29758e45af17b3df88b40695d4.png)
跳转到这里 点击 java文件
@Override
public PageResult getNewBeeMallGoodsPage(PageQueryUtil pageUtil) {
List<NewBeeMallGoods> goodsList = goodsMapper.findNewBeeMallGoodsList(pageUtil);
int total = goodsMapper.getTotalNewBeeMallGoods(pageUtil);
PageResult pageResult = new PageResult(goodsList, total, pageUtil.getLimit(), pageUtil.getPage());
return pageResult;
}
![32fba350684748b14f4c0ff1bc2d4cec.png](https://img-blog.csdnimg.cn/img_convert/32fba350684748b14f4c0ff1bc2d4cec.png)
点击 getNewBeeMallGoodsPage 跳转
![17f3462646e0d7f682dbe2fe6f45c772.png](https://img-blog.csdnimg.cn/img_convert/17f3462646e0d7f682dbe2fe6f45c772.png)
跳转到 controller 层 admin后台管理
先登录后台
![db40046f2cac9856e6ba83f1a337c27a.png](https://img-blog.csdnimg.cn/img_convert/db40046f2cac9856e6ba83f1a337c27a.png)
![6b69f02d97f62be1de7b37ce5a3fff0e.png](https://img-blog.csdnimg.cn/img_convert/6b69f02d97f62be1de7b37ce5a3fff0e.png)
在商品管理处找到接口
![e1d2cb50bf9ff3eef677e951ef5cc1a0.png](https://img-blog.csdnimg.cn/img_convert/e1d2cb50bf9ff3eef677e951ef5cc1a0.png)
但是这里要自己添加参数上去
goodsName
/admin/goods/list?_search=false&nd=1725359475161&limit=20&page=1&sidx=&order=asc&goodsName=1
单引号报错
![11a8a03394691dc209648ced3da76206.png](https://img-blog.csdnimg.cn/img_convert/11a8a03394691dc209648ced3da76206.png)
闭合正常
![9ed83924e9e5be21f813bf88ecc1ce15.png](https://img-blog.csdnimg.cn/img_convert/9ed83924e9e5be21f813bf88ecc1ce15.png)
交给sqlmap
![c1c79745d54dd9c5de16a99928cebf62.png](https://img-blog.csdnimg.cn/img_convert/c1c79745d54dd9c5de16a99928cebf62.png)
存在sql注入
权限绕过
后台系统身份验证拦截器 AdminLoginInterceptor.java 存在权限绕过漏洞。
漏洞代码位于:src/main/java/ltd/newbee/mall/interceptor/AdminLoginInterceptor.java
![301f10dc98b6454f349fa8929a630278.png](https://img-blog.csdnimg.cn/img_convert/301f10dc98b6454f349fa8929a630278.png)
@Component
public class AdminLoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {
String uri = request.getRequestURI();
if (uri.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;
}
}
关键点是第 23 行,使用了 request.getRequestURI() 方法获取路径。如果使用该方法获取的路径进行权限判断是极易出现权限绕过漏洞的
<font style="color:#DF2A3F;">getRequestURI</font>
方法返回的路径是未经过服务器端处理的原始路径,可能包含特殊字符或路径跳转,从而绕过服务器端的安全控制。
第 24 行使用了 uri.startsWith("/admin") 判断 Uri 路径中是否以 /admin
开头,以及获取并判断 Session 中的 loginUser 属性是否为 null,两个条件&&
在一起结果为 True 的话进入条件代码,提示需要登录并跳转到后台登录页面中。
既然这样,我们知道 a && b 需要两者都为 True 整体则为 True 才会进入条件判断代码中,如果另其中一个条件为 False 则整体就为 False,就不会进入条件判断中去了。
找一些特殊字符绕过路径判断,并且不影响整体接口
/1/../
//
/;/
URL编码
![567ac06ca076a2eb73eb1177cf9675c7.png](https://img-blog.csdnimg.cn/img_convert/567ac06ca076a2eb73eb1177cf9675c7.png)
删除cookie之后就是直接从后台sql注入变成了前台sql注入
还有一个前台sql注入 也是一样的 。