MySQL报错原因总结

1.重复数据报错,这里的重复主要有两个方面,其中之一是基于主键的唯一性:一个表主键必须是唯一的,如果一个表尝试生成两个相同的主键,就会爆出Duplicate entry '1' for key 'group_key'的主键重复错误,于是根据这种报错就产生了floor(rand(0)*2)等注入手法。

2.基于列名的唯一性,如果我们----在一个表中构造了两个相同的列名,就会产生Duplicate column name的错误,报错方法通常有NAME_CONST,或者利用join和using关键字连接同一个表创建子查询进行报错。

3.基于数据类型不一致而产生的报错:mysql的一些函数参数要求的是什么数据类型,如果数据类型不符合,自然就会报错,这种报错也是相对容易理解的,根据这种特性产生的报错注入有updatexml,extractvalue等注入手法。

4.基于BIGINT溢出错误的SQL注入,根据超出最大整数溢出产生的错误,这类报错注入是在mysql5.5.5版本后才产生的。

5.其他报错,一些mysql空间函数geometrycollection(),multipoint(),polygon(),multipolygon(),linestring(),multilinestring(),通过这些报错会产生Illegal non geometric的错误,里面同时包含了我们构造查询语句的信息。

对MySQL数据库注入中的12种报错方式汇总

一、基于floor(),count(),group by联合使用而产生的报错方式

(1)Payload:

and select 1 from (select count(*),concat(查询payload),floor(rand(0)*2))x from information_schema.tables group by x)a)

(2)各元素作用

1.floor() : 返回小于等于某数的最大整数。

2.rand() : 产生一个介于0-1之间的floa随机数。rand(0)产生一个固定的随机数。rand(0)*2产生一个介于0-2之间的固定的随机数。

3.group by : 用于给数据分组。

(3)floor()报错注入分析:

Floor注入在利用相关函数时,使用and连接并用了两次select查询,故而为二次注入,且输出语句限制64个字符。

(4)适用场景:前提条件为存在注入。

判断页面在输入异常数据查询时是否有报错。(尝试payload可得)

例如:sqli-labs-less5即为上述情况。Less9异常状态下无回显故不能采用此法(时间和布尔结合性判断)。

二、基于updatexml的报错方式

(1)Payload:

Updatexml(1,count('~',(select database()),'~'),1)

(2)各元素作用

Updatexml(): 对xml文档进行修改(extracvalue为查询)。

updatexml(XML_document, XPath_string, new_value)

第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc

第二个参数:XPath_string (Xpath格式的字符串)。

第三个参数:new_value,String格式,替换查找到的符合条件的数据

若页面将'~'转义,可将其转换成16进制。

(3)updatexml报错注入分析:

updatexml注入利用当Xpath路径语法错误时的报错,报错内容含有错误的路径内容。使用and或者or连接,且输出语句限制32个字符。

(4)适用场景:前提条件为存在注入。

判断页面在输入异常数据查询时是否有报错。(尝试payload可得)

三、基于extractvalue的报错方式

(1)Payload:

Extractvalue (1,concat('~',(select database())))

(2)各元素作用

extractvalue (XML_document, XPath_string);

第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc

第二个参数:XPath_string (Xpath格式的字符串)

(3)extractvalue报错注入分析:

extractvalue注入利用当Xpath路径语法错误时的报错,报错内容含有错误的路径内容。使用and或者or连接,且输出语句限制32个字符。

与updatexml极为相似,用法也大体相同,一查一改。

(4)适用场景:前提条件为存在注入。

判断页面在输入异常数据查询时是否有报错。(尝试payload可得)

※基于updatexml注入和extractvalue注入可以用sqli-labs/less11尝试,过程不再赘述。

※注意事项:updatexml报错和extractvalue报错输出仅限32字符故要用limit限制范围。

四、基于name_const的报错方式(重复报错)

(1)Payload:

select * from (select NAME_CONST(version(),1),NAME_CONST(version(),1))a

(2)各元素作用

name_const(name,value)函数会用传入的参数返回一列结果集。传入的参数必须是常量。

(3)name_const报错注入分析:

报错原因就是因为两列列名相同,外面选择时候报错,说重复列。

(4)使用场景

大于或等于5.0.12的旧版本中,可以用来查询版本,之后在利用其它报错查数据。

鸡肋函数,办公或者其他制作网站时可用于筛查。

五、基于join的报错方式(已知库名和表名时可用来获取列名或用于绕过","被注释的情况)

(1)Payload:

select * from(select * from 库名.表名 a join 库名.表名 b)c

(2)各元素作用

join 用于根据两个或多个表中的列之间的关系,从这些表中查询数据。

数据库中的表可通过键将彼此联系起来。主键(Primary Key)是一个列,在这个列中的每一行的值都是唯一的。在表中,每个主键的值都是唯一的。这样做的目的是在不重复每个表中的所有数据的情况下,把表间的数据交叉捆绑在一起。

可以使用的 JOIN 类型,以及它们之间的差异。

1.JOIN: 如果表中有至少一个匹配,则返回行

2.LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行

3.RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行

4.FULL JOIN: 只要其中一个表中存在匹配,就返回行

(3)join报错注入分析:

1.比较列名是否有重复,会返回重复列名。

2.可作为连接符代替特殊字符。

(4)使用场景

已知库名和表名时可用来获取列名或用于绕过","被注释的情况。

六、基于exp的报错方式

(1)Payload:

exp(~(select * from (select user())a))

(2)各元素作用

MySQL中,explnlog的功能相反,简单介绍下,就是logln都返回以e为底数的对数

指数函数为对数函数的反函数,exp()即为以e为底的对数函数(exp注入适用于MySQL5.5.5以上)

(3)exp报错注入分析:

通过子查询与按位求反,造成一个DOUBLE overflow error,并借由此注入返回数据

(4)使用场景

属于BigInt溢出型注入,用求反的方式爆出数据。

七、基于GeometryCollection()报错(混合数据类型)

(1)Payload:

GeometryCollection((select from(select from(select user())a)b))

(2)各元素作用

GeometryCollection 是零个或更多个 geometry(几何) 或 geography(地理) 实例的集合。

GeometryCollection 可以为空。

(3)GeometryCollection报错注入分析:

因为输入查询的数据并不满足Geometry或者Geography,会产报错,并借由此注入返回数据。

(4)使用场景

并不常用的报错方式可用来尝试。

八、基于polygon()报错

(1)Payload:

polygon((select from(select from(select user())a)b))

(2)各元素作用

Polygon 是存储为一系列点的二维表面,这些点定义一个外部边界环和零个或多个内部环。

(3)polygon报错注入分析:

因为输入查询的数据并不满足polygon函数储存数据的条件,会产生报错,并借由此注入返回数据。

(4)使用场景

并不常用的报错方式可用来尝试。

九、基于multipoint()报错

(1)Payload:

multipoint((select from(select from(select user())a)b))

(2)各元素作用

MultiPoint 是零个点或更多个点的集合。 MultiPoint 实例的边界为空。

(3)multipoint报错注入分析:

因为输入查询的数据并不满足multipoint函数储存数据的条件,会产生报错,并借由此注入返回数据。

(4)使用场景

并不常用的报错方式可用来尝试。

十、基于multlinestring()报错

(1)Payload:

multilinestring((select from(select from(select user())a)b))

(2)各元素作用

MultiLineString 是零个或多个 geometrygeographyLineString 实例的集合。

(3)multlinestring报错注入分析:

因为输入查询的数据并不满足函数储存数据的条件,会产生报错,并借由此注入返回数据。

(4)使用场景

并不常用的报错方式可用来尝试。

十一、基于multpolygon()报错

(1)Payload:

multipolygon((select from(select from(select user())a)b))

(2)各元素作用

MultiPolygon 实例是零个或更多个 Polygon 实例的集合。

(3)multpolygon报错注入分析:

因为输入查询的数据并不满足函数储存数据的条件,会产生报错,并借由此注入返回数据。

(4)使用场景

并不常用的报错方式可用来尝试。

十二、基于linestring()报错

(1)Payload:

linestring((select from(select from(select user())a)b))

(2)各元素作用

LineString 是一个一维对象,表示一系列点和连接这些点的线段。

(3)linestring报错注入分析:

因为输入查询的数据并不满足函数储存数据的条件,会产生报错,并借由此注入返回数据。

(4)使用场景

并不常用的报错方式可用来尝试。

最后修改:2020 年 08 月 10 日 08 : 44 PM
请作者喝杯奶茶吧~