Web安全 | Java-SQL注入实战
字数 1301 2025-08-18 11:39:30

Java-SQL注入与XXE攻击实战教学文档

一、SQL注入基础

1. SQL语言分类

SQL(结构化查询语言)主要分为三类:

  • DDL(数据定义语言):create, alter, drop, truncate
  • DML(数据操作语言):select, insert, update, delete
  • DCL(数据控制语言):grant, revoke

2. SQL注入原理

SQL注入攻击通过攻击者提交包含恶意代码的数据到应用程序,应用程序将提交恶意数据当作SQL交给数据库服务执行,从而导致攻击者控制数据库服务执行。

典型注入场景

// 用户登录流程SQL
$sql = 'SELECT * FROM user WHERE name="' + $_POST['name'] + '" AND password="' + $_POST['password'] + '"';

// 用户查询流程SQL
$sql = 'SELECT * FROM user WHERE id=' + $_POST['id'];
$sql = 'SELECT * FROM user WHERE desc="' + $_POST['desc'] + '"';

二、SQL注入利用方式

1. 基本注入Payload示例

  1. 万能密码绕过登录

    name: " or 1=1 #
    

    生成SQL:

    SELECT * FROM user WHERE name="" or 1=1 #" AND password=""
    

    实际执行:

    SELECT * FROM user WHERE name="" or 1=1
    
  2. 查询所有数据

    id: 1 or 1=1
    

    生成SQL:

    SELECT * FROM user WHERE id=1 or 1=1
    
  3. 字符串注入

    desc: " or "1"="1
    

    生成SQL:

    SELECT * FROM user WHERE desc="" or "1"="1"
    
  4. 删除表攻击

    name: ";drop table user; #
    

    生成SQL:

    SELECT * FROM user WHERE name="";drop table user; #" AND password=""
    

    实际执行:

    SELECT * FROM user WHERE name="";drop table user;
    

2. SQL注入分类

  1. 整数型注入:拼接在SQL中的数据为整数类型
  2. 字符串型注入:拼接在SQL中的数据为字符串类型
  3. 特殊字符注入:利用注释符、SQL分隔符(;)、运算符(+, ||)、数据库函数(char)等
  4. 盲注:不能直接通过错误回显和输出结果判断注入

盲注技术详解

基于内容的盲注

  • 针对数据存在的请求:
    • 整数类型:拼接AND 1=1AND 1=2
    • 字符串类型:拼接' AND '1' = '1' AND '1' = '2
  • 针对数据不存在的请求:
    • 使用OR逻辑判断

利用方式示例

AND substring(@@version, 1, 1) = '8'
OR substring(@@version, 1, 1) = '8'

基于时间的盲注

sleep(n); --

Order By盲注

order by (case when (条件) then 字段1 else 字段2 end)

三、SQL注入防御措施

  1. 使用静态SQL语句
  2. 使用参数化查询SQL(预处理方式)
  3. 使用安全的存储过程(禁止在存储过程中拼接SQL字符串)
  4. 数据参数检查
    • 数据是否为空
    • 数据格式(类型格式和正则格式)
    • 数据范围(大小、长度、可选值)

四、XXE(XML外部实体注入)

1. XML基础结构

  1. XML声明
  2. XML文档定义类型:
    • XML约束
    • XML实体(内部实体、外部实体、参数化实体)
  3. XML文档

2. XXE攻击原理

当XML解析器在解析引用外部实体时,可能导致:

  • 数据泄露
  • 拒绝服务
  • SSRF(服务器端请求伪造)
  • 端口扫描
  • 远程代码执行

3. XXE攻击方式

  1. 获取服务器目录或文件
  2. 拒绝服务攻击
  3. 盲注(数据无回显时将数据发送到远程攻击服务器)

4. XXE防御措施

  1. 设置XML解析器禁用DTD
  2. 设置XML解析器禁用外部实体
  3. 验证HTTP头中的content-type及accept
  4. 过滤提交数据中的<!DOCTYPE<!ENTITY

五、实战题目解析

  1. SQL Injection 07
  2. SQL Injection 08
  3. SQL Injection(advanced) 03
  4. SQL Injection(advanced) 05
  5. SQL Injection(mitigation) 08
  6. XXE 03
  7. XXE 04
  8. XXE 07

六、安全注意事项

重要声明:文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途以及盈利等目的,否则后果自行承担!

Java-SQL注入与XXE攻击实战教学文档 一、SQL注入基础 1. SQL语言分类 SQL(结构化查询语言)主要分为三类: DDL(数据定义语言) :create, alter, drop, truncate DML(数据操作语言) :select, insert, update, delete DCL(数据控制语言) :grant, revoke 2. SQL注入原理 SQL注入攻击通过攻击者提交包含恶意代码的数据到应用程序,应用程序将提交恶意数据当作SQL交给数据库服务执行,从而导致攻击者控制数据库服务执行。 典型注入场景 : 二、SQL注入利用方式 1. 基本注入Payload示例 万能密码绕过登录 : 生成SQL: 实际执行: 查询所有数据 : 生成SQL: 字符串注入 : 生成SQL: 删除表攻击 : 生成SQL: 实际执行: 2. SQL注入分类 整数型注入 :拼接在SQL中的数据为整数类型 字符串型注入 :拼接在SQL中的数据为字符串类型 特殊字符注入 :利用注释符、SQL分隔符(;)、运算符(+, ||)、数据库函数(char)等 盲注 :不能直接通过错误回显和输出结果判断注入 盲注技术详解 基于内容的盲注 : 针对数据存在的请求: 整数类型:拼接 AND 1=1 和 AND 1=2 字符串类型:拼接 ' AND '1' = '1 和 ' AND '1' = '2 针对数据不存在的请求: 使用 OR 逻辑判断 利用方式示例 : 基于时间的盲注 : Order By盲注 : 三、SQL注入防御措施 使用静态SQL语句 使用参数化查询SQL(预处理方式) 使用安全的存储过程 (禁止在存储过程中拼接SQL字符串) 数据参数检查 : 数据是否为空 数据格式(类型格式和正则格式) 数据范围(大小、长度、可选值) 四、XXE(XML外部实体注入) 1. XML基础结构 XML声明 XML文档定义类型: XML约束 XML实体(内部实体、外部实体、参数化实体) XML文档 2. XXE攻击原理 当XML解析器在解析引用外部实体时,可能导致: 数据泄露 拒绝服务 SSRF(服务器端请求伪造) 端口扫描 远程代码执行 3. XXE攻击方式 获取服务器目录或文件 拒绝服务攻击 盲注(数据无回显时将数据发送到远程攻击服务器) 4. XXE防御措施 设置XML解析器禁用DTD 设置XML解析器禁用外部实体 验证HTTP头中的content-type及accept 过滤提交数据中的 <!DOCTYPE 和 <!ENTITY 五、实战题目解析 SQL Injection 07 SQL Injection 08 SQL Injection(advanced) 03 SQL Injection(advanced) 05 SQL Injection(mitigation) 08 XXE 03 XXE 04 XXE 07 六、安全注意事项 重要声明 :文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途以及盈利等目的,否则后果自行承担!