天天看點

sqlmap源碼分析

sqlmap是一個不錯的sql注入掃描工具和注入工具。前段時間分析了一下它的源代碼,這裡将分析結果和一些修改意見加入供大家參考讨論。 主要讨論他是如何判斷一個URL存在SQL注入的。 在分析之前先看看sqlmap的配置檔案sqlmap.conf,這對分析sqlmap的掃描過程很有幫助(我就是從這個檔案看起的)。 從sqlmap.conf中幾乎可以分析出sqlmap所有的掃描方式。 現在開始分析一下sqlmap真個的掃描過程。這裡就不說源代碼了,直接描述他的掃描過程,然後分析一下它的每一步是怎樣做到的。 (1)、測試主機是否存活,也就是判斷網頁是否可以浏覽到。 在處理完複雜的指令行參數之後,sqlmap開始測試每一個URL是否是存活的。如果主機是存活的則将獲得的網頁内容儲存下來作為以後blind-sql_inject之用。 注:如果是使用者直接輸入的網址,在大部分情況下都是可以通路的。如果是由爬蟲爬到的網址,就會有一部分過期的網址無法通路。通過測試連接配接決定是否繼續進行SQL注入掃描可以節省很多時間。 (2)、測試網頁是否穩定,也就是測試網頁是否有随時間變化的東西,比如滾動的廣告等。 原理是:在間隔比較短的時間内各取一次同一個網頁,然後測試兩次所取到的内容是否相同。如果不同則說明頁面内容是動态變化的。如果相同,就計算網頁的MD5值儲存起來,表示本頁面是stable的。測試網頁是否穩定還可以使用其他的辦法。如:使用者提供字元串,如果兩次所取的網頁中都包含這個字元串,就認為兩次所取的網頁是相同的。提供的字元串還可以是正規表達式,來達到更加準确的判斷。 注:這樣的判斷是很有意義的,在後面判斷一個URL是否存在SQL注入時使用的blink-sql_injection方法就用到了比對兩次網頁之間的不同。這就要求網頁本身是穩定的,或者至少是相對穩定的。 (3)、測試URL中的某一個參數是否是動态的,也就是說這個參數是否是決定頁面内容的關鍵參數。 原理是:使用一個随機數或者随機字元串(取決于需要替換的參數類型)來替換原來的參數,然後和原來的頁面(步驟2中儲存的MD5或其他的辨別參數)進行對比。如果不同,則說明此參數是關鍵參數并可以用來進行sql注入掃描。否則忽略這個參數。 注:在一些頁面參數中,可能某些參數是固定不變的。這樣的參數無法用來進行sql注入掃描。忽略一些靜态參數可以節省很多時間。 (4)、注入檢測,也就是使用各種注入方法對目标URL中的各個參數做注入檢測。 原理是:将存在的注入 漏洞分為三類:1、普通注入。2、數字類型注入。3、單引号注入。4、雙引号注入。其中的單引号注入和雙引号注入又分為普通的和使用LIKE類型的。 首先讨論一下網頁相似度判斷:如果執行指令時設定了關鍵字元串或者關鍵的正規表達式,那麼使這些字元串和正規表達式判斷網頁的相似度(TRUE或者 FALSE)否則,如果儲存有網頁的MD5值(說明此頁面是stable的),這個時候将最近一次獲得網頁和原始網頁相比。如果此次比較的MD5值大于 0.6且小于1,将相似度閥值設定為這個值。如果此次檢查的MD5值小于0.6,這個時候将相似度的閥值設定為0.9。如果沒有網頁的MD5值(網頁不是 stable的),這個時候将相似度的閥值設定為0.9。在以後的比較中,如果相似度大于這個閥值,就認為兩次獲得的網頁相同(傳回TRUE),否則認為不相同(傳回FALSE)。 判斷相似度使用difflib庫中的seqMatcher類。 檢測過程:假設URL參數原來為o_value,替換為新的參數為n_value,字首為prefix,字尾為postfix,圓括号數量為num預設為0(檢測注入時設為0,實施注入時需要測試這個值的确切值)。 1、當設定有字首,字尾時首先檢查。如果沒有設定就直接執行2。檢查方法為:将o_value替換為 o_value prefix )*num AND (*num random_int = random_int postfix (TRUE) o_value prefix )*num AND (*num random_int = random_int+1 postfix(FALSE) 如果以上兩條件都成立,則認為這個參數存在普通SQL注入,否則執行2。 o_value prefix )*num AND (*num random_str postfix (FALSE) 如果上面三條件都成立,則認為這個參數是普通注入即第一類注入。 2、以下均為未設定字首字尾時的檢查情況。 o_value )*num AND (*num random_int = random_int (TRUE) o_value )*num AND (*num random_int = random_int+1 (FALSE) 如果以上兩條件都成立,則認為這個參數存在數字型SQL注入,否則執行3。 o_value )*num AND (*num random_str (FALSE) 如果上面三條件都成立,則認為這個參數是數字型注入即第二類注入。 3、 www.2cto.com o_value’)*num AND (*num’random_str’=’random_str (TRUE) o_value’)*num AND (*num’random_str’=’random_str+單個随即字元 (FALSE) 如果以上兩條件都成立,則認為這個參數存在單引号SQL注入,否則執行4。 o_value’)*num AND (*num random_str (FALSE) 如果上面三條件都成立,則認為這個參數是單引号注入即第三類注入。 4、 o_value’)*num AND (*num’random_str’LIKE’random_str (TRUE) o_value’)*num AND (*num’random_str’LIKE’random_str+單個随即字元 (FALSE) 如果以上兩條件都成立,則認為這個參數存在LIKE單引号SQL注入,否則執行5。 o_value’)*num AND (*num random_str (FALSE)   —————————————————————————如果上面三條件都成立,則認為這個參數是LIKE單引号注入即第三類注入。 5、 o_value”)*num AND (*num”random_str”=”random_str (TRUE) o_value”)*num AND (*num”random_str”=”random_str+單個随即字元 (FALSE) 如果以上兩條件都成立,則認為這個參數存在雙引号SQL注入,否則執行6。 o_value”)*num AND (*num random_str (FALSE) 如果上面三條件都成立,則認為這個參數是雙引号注入即第四類注入。 6、 o_value”)*num AND (*num”random_str”LIKE”random_str (TRUE) o_value”)*num AND (*num”random_str”LIKE”random_str+單個随即字元 (FALSE) 如果以上兩條件都成立,則認為這個參數存在LIKE雙引号SQL注入。 o_value”)*num AND (*num random_str (FALSE) 如果上面三條件都成立,則認為這個參數是LIKE雙引号注入即第四類注入。 以上所有的TRUE和FALSE值都是有前面所述的判斷頁面是否相同的算法傳回的判斷值。 前面的算法描述可能不清楚,以後有時間再補個流程圖。這隻是判斷是否存在SQL注入的過程,在真正實施注入的時候還需要判斷其他的一些内容(例如其中圓括号的個數, 資料庫類型),以後再分析

繼續閱讀