接着前边的,这篇的内容就是DNSlog盲注,报错注入,flase注入,有些不懂的东西可以看前面一篇。
报错注入
常用的三种注入 方法是floor()报错注入、updatexml()、extractvalue()。
其实这些注入的核心语句都是union注入的语句。只是在语法上有不同。
下边先说floor()报错注入。
在第一篇讲过。
rand()用于产生一个0~1的随机数。
floor()向下取整。
group by是根据一个或多个列对结果集进行分组的sql语句,其用法为:
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;
报错原理是在这张虚拟表中,group by后面的字段作为主键,所以这张表中主键是name,这样我们就基本弄清报错的原因了,其原因主要是因为虚拟表的主键重复。按照MySQL的官方说法,group by要进行两次运算,第一次是拿group by后面的字段值到虚拟表中去对比前,首先获取group by后面的值;第二次是假设group by后面的字段的值在虚拟表中不存在,那就需要把它插入到虚拟表中,这里在插入时会进行第二次运算,由于rand函数存在一定的随机性,所以第二次运算的结果可能与第一次运算的结果不一致,但是这个运算的结果可能在虚拟表中已经存在了,那么这时的插入必然导致主键的重复,进而引发错误。
floor(rand(0)*2)报错的原理是恰恰是由于它的确定性,因为floor(rand()*2)不加随机因子的时候是随机出错的,而在3条记录以上用floor(rand(0)*2)就一定报错,由此可猜想floor(rand()*2)是比较随机的,不具备确定性因素,而floor(rand(0)*2)具备某方面的确定性。
updatexml()报错
updatexml(xml_document,xpath_string,new_value)
第一个参数:xml_document是string格式,为xml文档对象的名称 第二个参数:xpath_string是xpath格式的字符串
第三个参数:new_value是string格式,替换查找到的负荷条件的数据 作用:改变文档中符合条件的节点的值
updatexml的爆错原因很简单,updatexml第二个参数需要的是Xpath格式的字符串。当我们输入的内容不符合,产生报错。
语句也十分简单。
下边以sqli-lib第一关为例
?id=1'and(select updatexml(1,concat('~',(select database())),1))--+
得到数据库之后,继续查看表。
'and(select updatexml(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema=database())),0x7e))--+
接下来就是爆列。
'and(select updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_name="users" limit 1,1)),0x7e))--+
在这因为他的字符串比较多,显示不全,所以我用了limit 将他们分别输出。
同样爆内容的时候,也是这样。
'and(select updatexml(1,concat(0x7e,(select password from security.users limit 1,1)),0x7e))--+
extractvalue报错注入
extractvalue函数
extractvalue(xml_document,Xpath_string)
第一个参数:xml_document是string格式,为xml文档对象的名称
第二个参数:Xpath_string是xpath格式的字符串
作用:从目标xml中返回包含所查询值的字符串
第二个参数是要求符合xpath语法的字符串,如果不满足要求,则会报错。这个其实跟updatexml()没啥区别,都一个d样。
下边以sqli-lib第一关为例
'and(select extractvalue(1,concat('~',(select database()))))
成功爆出了数据库。
剩下的步骤各位自行脑补吧。。。(此处省略xxx字)
搜索注入
没时间写先烂着尾吧...