拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Java 代码审计快速找 SQL 注入,白帽常用检索关键词

Java 代码审计快速找 SQL 注入,白帽常用检索关键词

Java 代码审计快速找 SQL 注入,白帽常用检索关键词

摘要

Java Web 项目是 SRC 平台 SQL 注入漏洞最常见的来源之一。完整通读全量源码效率太低,白帽代码审计常用关键词检索快速定位风险代码片段,再追溯参数可控性判断是否存在漏洞。本文整理 MyBatis、MyBatis-Plus、JDBC、JPA、原生拼接等场景下的检索关键词,配套审计判断逻辑、漏洞判定流程、实战踩坑点。适合白帽挖洞、安全测试、开发自查代码。本文内容仅用于授权代码审计、安全学习,禁止用于未授权系统渗透。

免责声明:本文技术内容仅用于网络安全学习、代码审计、授权范围内安全评估。未经目标系统所有者书面许可,禁止对任何系统进行探测、渗透测试。违规操作带来的全部法律责任,由操作者自行承担。

0x00 前言

很多新手做代码审计,拿到源码包直接一行行阅读,耗费大量时间,效率极低。
Java 项目 SQL 注入,本质都是可控字符串直接拼接进 SQL 语句。
我们不需要逐行读代码,利用 IDE 全局搜索,用关键词快速定位风险点,再做参数溯源。

核心审计逻辑:
关键词定位风险代码片段 → 追踪变量来源(是否 HTTP 前端可控) → 校验是否有白名单 / 过滤 → 判断是否存在 SQL 注入

注意:检索关键词只能找到可疑代码,不等于直接判定漏洞。关键词命中只是 “可疑”,必须溯源入参。

0x01 MyBatis XML 相关检索词(XML 注入,最高发)

MyBatis XML 是 Java 项目注入重灾区,优先扫描 Mapper xml 文件。

检索关键词

  1. ${

最核心关键词。${}代表字符串替换,只要里面变量来自前端可控参数,无白名单,高危注入。
审计重点:${userName}、${tableName}、${sortField}。

  1. concat(

用于拼接 SQL 字符串,经常配合 ${} 使用,也用于 DNSLog 注入场景。

  1. order by ${

动态排序经典风险点,前端传排序字段直接放入 ${}。

  1. from ${

动态表名拼接,分表场景常用,极易注入。

  1. limit ${

直接拼接分页参数,高频漏洞点。

审计判断规则

  • ${变量},变量来自前端 HTTP 请求参数,无白名单校验 → 高危 SQL 注入
  • ${变量},变量后端硬编码 / 枚举固定值,不接受前端输入 → 无风险

小技巧:IDEA 全局搜索时,选择文件类型*.xml,过滤 java 文件,只扫描 Mapper。

0x02 MyBatis-Plus 检索关键词(QueryWrapper 系列坑)

MP 项目很多漏洞出现在链式调用,优先检索下面这些方法。

检索关键词

  1. .last(

最高危!直接追加 SQL 片段,常用于 limit 拼接。重点看括号内是否有字符串拼接+。
危险示例:.last("limit "+pageSize)

  1. .apply(

区分重载方法:单字符串参数危险;带{0}占位符多参数版本安全。
危险:.apply("username='"+name+"'")

  1. .inSql(

第二个参数为 SQL 子查询,直接字符串拼接,用户可控即注入。

  1. .orderByAsc(、.orderByDesc(

参数为字符串变量时风险高;Lambda 写法User::getXXX字段写死,无此字段注入风险。

  1. .setSqlSelect(

自定义查询字段,可控字段名可注入。

  1. .groupBy(

传入字符串变量拼接分组字段,存在注入风险。

审计判断规则

只要.last()/.apply()内使用+拼接外部传入变量,且无白名单 → 高危。

注意:LambdaQueryWrapper 只是字段安全,如果链式调用.last(),漏洞依旧存在。

0x03 原生 JDBC 检索关键词(老项目、遗留系统)

老项目不用 MyBatis,直接原生 JDBC 拼接 SQL,注入大量存在。

检索关键词

  1. Statement

java.sql.Statement,非预编译,拼接字符串直接执行 SQL,高危。
对比:PreparedStatement是预编译,安全。

  1. createStatement()

创建 Statement 对象,后续大概率拼接字符串执行 sql。

  1. executeQuery(

执行查询,看传入参数是否+字符串拼接。

  1. executeUpdate(

新增修改删除,拼接 SQL 可产生增删改注入。

  1. "select " + 、"from " +、"where " +、"limit " +

直接字符串拼接 SQL 语句,肉眼看到+拼接变量就是重点。

危险示例:

String sql = "select * from user where id = " + id; stmt.executeQuery(sql);

✅安全写法:PreparedStatement,使用?占位符。

0x04 JPA / Hibernate 检索关键词

JPA 也会出现注入,很多人误以为 JPA 安全。

检索关键词

  1. createNativeQuery(

原生 SQL 查询,直接字符串拼接,高危。

  1. createQuery(

HQL 语句,如果 HQL 字符串由用户输入拼接,存在 HQL 注入。

  1. em.createNativeQuery

EntityManager 原生 SQL 执行。

注意:使用参数绑定setParameter安全;直接+拼接字符串则危险。

0x05 通用拼接关键词(全项目通用检索)

适用于所有框架,全局搜索 java 文件,查找 SQL 字符串拼接。

  1. "select " +
  2. "update " +
  3. "delete " +
  4. "insert " +
  5. "where " +
  6. "and " +
  7. "or " +
  8. "limit " +
  9. "order by " +

检索技巧:双引号开头,加号结尾,代表 SQL 字符串和变量拼接。
只要发现 SQL 字符串使用+拼接外部变量,直接标记可疑。

0x06 入参溯源关键词(判断参数是否前端可控)

找到可疑 SQL 拼接代码之后,下一步判断变量来源,检索这些关键词追踪入参:

  1. @RequestParam
  2. @GetMapping、@PostMapping
  3. @RequestBody
  4. HttpServletRequest
  5. getParameter
  6. request.getParameter

审计链路:
Controller 接口 → Service 层 → Mapper / 执行 SQL 代码
看变量是否可以由 HTTP 请求直接控制。

能从前端传参控制变量的值,就是可控输入,是漏洞成立的必要条件。

0x07 完整审计流程(白帽标准步骤)

  1. 全局检索上面关键词,筛选可疑代码片段;
  2. 追踪变量来源:向上跳转方法调用链,看是否来自 Controller HTTP 入参;
  3. 检查中间是否有安全过滤、白名单校验;
    • 白名单校验,只允许预设值 → 无注入风险
    • 仅黑名单替换关键字(过滤 and、or)→ 可绕过,依旧存在风险
    • 完全无过滤,直接传入 SQL 拼接 → 高危 SQL 注入
  4. 确认漏洞后,构造 Payload 验证(仅授权环境),保存证据准备 SRC 提交。

0x08 高频误报场景(审计必看,减少 SRC 误报)

  1. 变量是后端固定枚举、硬编码字符串,前端无法修改 → 误报
  2. 虽然使用 ${},但变量做了严格白名单校验 → 误报
  3. SQL 拼接变量经过强类型转换(如强转为 Long 数字,非法字符直接抛异常)

例:Long id = Long.valueOf(param),非数字直接报错,无法注入。

  1. 代码只是构造 SQL 字符串,但是没有执行,仅日志打印,不会提交数据库执行 → 误报

重点:只检索关键词不能直接判定漏洞,溯源参数可控性是关键。

0x09 IDE 检索小技巧,提升审计效率

  1. IDEA 全局搜索快捷键:Ctrl+Shift+F,全局检索;
  2. 文件过滤:
    • XML 注入:File mask:*.xml
    • Java 代码注入:File mask:*.java
  3. 排除目录:node_modules、test测试目录,减少无关结果;
  4. 正则检索:可以使用正则匹配,例如搜索"\$\{.*\}"匹配 ${} 内容。

0x10 修复方案简要总结

  1. 优先预编译:MyBatis 使用#{},JDBC 使用 PreparedStatement;
  2. MP 避免使用 last、无参 apply、inSql 拼接用户输入;
  3. 动态表名、排序字段场景,后端严格白名单;
  4. 禁止直接+拼接 SQL 字符串;
  5. 数据库账号最小权限。

0x11 总结

  1. Java 代码审计找 SQL 注入,核心思路是关键词检索 + 参数溯源,不用通读全量源码;
  2. 重点关键词:${、.last(、.apply(、createStatement、"select "+;
  3. 关键词命中只是可疑代码,必须追溯变量是否来自前端 HTTP 可控参数;
  4. 区分误报:变量后端固定值、白名单校验、强类型转换,一般不存在注入;
  5. 熟练这套检索方式,可以快速在源码中挖掘 SQL 注入,是 SRC 白帽必备能力。

最后

关于网络安全技术储备

网络安全是当今信息时代中非常重要的一环。无论是找工作还是感兴趣(黑客),都是未来职业选择中上上之选,为了保护自己的网络安全,学习网络安全知识是必不可少的。

如果你是准备学习网络安全(黑客)或者正在学习,下面这些你应该能用得上:

①网络安全学习路线
②20份渗透测试电子书
③安全攻防357页笔记
④50份安全攻防面试指南
⑤安全红队渗透工具包
⑥网络安全必备书籍
⑦100个漏洞实战案例
⑧安全大厂内部视频资源
⑨历年CTF夺旗赛题解析

一、网络安全(黑客)学习路线

网络安全(黑客)学习路线,形成网络安全领域所有的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

二、网络安全教程视频

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

三、网络安全CTF实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这里带来的是CTF&SRC资料&HW资料,毕竟实战是检验真理的唯一标准嘛~

四、网络安全面试题

最后,我们所有的作为都是为就业服务的,所以关键的临门一脚就是咱们的面试题内容,所以面试题板块是咱们不可或缺的部分,这里我给大家准备的就是我在面试期间准备的资料。

网安其实不难,难的是坚持和相信自己,我的经验是既然已经选定网安你就要相信它,相信它能成为你日后进阶的高效渠道,这样自己才会更有信念去学习,才能在碰到困难的时候坚持下去。

机会属于有准备的人,这是一个实力的时代。人和人之间的差距不在于智商,而在于如何利用业余时间,只要你想学习,什么时候开始都不晚,不要担心这担心那,你只需努力,剩下的交给时间!

这份完整版的网络安全学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】

返回列表