记一次完整的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注入攻击
审计步骤:
- 定位到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应用中的安全漏洞,提升应用安全性。