【Web实战】新手入门java审计
字数 1480 2025-08-10 08:28:49

JshERP CMS安全审计教学文档

环境搭建

  1. 源码获取

    • 从GitHub下载源码:https://github.com/jishenghua/jshERP/releases/tag/2.3
    • 使用IntelliJ IDEA导入项目
  2. 数据库配置

    • 导入提供的数据库文件
    • 修改配置文件中的数据库连接参数
  3. 测试账户

    • 用户名:jsh
    • 密码:123456

SQL注入审计

MyBatis SQL注入原理

  • #{}:预编译参数,安全
  • ${}:直接拼接SQL,存在注入风险

审计步骤

  1. 全局搜索 ${ 查找SQL拼接点
  2. 发现like子句中使用${}拼接SQL
  3. 定位到countsByUser方法
  4. 跟踪调用链:
    • UserService.countUser()调用countsByUser
    • 查找UserService中调用countUser的位置

未授权访问审计

鉴权绕过分析

  1. 检查filter文件中的配置:

    • 不拦截的资源类型:.css, .js, .jpg, .png, .gif, .ico
    • 不拦截的路径:/user/login, /user/registerUser, /v2/api-docs
  2. 绕过原理:

    • 使用getRequestURI()获取请求路径
    • 可通过../路径遍历绕过
    • 示例:未登录访问home会302跳转,但使用路径遍历可绕过
  3. 静态资源校验同样存在此问题

存储型XSS审计

漏洞发现过程

  1. 黑盒测试发现:

    • 修改备注信息时可注入XSS
    • 每次访问页面都会触发XSS
  2. 代码分析:

    • 前端未对输入进行过滤
    • 路由定位到controller
    • 调用链:depotHeadService.updateDepotHeadAndDetail()
    • 直接获取row参数并传递
    • remark字段未过滤直接存入数据库
  3. 输出过程:

    • 查询数据时直接返回未过滤
    • 前端使用datagrid渲染数据,未进行转义
    • 导致存储型XSS

影响范围

  • 多个页面存在相同问题,不仅限于备注字段

越权漏洞审计

1. 密码重置越权

  1. 功能点:账号用户管理 → 编辑用户 → 重置密码

  2. 漏洞分析:

    • 仅校验是否为admin账户
    • 无其他权限校验
    • 可重置任意非admin账户密码
  3. 复现步骤:

    • 登录test3账户
    • 获取test2账户ID(如135)
    • 修改请求重置test2密码

2. 密码修改越权

  1. 漏洞分析:
    • 仅比对旧密码
    • 结合重置漏洞可完全控制账户
    • 删除等操作同样存在越权

接口泄露问题

  1. 可直接访问的API接口:
    • 暴露了系统功能接口
    • 为越权攻击提供信息

修复方案(3.1版本)

  1. SQL注入:

    • ${}改为#{}实现预编译
  2. 接口泄露:

    • 移除敏感API接口
  3. 其他漏洞:

    • 增加权限校验
    • 实现输入过滤

审计方法论总结

  1. SQL注入

    • 重点检查MyBatis中的${}使用
    • 特别是likeorder by等动态SQL部分
  2. 未授权访问

    • 检查过滤器配置
    • 测试路径遍历绕过
    • 验证静态资源校验
  3. XSS

    • 跟踪数据流:输入→存储→输出
    • 检查前端渲染方式
  4. 越权

    • 验证每个操作的权限校验
    • 测试水平越权和垂直越权
  5. 接口安全

    • 检查敏感接口暴露
    • 验证接口权限控制

工具使用建议

  1. 代码审计:

    • 使用IDE全局搜索功能
    • 重点关注controllerservicemapper
  2. 黑盒测试:

    • Burp Suite拦截修改请求
    • 测试边界情况和异常输入
  3. 调试:

    • 使用IDEA断点调试
    • 跟踪关键数据流
JshERP CMS安全审计教学文档 环境搭建 源码获取 : 从GitHub下载源码:https://github.com/jishenghua/jshERP/releases/tag/2.3 使用IntelliJ IDEA导入项目 数据库配置 : 导入提供的数据库文件 修改配置文件中的数据库连接参数 测试账户 : 用户名:jsh 密码:123456 SQL注入审计 MyBatis SQL注入原理 #{} :预编译参数,安全 ${} :直接拼接SQL,存在注入风险 审计步骤 全局搜索 ${ 查找SQL拼接点 发现 like 子句中使用 ${} 拼接SQL 定位到 countsByUser 方法 跟踪调用链: UserService.countUser() 调用 countsByUser 查找 UserService 中调用 countUser 的位置 未授权访问审计 鉴权绕过分析 检查 filter 文件中的配置: 不拦截的资源类型: .css , .js , .jpg , .png , .gif , .ico 不拦截的路径: /user/login , /user/registerUser , /v2/api-docs 绕过原理: 使用 getRequestURI() 获取请求路径 可通过 ../ 路径遍历绕过 示例:未登录访问 home 会302跳转,但使用路径遍历可绕过 静态资源校验同样存在此问题 存储型XSS审计 漏洞发现过程 黑盒测试发现: 修改备注信息时可注入XSS 每次访问页面都会触发XSS 代码分析: 前端未对输入进行过滤 路由定位到 controller 层 调用链: depotHeadService.updateDepotHeadAndDetail() 直接获取 row 参数并传递 remark 字段未过滤直接存入数据库 输出过程: 查询数据时直接返回未过滤 前端使用 datagrid 渲染数据,未进行转义 导致存储型XSS 影响范围 多个页面存在相同问题,不仅限于备注字段 越权漏洞审计 1. 密码重置越权 功能点:账号用户管理 → 编辑用户 → 重置密码 漏洞分析: 仅校验是否为 admin 账户 无其他权限校验 可重置任意非admin账户密码 复现步骤: 登录 test3 账户 获取 test2 账户ID(如135) 修改请求重置 test2 密码 2. 密码修改越权 漏洞分析: 仅比对旧密码 结合重置漏洞可完全控制账户 删除等操作同样存在越权 接口泄露问题 可直接访问的API接口: 暴露了系统功能接口 为越权攻击提供信息 修复方案(3.1版本) SQL注入: 将 ${} 改为 #{} 实现预编译 接口泄露: 移除敏感API接口 其他漏洞: 增加权限校验 实现输入过滤 审计方法论总结 SQL注入 : 重点检查MyBatis中的 ${} 使用 特别是 like 、 order by 等动态SQL部分 未授权访问 : 检查过滤器配置 测试路径遍历绕过 验证静态资源校验 XSS : 跟踪数据流:输入→存储→输出 检查前端渲染方式 越权 : 验证每个操作的权限校验 测试水平越权和垂直越权 接口安全 : 检查敏感接口暴露 验证接口权限控制 工具使用建议 代码审计: 使用IDE全局搜索功能 重点关注 controller 、 service 、 mapper 层 黑盒测试: Burp Suite拦截修改请求 测试边界情况和异常输入 调试: 使用IDEA断点调试 跟踪关键数据流