1、基础知识
开始讲解MYSQL双查询错误以前,咱们先了解一下双查询语句以及须要使用到的几个数据库函数和GROUP BY语句css
1. 双查询语句mysql
先了解一下什么是子查询,子查询就是嵌入第一层select语句中的select语句,好比:css3
SELECT * FROM score WHERE even_id IN (SELECT even_id FROM grade_event WHERE category = 'T');
功能:该语句实现的是找出与考试类别('T')相对应的全部考试事件行的ID,而后利用它们来查找那些考试的成绩
双查询语句就是此类使用了两个select的查询语句sql
2. 数据库函数和GROUP BY语句数据库
1)rand() --- 随机数生成函数函数
2)floor() --- 向下取整函数测试
3)concat() --- 字符串链接函数url
4)count() --- 统计函数spa
5)group by --- 给出分组条件.net
2、环境搭建
(1)建立数据库 create database injection; (2)建立表 create table user ( id int, name varchar(15) ); (3)往表中插入3条数据 insert into user value(1,'mike'); insert into user value(2,'anna'); insert into user value(3,'andy'); 数据库版本:mysql-5.7.27
3、查询操做
1. SQL语句
select count(*), concat((select database()), floor(rand()*2)) as a from user group by a;
2. 执行状况

3. 操做结果
能够看到在第二次执行咱们的SQL语句时发生了错误,从错误提示中咱们获知了数据库的名字:injection.
4、靶场测试
下面咱们利用SQLI-LABS这个SQL注入靶场作一次利用SQL双查询错误进行注入攻击,地址以下:
http://43.247.91.228:84/Less-5/
在上面的网址后加入:
?id=1‘ union select 1, count(*), concat((select database()), floor(rand()*2)) as a from information_schema.tables group by a --+
也许是运气好,第一次执行就获得了想要的结果,以下:

从上图中能够看出,咱们已经获得了数据库的名字:security. 接下来能够一步一步构造要注入的SQL语句获取信息,在下
一篇讲解双查询错误原理后,会讲解如何构造注入语句来获取数据库信息.