JAVA代码审计-某mall
字数 2346 2025-08-19 12:40:34
Java代码审计实战:某Mall系统安全漏洞分析与复现
环境搭建
- 启动MySQL服务
- 创建数据库并导入提供的.sql文件
- 修改配置文件中的数据库名和用户名
漏洞分析与复现
1. SQL注入漏洞
漏洞位置:
src/main/resources/mapper/NewBeeMallGoodsMapper.xml第70行goodsName参数直接拼接SQL语句
调用链:
NewBeeMallGoodsMapper.xml中的SQL语句NewBeeMallGoodsMapper.java中的findNewBeeMallGoodsList方法NewBeeMallGoodsServiceImpl.java中的getNewBeeMallGoodsPage方法NewBeeMallGoodsController.java第133行接收参数
复现步骤:
- 进入商品管理-添加商品功能
- 使用Burp抓包
- 在god参数后添加分号触发报错注入
- 也可使用sqlmap验证
2. 后台权限绕过
漏洞位置:
src/main/java/ltd/newbee/mall/interceptor/AdminLoginInterceptor.java- 第23行使用
request.getRequestURI()获取路径 - 第24行使用
uri.startsWith("/admin")判断路径
漏洞原理:
getRequestURI()返回原始路径,可能包含特殊字符或路径跳转- 仅检查路径是否以
/admin开头,未做严格校验
复现步骤:
- 登录后台获取一个接口
- 删除Cookie模拟无权限状态
- 构造特殊路径如
//admin或/index/..;/admin绕过检查
3. 另一处SQL注入漏洞
漏洞位置:
src/main/java/ltd/newbee/mall/dao/NewBeeMallGoodsMapper.java- 通过
searchNewBeeMallGoods方法最终调用到GoodsController.java
漏洞点:
- 第57行传入
pageUtil参数 PageQueryUtil类创建的pageUtil对象未对params进行过滤
复现步骤:
- 访问漏洞接口
- 使用Burp抓包
- 在参数处输入单引号触发报错注入
- 使用sqlmap验证
4. XSS漏洞
漏洞类型:
- Thymeleaf模板未转义输出
- 富文本编辑器输出未严格过滤
漏洞位置:
src/main/resources/templates/mall/search.html第33行th:utext标签未转义输出
复现步骤:
- 商品信息处添加XSS payload实现弹框
- 订单管理添加payload实现弹框
- 新品上线配置模块添加payload实现弹框
5. 垂直越权
漏洞位置:
src/main/java/ltd/newbee/mall/config/NeeBeeMallWebMvcConfigurer.java- 使用
getRequestURI()而非getServletPath()判断路径
漏洞原理:
- 路径匹配规则不严格
*匹配任意字符,?匹配单个路径
复现步骤:
- 访问dashboard模块
- 输入
//admin或/index/..;/admin绕过限制
6. 水平越权
漏洞1:用户信息修改
- 位置:
ltd/newbee/mall/controller/mall/PersonalController.java:114 updateUserInfo()方法直接使用传入的userId查询用户
复现步骤:
- 注册用户并查看个人信息
- 使用Burp抓包修改
userId为其他用户ID - 成功修改其他用户信息
漏洞2:订单查询
- 位置:
td/newbee/mall/controller/mall/OrderController.java:36 getOrderDetailByOrderNo()函数未严格校验用户权限
复现步骤:
- 用户A下单
- 用户B替换cookie查看用户A的订单信息
7. CSRF漏洞
漏洞位置:
- 添加购物车功能无token校验
- 请求为JSON格式,Burp生成的PoC无法伪造Content-Type
复现步骤:
- 未授权访问商品
http://localhost:8089/index/..;/admin/goods/edit/10896 - 生成CSRF PoC并抓包
- 成功写入XSS payload
- 成功添加商品到购物车
8. 逻辑漏洞
漏洞描述:
- 下订单未支付时,可直接访问
/orders/{orderNo}/finish完成交易 - 未校验订单是否支付、是否出库等状态
漏洞位置:
- 使用
@PutMapping注解,仅PUT方法可执行
复现步骤:
- 添加物品到购物车并提交订单
- 选择支付宝支付但不完成支付
- 后台查看订单状态为未支付
- 使用PUT方法请求完成订单接口
- 订单状态变为已完成
防御建议
-
SQL注入:
- 使用预编译语句
- 避免直接拼接SQL
- 使用ORM框架
-
权限控制:
- 严格校验路径
- 使用
getServletPath()而非getRequestURI() - 增加角色权限校验
-
XSS防御:
- 对
th:text输出进行转义 - 富文本内容严格过滤
- 设置CSP策略
- 对
-
CSRF防御:
- 添加CSRF Token
- 校验Referer头
- 重要操作使用POST方法
-
逻辑漏洞:
- 完善业务流程校验
- 订单状态严格检查
- 关键操作记录日志