记一次完整的java代码审计流程
字数 1792 2025-09-23 19:27:38

Java代码审计实战教程:从环境搭建到漏洞挖掘

环境搭建与准备

1. 项目导入与配置

  • 获取开源Java项目源代码
  • 使用IntelliJ IDEA导入项目
  • 根据README文件配置相关配置文件
  • 导入项目所需的数据库结构
  • 启动项目,访问 http://127.0.0.1:8081/ms/login.do
  • 使用默认凭证登录:用户名msopen,密码msopen

SQL注入漏洞审计

漏洞点1:MyBatis SQL注入

位置:DAO层SQL映射文件
漏洞特征:使用$进行SQL语句拼接而非安全的#
风险:SQL注入攻击

审计步骤

  1. 定位到IContentDao接口
  2. 搜索使用${}进行参数拼接的SQL语句
  3. 在ContentBizImpl实现类中找到调用点
  4. 追踪到ContentAction中的query方法调用
  5. 确认XML中使用的参数为categoryid

测试方法

  • 直接访问接口路径(注意:/ms路径需要认证,未授权访问需使用非/ms路径)
  • 构造恶意参数进行SQL注入测试

文件上传漏洞审计

漏洞点1:黑名单过滤绕过

位置:文件上传功能模块
漏洞特征

  • 仅过滤.exe.jsp后缀
  • 未限制.jspx等危险后缀

审计步骤

  1. 定位上传接口(默认路径:/appLogo)
  2. 分析路径遍历检测逻辑(../检测)
  3. 检查文件后缀黑名单机制
  4. 分析文件名处理逻辑

绕过方法

  • 上传.jspx文件绕过黑名单
  • 接口未授权访问

漏洞点2:NTFS ADS特性绕过

漏洞特征:系统截取最后一个"."获取后缀
利用方法:利用Windows NTFS ADS特性
Payload示例filename.jsp::$DATA

测试结果:成功绕过过滤机制上传恶意文件

漏洞点3:模板上传漏洞

位置:模板上传功能
漏洞特征

  • 类似的过滤逻辑(../检测和黑名单机制)
  • 文件直接保存到webapp根目录
  • 同样的过滤缺陷

漏洞点4:ZIP解压漏洞

位置:ZIP文件上传解压功能
漏洞特征

  • 解压时路径过滤不严
  • 可导致任意文件写入
  • 类似JSPXCMS解压漏洞

利用方法

  1. 构造恶意ZIP文件
  2. 上传后触发解压操作
  3. 实现任意文件写入

任意文件夹删除漏洞

位置:未在前台显示的功能点
漏洞特征

  • 直接拼接路径参数
  • 无任何过滤措施
  • 未授权访问

利用方法:构造路径参数实现任意文件夹删除

高级SQL注入漏洞

位置:未授权接口
漏洞特征${}包裹的order by注入
接口路径:/mdiy/dict/listExcludeApp
参数:orderBy

测试Payload
/mdiy/dict/listExcludeApp?orderBy=1 or updatexml(1,concat(0x7e,user(),0x7e),1)

模板注入漏洞

位置:模板保存功能
漏洞特征

  1. 后缀名黑名单过滤(仅exe和jsp)
  2. 路径遍历未过滤(../)
  3. 使用存在漏洞的Freemarker版本

利用步骤

  1. 获取模板编辑权限
  2. 在模板内容开头插入Freemarker漏洞Payload
  3. 保存模板触发漏洞
  4. 访问受影响页面执行代码

注意:需要复制原有代码内容并添加Payload,避免破坏正常功能

审计技巧总结

1. 代码追踪方法

  • 全局搜索关键DAO接口
  • 追踪接口实现类
  • 查找Controller调用点

2. 漏洞挖掘重点

  • 关注SQL语句中的${}使用
  • 文件上传功能的过滤逻辑
  • 路径拼接操作的安全性
  • 未授权接口的访问控制

3. 测试技巧

  • 注意路径访问权限(/ms需要认证)
  • 使用断点调试分析程序流程
  • 针对不同操作系统特性进行测试
  • 构造边界Case测试过滤机制

防护建议

  1. SQL注入防护

    • 统一使用#{}参数绑定
    • 避免使用${}进行动态SQL拼接
    • 使用MyBatis的安全配置
  2. 文件上传安全

    • 使用白名单机制替代黑名单
    • 严格限制上传文件类型
    • 对上传文件重命名
    • 存储到非web可访问目录
  3. 路径安全

    • 规范化所有路径操作
    • 严格过滤../等遍历字符
    • 使用安全的文件操作API
  4. 访问控制

    • 统一权限验证机制
    • 避免未授权接口暴露
    • 实施最小权限原则

通过系统性的代码审计流程,可以有效发现和修复JavaWeb应用中的安全漏洞,提升应用安全性。

Java代码审计实战教程:从环境搭建到漏洞挖掘 环境搭建与准备 1. 项目导入与配置 获取开源Java项目源代码 使用IntelliJ IDEA导入项目 根据README文件配置相关配置文件 导入项目所需的数据库结构 启动项目,访问 http://127.0.0.1:8081/ms/login.do 使用默认凭证登录:用户名 msopen ,密码 msopen SQL注入漏洞审计 漏洞点1:MyBatis SQL注入 位置 :DAO层SQL映射文件 漏洞特征 :使用 $ 进行SQL语句拼接而非安全的 # 风险 :SQL注入攻击 审计步骤 : 定位到IContentDao接口 搜索使用 ${} 进行参数拼接的SQL语句 在ContentBizImpl实现类中找到调用点 追踪到ContentAction中的query方法调用 确认XML中使用的参数为 categoryid 测试方法 : 直接访问接口路径(注意:/ms路径需要认证,未授权访问需使用非/ms路径) 构造恶意参数进行SQL注入测试 文件上传漏洞审计 漏洞点1:黑名单过滤绕过 位置 :文件上传功能模块 漏洞特征 : 仅过滤 .exe 和 .jsp 后缀 未限制 .jspx 等危险后缀 审计步骤 : 定位上传接口(默认路径:/appLogo) 分析路径遍历检测逻辑(../检测) 检查文件后缀黑名单机制 分析文件名处理逻辑 绕过方法 : 上传 .jspx 文件绕过黑名单 接口未授权访问 漏洞点2:NTFS ADS特性绕过 漏洞特征 :系统截取最后一个"."获取后缀 利用方法 :利用Windows NTFS ADS特性 Payload示例 : filename.jsp::$DATA 测试结果 :成功绕过过滤机制上传恶意文件 漏洞点3:模板上传漏洞 位置 :模板上传功能 漏洞特征 : 类似的过滤逻辑(../检测和黑名单机制) 文件直接保存到webapp根目录 同样的过滤缺陷 漏洞点4:ZIP解压漏洞 位置 :ZIP文件上传解压功能 漏洞特征 : 解压时路径过滤不严 可导致任意文件写入 类似JSPXCMS解压漏洞 利用方法 : 构造恶意ZIP文件 上传后触发解压操作 实现任意文件写入 任意文件夹删除漏洞 位置 :未在前台显示的功能点 漏洞特征 : 直接拼接路径参数 无任何过滤措施 未授权访问 利用方法 :构造路径参数实现任意文件夹删除 高级SQL注入漏洞 位置 :未授权接口 漏洞特征 : ${} 包裹的order by注入 接口路径 :/mdiy/dict/listExcludeApp 参数 :orderBy 测试Payload : /mdiy/dict/listExcludeApp?orderBy=1 or updatexml(1,concat(0x7e,user(),0x7e),1) 模板注入漏洞 位置 :模板保存功能 漏洞特征 : 后缀名黑名单过滤(仅exe和jsp) 路径遍历未过滤(../) 使用存在漏洞的Freemarker版本 利用步骤 : 获取模板编辑权限 在模板内容开头插入Freemarker漏洞Payload 保存模板触发漏洞 访问受影响页面执行代码 注意 :需要复制原有代码内容并添加Payload,避免破坏正常功能 审计技巧总结 1. 代码追踪方法 全局搜索关键DAO接口 追踪接口实现类 查找Controller调用点 2. 漏洞挖掘重点 关注SQL语句中的 ${} 使用 文件上传功能的过滤逻辑 路径拼接操作的安全性 未授权接口的访问控制 3. 测试技巧 注意路径访问权限(/ms需要认证) 使用断点调试分析程序流程 针对不同操作系统特性进行测试 构造边界Case测试过滤机制 防护建议 SQL注入防护 : 统一使用 #{} 参数绑定 避免使用 ${} 进行动态SQL拼接 使用MyBatis的安全配置 文件上传安全 : 使用白名单机制替代黑名单 严格限制上传文件类型 对上传文件重命名 存储到非web可访问目录 路径安全 : 规范化所有路径操作 严格过滤../等遍历字符 使用安全的文件操作API 访问控制 : 统一权限验证机制 避免未授权接口暴露 实施最小权限原则 通过系统性的代码审计流程,可以有效发现和修复JavaWeb应用中的安全漏洞,提升应用安全性。