记录--SQL报错注入

it2024-12-01  12

这篇文章,写的很详细。但是自己在看的时候有些地方还是需要记录一下。 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 以此类推::::::::以后都不插了,所以只返回两条记录

最新回复(0)