1 盲注基本概念
- 如果每個應用程式都能按照我們輸入的SQL 命令回傳我們需要的資料, 那應用程式就無安全性可言了! 為此, 程式設計者們想到一個辦法, 那就是無論輸入何種命令, 只要SQL 陳述句導致資料庫產生錯誤, 那么應用程式就會回傳一個“ 通用的" 的頁面, 或者重定向一個通用頁面( 可能為網站首頁) ,這時,回顯方式的SQL 注入辦法就無法使用了,
盲注, 即在SQL 注入程序中, SQL 陳述句執行選擇后, 選擇的資料不能回顯到前端, 需要使用特殊的方法進行判斷或嘗試, 這個程序稱為盲注,
盲注分為兩類:
- 基于布爾型SQL 盲注:
基于布爾型SQL 盲汁即在SQL 注入程序中, 應用程式僅僅回傳True( 頁面) 和False( 頁面) ,無法根據應用程式的回傳頁面得到需要的資料庫資訊,但是可以通過構造邏輯判斷( 比較大小) 來得到需要的資訊,
- 基于時間型SQL 盲注:
注入SQL 代碼之后, 存在以下兩種情況:
- 如果注入的SQL 代碼不影響后臺[ 資料庫] 的正常功能執行, 那么Web 應用的頁面顯示正確( 原始頁面) ,
- 如果注入的SQL 代碼影響后臺資料庫的正常功能( 產生了SQL 注入) , 但是此時Web 應用的頁面依舊顯示正常( 原因是Web 應用程式采取了“ 重定向" 或“ 屏蔽" 措施),
產生一個疑問:注入的SQL 代碼到底被后臺資料庫執行了沒有? 即Web 應用程式是否存在SQL 注入?
面對這種情況,之前講的基于布爾的SQL 盲注就很難發揮作用了( 因為基于布爾的SQL 前提是Web 程式回傳的頁面存在true 和false 兩種不同的頁面),這時, 一般采用基于web 應用回應時間上的差異來判斷是否存在SQL 注入, 即基于時間型SQL 盲注,
2 MySQL盲注關鍵函式
2.1 判斷結果的記錄數COUNT()
count(columu_name)函式
函式回傳指定列的值的數目(NULL 不計入)
語法示例:
Select count (user) from users; // 回傳表中user列的記錄數
select count(*) from users; // 回傳表中的記錄數
示例如圖所示:
2.2 回傳資料中的某幾行資料 imit()
Limit(m,n) 函式
說明:m 代表從m+1 條記錄行開始檢索,n 代表取出n 條資料,( m 可設為0 )
語法示例:
select * from 表名 limit m,n;
select user from users limit 0,1; // 檢索記錄行1
示例如圖所示:

2.3 內容長度判斷函式length()
length() 函式
length() 函式回傳文本欄位中值的長度,
語法示例:
select length(user) from users;
示例如圖所示:
2.4 字串截取函式mid(), substr() ,substring(),left()
字串截取函式有幾個類似函式,mid(), substr() ,substring()和left() , 其中前三個函式用法基本一致
mid (string,start,length) 函式
其中,每個引數的含義如下:
- string( 必需) 規定要回傳其中一部分的字串,
- start( 必需) 規定開始位置(起始值是1) ,
- length( 可選)要回傳的字符數,如果省略, 則mid() 函式回傳剩余文本,
substring(string,start,length) 和substr(string, start, length)
函式實作的功能是一樣的, 均為截取字串,
其中,每個引數的含義如下:
- string( 必需) 規定要回傳其中一部分的字串,
- start( 必需) 規定開始位置(起始值是1) ,
- length( 可選)要回傳的字符數,
語法示例:

left (string,length) 函式
截取指定長度的字串
其中, 每個引數的含義如下:
- string (必需) 規定要回傳其中一部分的字串,
- length (可選) 規定被回傳字串的前length 長度的字符

2.5 字符轉ascii 碼函式ascii()
Ascil() 函式
將字符轉化為ascii 碼,如果是字串, 則回傳的最左字符的數值,也就是第一個字符的ascii 值,如果字串為空字串,則回傳NULL ,如果字串為NULL, ASCII() 回傳數值是從0 到255 隨機,
語法示例
select ascii(substr(user,1,1)) from users limit 0,1;
示例如圖所示
3 基于布爾邏輯的盲注
基于布爾型SQL盲注即在SQL 注入程序中,應用程式僅僅回傳True(頁面)和FaIse(頁面), 但不會回顯程式回傳資訊,對于布爾型盲注可以通過構造邏輯判斷( 比較大小) 來得到資料庫內容資訊,
盲注的步驟與注入陳述句:( 注入需要在注入點拼接注入陳述句,實作邏輯判斷)
1 、判斷當前資料庫名長度與資料庫名
- And length(database())>n / / 判斷當前資料庫長度
- And ascii(substr(database(),m,1))> n / / 截取資料庫名第m 個字符并轉換為ascii 碼
2 、判斷資料庫的表長度與表名
- And length((select table_name from information_schema.tables where table_schema='dvwa' limit 0,1)) > n // 判斷第一行表名的長度
- And ascii((substr(select table_name from information_schema.tables where table_schema='dvwa' limit 0,1),m,1)) > n // 截取第一行表名的第m 個字串并轉換為ascii碼
3 、判斷資料庫的欄位名長度與欄位名稱
- And length ((select column_name from information_schema.columns where table_name='users' limit 0,1)) >n // 判斷表中欄位名的長度
- And ascli((substr(select column_name from information_schema.columns where table_name='users' limit 0,1),m,1)) >n // 截取表中欄位的第m 字串并轉換為ascii碼
4 、判斷欄位的內容長度與內容字串
- And length((select user from users limit 0,1)) > 1 / / 判斷字串內容長度
- And ascii(substr((select user from users imit 0,1),m,1)) / / 截取第m 個字串并轉換為ascil碼
4 SQL盲注——dvwa演示

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/41003.html
標籤:其他
