双查询注入
关于Mysql注入过程中的三种报错方式 - 网站安全 - 红黑联盟
https://www.cnblogs.com/BloodZero/p/4660971.html
sql注入那些事儿——如何优雅地进行SQL注入(3) - 简书
SQL双查询注入 详解 - 付杰博客
相关wp:
Sqli-Labs之less-5(双注入解法)_ISNS的博客-CSDN博客
双查询注入SQL Double Injection
-
原理
当在一个聚合函数(如count函数),后面如果使用分组语句就会把查询的一部分以错误的形式显示出来,是报错形式的一种,其实就是一个select语句中再嵌套一个select语句
对于双查询注入,需要先了解“count()、rand()、floor()、concat()”这三个函数的功能以及group by语句的用法。
1.rand() 函数 随机生成一个0-1之间的数,包含0不包含1

值得注意的是,当rand()函数,括号里面为固定的数值,其产生的0-1之间的随机数也是固定的(伪随机)。


2.floor() 函数 向下取整函数
如0-1之间的小数取整为0


3. count()函数 聚合函数,函数返回表中的记录数
如下列语句就是输出security数据库下的表的数量




4.concat函数
可以拼接字符串

可以拼接查询到的内容

5.concat_ws函数 两个或多个表达式与分隔符相加
如下列语句的意思为将 hello,the,ctf,world 四个表达式用 + 连接起来并输出

6.group_by函数 对查询结果进行分组
如,group_by column.name表示用column.name列查询结果进行分组
没有分组时对所有数据库中的表名的输出

分完组后对所有数据库下的表名的输出

这里用了group by table_schema,用数据库名来对查询的结果进行分组,所以只显示了不重复的数据库,而在同一个数据库只显示其第一个表名。
-
“count()、rand()、floor()、concat()”的组合使用
产生随机整数
select floor(rand(12)*2) from information_schema.tables limit 0,6;

在结果只能为0或1的情况下,产生的随机整数数列的前四位为0,1,1,0
count 和 group by 组合使用
统计各个数据库下中各有多少个表
select table_schema,count(*) from information_schema.tables group by table_schema;

我们猜测在做这样的统计时,Mysql会建立一张临时表,有 group_key 和 tally 两个字段,其中 group_key 设置了 UNIQUE(唯一)约束,即不能有两行的 group_key 列的数据值相同。
使用group by语句和count()函数的时候,mysql数据库会先建立一个虚拟表,当查询到新的键不在虚拟表中,数据库就会将其插入表中,如果数据库中已存在该键,则找到该键对应的计数字段并加1。
这里借用SQL双查询注入 详解 - 付杰博客的理解




,


SQL双查询注入
1.获取mysql当前数据库:

2.读Mysql数据库用户名:
select concat((select user from mysql.user limit 1), floor(rand(14)*2)) c, count(*) from information_schema.columns group by c;

3.读取数据库密码

文章详细介绍了SQL双查询注入的概念,通过使用MySQL中的count(),rand(),floor()等函数,结合group_by语句,展示如何在聚合函数后的分组语句中暴露信息。这种方法允许攻击者通过构造特定的SQL查询来获取数据库信息,如当前数据库名、用户名和密码。
4434

被折叠的 条评论
为什么被折叠?



