前言:当联合注入受到限制的时候,可以利用数据库的报错机制,人为的创造错误,使得结果集出现在报出的错误中
extractvalue(xml_document,Xpath_string)是以Xpath_string格式字符串对xml_document进行查询的函数 。
xml_document xml:xml文档对象 要求是一个String类型。
Xpath_string :Xpath格式要求的字符串。
利用如果不是Xpath语法格式的字符串则报错并将结果包含在错误中。
注:
1.不满足Xpath语法格式的字符串如以特殊符号开头数字开头 #?&*~什么之类
2.concat(a,b)=ab
因此?id=1 and select (extractvalue('任意值',concat('#','select语句'))) --+
?id=1%27%20and%20(select%20extractvalue(%27~%27,concat(%27~%27,(database()))))%20--+
用法和上面大同小异
updatexml(a,b,c) 同样是第二个参数出错导致错误信息导致携带出来
?id=1 and (select (updatexml('任意值',concat('~',select语句),'任意值'))) --+
这个很多博客上讲了但是没讲清楚
select count(*) from 表 group by rand(0);
rand(0)是一个伪随机序列,白话说就是一个固定的序列,他的值是011011
这里的0和1可以理解为一个值,比如jack为0和tom为1。首先他会建立一个虚表,虚表的格式是默认有一个主键,主键为group by后面的,但是建立主键是一行一行读取,发现没有就建立。
虚表一开始什么都没有,然后他会读取rand(0),第一个值为0(jack),他发现没有虚表里面没有,他就会建立一个主键0(jack),但是建立的时候他会再运算一次,也就是说实际上他建立的是1(tom),他运算了两次(重点),接下来rand(0)又读取到1(tom),主键遇到重复的加count(*)+1,然后遇到0(jack),发现主键里面依旧没有0(jack),他就会建立主键0(jack),但是建立的时候rand(0)会再运算一次,又会建立1(jack)作为主键,这个时候虚表就报错了,因为建立的主键是1(jack),已经存在了,主键重复。