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
中,exp
与ln
和log
的功能相反,简单介绍下,就是log
和ln
都返回以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 是零个或多个 geometry 或 geographyLineString 实例的集合。
(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)使用场景
并不常用的报错方式可用来尝试。
叼茂SEO.bfbikes.com