JAVA代码审计-某mall
字数 2346 2025-08-19 12:40:34

Java代码审计实战:某Mall系统安全漏洞分析与复现

环境搭建

  1. 启动MySQL服务
  2. 创建数据库并导入提供的.sql文件
  3. 修改配置文件中的数据库名和用户名

漏洞分析与复现

1. SQL注入漏洞

漏洞位置

  • src/main/resources/mapper/NewBeeMallGoodsMapper.xml 第70行
  • goodsName参数直接拼接SQL语句

调用链

  1. NewBeeMallGoodsMapper.xml中的SQL语句
  2. NewBeeMallGoodsMapper.java中的findNewBeeMallGoodsList方法
  3. NewBeeMallGoodsServiceImpl.java中的getNewBeeMallGoodsPage方法
  4. NewBeeMallGoodsController.java第133行接收参数

复现步骤

  1. 进入商品管理-添加商品功能
  2. 使用Burp抓包
  3. 在god参数后添加分号触发报错注入
  4. 也可使用sqlmap验证

2. 后台权限绕过

漏洞位置

  • src/main/java/ltd/newbee/mall/interceptor/AdminLoginInterceptor.java
  • 第23行使用request.getRequestURI()获取路径
  • 第24行使用uri.startsWith("/admin")判断路径

漏洞原理

  • getRequestURI()返回原始路径,可能包含特殊字符或路径跳转
  • 仅检查路径是否以/admin开头,未做严格校验

复现步骤

  1. 登录后台获取一个接口
  2. 删除Cookie模拟无权限状态
  3. 构造特殊路径如//admin/index/..;/admin绕过检查

3. 另一处SQL注入漏洞

漏洞位置

  • src/main/java/ltd/newbee/mall/dao/NewBeeMallGoodsMapper.java
  • 通过searchNewBeeMallGoods方法最终调用到GoodsController.java

漏洞点

  • 第57行传入pageUtil参数
  • PageQueryUtil类创建的pageUtil对象未对params进行过滤

复现步骤

  1. 访问漏洞接口
  2. 使用Burp抓包
  3. 在参数处输入单引号触发报错注入
  4. 使用sqlmap验证

4. XSS漏洞

漏洞类型

  1. Thymeleaf模板未转义输出
  2. 富文本编辑器输出未严格过滤

漏洞位置

  • src/main/resources/templates/mall/search.html第33行
  • th:utext标签未转义输出

复现步骤

  1. 商品信息处添加XSS payload实现弹框
  2. 订单管理添加payload实现弹框
  3. 新品上线配置模块添加payload实现弹框

5. 垂直越权

漏洞位置

  • src/main/java/ltd/newbee/mall/config/NeeBeeMallWebMvcConfigurer.java
  • 使用getRequestURI()而非getServletPath()判断路径

漏洞原理

  • 路径匹配规则不严格
  • *匹配任意字符,?匹配单个路径

复现步骤

  1. 访问dashboard模块
  2. 输入//admin/index/..;/admin绕过限制

6. 水平越权

漏洞1:用户信息修改

  • 位置:ltd/newbee/mall/controller/mall/PersonalController.java:114
  • updateUserInfo()方法直接使用传入的userId查询用户

复现步骤

  1. 注册用户并查看个人信息
  2. 使用Burp抓包修改userId为其他用户ID
  3. 成功修改其他用户信息

漏洞2:订单查询

  • 位置:td/newbee/mall/controller/mall/OrderController.java:36
  • getOrderDetailByOrderNo()函数未严格校验用户权限

复现步骤

  1. 用户A下单
  2. 用户B替换cookie查看用户A的订单信息

7. CSRF漏洞

漏洞位置

  • 添加购物车功能无token校验
  • 请求为JSON格式,Burp生成的PoC无法伪造Content-Type

复现步骤

  1. 未授权访问商品http://localhost:8089/index/..;/admin/goods/edit/10896
  2. 生成CSRF PoC并抓包
  3. 成功写入XSS payload
  4. 成功添加商品到购物车

8. 逻辑漏洞

漏洞描述

  • 下订单未支付时,可直接访问/orders/{orderNo}/finish完成交易
  • 未校验订单是否支付、是否出库等状态

漏洞位置

  • 使用@PutMapping注解,仅PUT方法可执行

复现步骤

  1. 添加物品到购物车并提交订单
  2. 选择支付宝支付但不完成支付
  3. 后台查看订单状态为未支付
  4. 使用PUT方法请求完成订单接口
  5. 订单状态变为已完成

防御建议

  1. SQL注入:

    • 使用预编译语句
    • 避免直接拼接SQL
    • 使用ORM框架
  2. 权限控制:

    • 严格校验路径
    • 使用getServletPath()而非getRequestURI()
    • 增加角色权限校验
  3. XSS防御:

    • th:text输出进行转义
    • 富文本内容严格过滤
    • 设置CSP策略
  4. CSRF防御:

    • 添加CSRF Token
    • 校验Referer头
    • 重要操作使用POST方法
  5. 逻辑漏洞:

    • 完善业务流程校验
    • 订单状态严格检查
    • 关键操作记录日志

参考资源

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方法 逻辑漏洞: 完善业务流程校验 订单状态严格检查 关键操作记录日志 参考资源 JavaSpringBoot代码审计准备