sql注入基础篇——报错注入

前言:当联合注入受到限制的时候,可以利用数据库的报错机制,人为的创造错误,使得结果集出现在报出的错误中

1.extractvalue()函数

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--+

2.updatexml()

用法和上面大同小异

updatexml(a,b,c) 同样是第二个参数出错导致错误信息导致携带出来

?id=1 and (select (updatexml('任意值',concat('~',select语句),'任意值'))) --+

3.groupby和floor,rand连用导致的主键重复

这个很多博客上讲了但是没讲清楚

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),已经存在了,主键重复。

你可能感兴趣的:(SQL注入,mysql,sql,web)