当注入点不回显数据库查询的数据,那么通过一般的注入手段是无法返回相关数据库的信息,但是,如果查询时输入错误SQL代码会报错,并且是通过mysql_error(),mysqli_error()等返回错误,那么就存在报错注入的可能性。
所需函数
报错注入需使用Mysql函数XML Functions:
名称 | 描述 |
---|---|
ExtractValue() | 使用XPath表示法从XML字符串中提取值 |
UpdateXML() | 返回替换的XML片段 |
updatexml() 函数报错注入原理
- updatexml() 函数定义
UPDATEXML (XML_document, XPath_string, new_value);
第一个参数:XML_document是String格式,为XML文档对象的名称;
第二个参数:XPath_string (Xpath格式的字符串);
第三个参数:new_value,String格式,替换查找到的符合条件的数据;
- updatexml() 函数运行机制
该函数对XPath_string进行查询操作,如果符合语法格式要求,则用第三个参数替换,不符合语法格式要求,则会报错并带出查询的结果
- updatexml() 函数运行示例
正常查询:
select updatexml('<a>c</a>','/a','<a>b</a>');
因为xpath语法中 “~” 是非法字符所以可以用 “~” 构造报错:
select updatexml('<a>c</a>','~x~','<a>b</a>');
注意:两个函数查询出的结果显示长度限制为32位,如果超出显示长度需要使用left()或right()函数。
函数 | 描述 | 用法 |
---|---|---|
left() | 从左开始截取字符串 | left(str, length)==>left(被截取字符串, 截取长度) |
right() | 从右开始截取字符串 | right(str, length)==>right(被截取字符串, 截取长度) |
concat()函数为字符串连接函数显然不符合规则,但是会将括号内的执行结果以错误的形式报出
extractvalue()函数报错注入原理
- extractvalue()函数定义
EXTRACTVALUE (XML_document, XPath_string);
第一个参数:XML_document是String格式,为XML文档对象的名称;
第二个参数:XPath_string (Xpath格式的字符串);
作用:从目标XML中返回包含所查询值的字符串;
- 使用示例:
正常运行
select extractvalue('<a>ccc<b>ddd</b></a>', '/a') ;
同样的,使用“~”引起报错
(count()、rand()、group by)联合报错注入原理
运行机制:
mysql在遇到select count() from table group by floor(rand(0)2)语句时,首先会建立一个虚拟表,其中floor(rand(0)2)产生值为0和1的固定序列,使用group by的时候floor(rand(0)2)会被执行多次,从而造成主键冲突引起报错