sql基于报错注入rand() floor() count()

sql基于报错注入rand() floor() count()

大家好,笔者在学习这个知识点时花了不少时间精力,在网上查找资料,发现网上讲的比较复杂。这里总结一下自己学习的经验。

实验环境:sqli

在此用sqli第五关为例
sql基于报错注入rand() floor() count()
大家可以看到,在登录成功时只会显示you are in
sql基于报错注入rand() floor() count()
只有在报错的时候会显示报错信息。
这时候我们就可以构造一些sql语句,通过报错回显,回显一些我们想要的信息。
直接上结果
sql基于报错注入rand() floor() count()

sql语句:union select count(*),concat(user(),database(),floor(rand(0)*2))x,3 from information_schema.tables group by x --+

大家可以看到已经成功回显的登录用户和数据库。

现在给大家解释一下这个语句什么意思,
首先我们要让它报错id=0,然后单引号截断,union联合查询,
(知道这些函数怎么用的直接往下滑)

count():是一个计数的函数,count(*)表示所有表记录数量

例如:
sql基于报错注入rand() floor() count()
floor():向下取整
rand():生产0-1的随机数;括号里可以填种子,它就会按种子的规律生产数。
那么floor(rand(0)*2)得出的是个什么东西呢?
sql基于报错注入rand() floor() count()
可以看到,第一次是0,第二次是1 …
concat(字符串1,字符串2):把字符串连接起来。

那么concat(user(),database(),floor(rand(0)*2))的意思就是把登录用户和数据库名以及一个不随机的随机数连起来。

结果就是:登录户名数据库名0
这有什么用呢?
count()和group by 一起用时会建立一个虚拟表来计算

查询的时候使用rand()会被计算多次

在使用group by的时候,floor(rand(0)* 2)会被执行一次,如果虚表不存在记录,插入虚表的时候会再被执行一次

画了个表,有点不太恰当。
sql基于报错注入rand() floor() count()
虚表中有两个字段key和count(*)

key 不能重复不然就会报错

注意细品
当第一次查询时得[email protected],表中没有,
但插入时有会执行一次,floor(rand(0)*2),concat(user(),database(),floor(rand(0)*2))就得
[email protected],实际插入就是[email protected]

接着查询 得[email protected],表中存在,直接插入,[email protected]的count加1

再往下,得[email protected],表中没有,就要插入,但因为rand()会多次执行,floor(rand(0)*2)改变,变成[email protected],实际插入就是[email protected]
这时候问题就来了,[email protected]已经有了,不能再插入了,key不能重复,所以就会报错:
ERROR 1062 (23000): Duplicate entry ‘[email protected]’ for key ‘group_key’
这正是我们想要的

这是笔者自己的理解不对的地方望大家海涵
我写得不是很详细,
大家可以看看类似文章补充一下知识
https://www.cnblogs.com/xishaonian/p/6227405.html
https://www.2cto.com/article/201604/498394.html

附上别人的sql语句:
127.0.0.1/sqli/Less-5/?id=1 union select 1,2,3 from (select count(*),concat((select concat(version(),database(),user())limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a --+

小白疑问小结:
sql语句:union select count(*),concat(user(),database(),floor(rand(0)*2))x,3 from information_schema.tables group by x --+
——————————————————————————————————————
问:语句中的x是什么意思?
答:x代指concat(user(),database(),floor(rand(0)*2)),类似 as的意思
——————————————————————————————————————
问:语句中的3什么意思?
答:3是凑数用的,因为源查询语句是查询3个字段,所以union select也要查询3个字段,不然会报错。
——————————————————————————————————————