sql双查询注入

0x01 函数知识点

rand():产生随机数,有参数如rand(0) 产生同一个数
floor():向下舍入为指定小数位数 如:floor(3.45)>>3 最接近的较小整数(floor地板的意思)
group by:以某一规则排列字段值

0x02 造错解析

参考文献:https://www.2cto.com/article/201604/498394.html

报错语句中count(),group by ,floor(),rand()充当的作用

  • count():统计键的值。

  • group by :建立虚拟表,group by x 中的x作为键。

  • rand(0):持续产生相同的数值,但产生不同的0或1,其实有点困惑待解答。。。

  • floor(rand(0)*2):计算0和1值,作为键。

报错流程:mysql因group by建立虚拟表,count()会统计并计算floor(rand(0)2)值,每统计一次,floor(rand(0)2)就被执行一次。当出现重复的键,sql出现报错。

sql语句可编辑为:select count(*),concat(0x7e,(select database()),0x7e),floor(rand(0)*2))x from information_schema.tables group by x;;

若要查询表的话就要考虑数据数量对表造成的影响,需要添加limit 0,1
select concat(0x7e,(select table_name from information_schema.tables limit 0,1),0x7e,floor(rand(0)*2))x,count(*) from information_schema.schemata group by x;

总而言之:双查询注入cout(),group by,floor(),rand()缺一不可


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!