SQL註入工具實踐
程序簡介
超級SQL註入工具(SSQLInjection)是一款基於HTTP協議自組包的SQL註入工具,支持出現在HTTP協議任意位置的SQL註入,支持各種類型的SQL註入,支持HTTPS模式註入。
超級SQL註入工具目前支持Bool型盲註、錯誤顯示註入、Union註入,支持Access、MySQL5以上版本、SQLServer、Oracle等數據庫。
超級SQL註入工具采用C#開發,底層采用Socket發包進行HTTP交互,極大的提升了發包效率,相比C#自帶的HttpWebRequest速度提升2-5倍。
超級SQL註入工具支持盲註環境獲取世界各國語言數據,解決了各種常見註入工具在盲註環境下無法支持中文等多字節編碼的數據。
工具特點:
1. 支持任意地點出現的任意SQL註入
2. 支持各種語言環境。大多數註入工具在盲註下,無法獲取中文等多字節編碼字符內容,本工具可完美解決。
3. 支持註入數據發包記錄。讓你了解程序是如何註入,有助於快速學習和找出註入問題。
4. 依靠關鍵字進行盲註,可通過HTTP相應狀態碼判斷,還可以通過關鍵字取反功能,反過來取關鍵字。
程序運行需要安裝. Net Framework 4.0。運行環境Win7,Win8環境已測試,其他環境請自測。
1.基礎信息配置
1.1.地址
打開程序在基礎配置裏面填寫需要註入地址的域名或IP地址。
1.3. SSL
如果是HTTPS傳輸的網頁需要選擇SSL,選擇SSL會切換到443端口,如果是其他端口請修改端口地址。
1.4.超時
程序使用Socket傳輸,每個HTTP請求的超時時間,如果超過此時間,程序將放棄本次請求,單位是秒。
1.5.編碼
程序在獲取HTML網頁時,采用的解碼方式,程序會自動識別網頁編碼,如果識別失敗,將采用此編碼進行解碼。編碼可以在HTTP相應頭的Content-Type或HTML頭裏面查看“charset=xxx”。
1.6.註入類型
程序目前支持Bool盲註、Union註入、錯誤顯示註入,已基本覆蓋全部註入獲取數據方式。
延時註入可以選擇Bool盲註,在判斷方式中選擇時間判斷,目前延時只支持mysql數據庫。
1.6.1.Bool盲註
Bool盲註利用數據庫的阿斯特碼(ASCII碼)或Unicode、Hex等編碼將目標數據轉換成數字,利用And條件來判斷此數字的值,判斷完成後根據對應編碼轉換成字符串。
目前Bool盲註支持Access、MySQL5、SQLServer、Oracle等數據庫,並支持中文、日文、繁體中文等世界各種語言。解決了各種註入工具在盲註環境無法獲取中文等多字節編碼的字符。
1.6.2. Union註入
Union註入利用數據庫的Union聯合查詢來獲取數據。
目前盲註環境支持Access、MySQL5、SQLServer、Oracle等數據庫。
1.6.3. 錯誤顯示註入
錯誤顯示註入利用數據庫在完成某項操作時,在程序出現錯誤時將錯誤信息顯示出來進行註入獲取目標數據。由於錯誤顯示的字符有長度限制,所以比Union註入方式稍慢,MySQL錯誤信息顯示大約最長為64個字符,Oracle錯誤顯示大約最長約為256個字符,SQLServer錯誤信息顯示大約最長為2030個字符。
目前盲註支持MySQL5、SQLServer、Oracle等數據庫。Access不支持錯誤顯示註入。
1.7. 數據庫
判斷數據庫類型,選擇對應的數據庫。
1.8. 線程
選擇程序同時能運行的線程數量,默認10個線程。
1.9. 重試
程序發送一個HTTP包失敗後,嘗試繼續發包的次數。
1.10. 自動識別
填好數據包,填寫地址和端口即可自動進行註入識別,支持GET和POST參數自動識別註入。
1.11. 導出配置
點擊導出配置,將選擇需要導出程序配置信息的路徑,程序將導出配置信息到一個XML文件中,以後可以使用菜單中的導入配置來加載配置信息。
- 註入中心
2.1. 數據包
方法一:
在數據包中輸入URL地址http://127.0.0.1:8090/mysql.jsp?id=1,在數據包空白處單擊鼠標右鍵,選擇“根據URL生成數據包”,即可自動配置GET型請求數據包,並自動設置IP地址和端口。
方法二:
使用抓包工具將HTTP發包數據抓取填寫到這裏,可使用Fiddler、Burp Suite等抓包工具,或手工配置數據包。
註意事項:如果是POST提交數據,必須有Content-Length屬性,程序才能自動計算長度。
2.2. 註入設置
2.2.1. 開啟URL編碼
開啟URL編碼後,程序將會把編碼標記中的數據進行URL編碼操作,建議選擇,因為請求參數中如果有特殊字符,可能導致發包結果不一致。
2.2.2. 302跟蹤
默認未開啟,開啟後,程序遇到302重定向時,將請求重定向的目標地址。如果可以根據狀態嗎判斷註入時,可選中,下面關鍵字配置狀態嗎=碼,進行註入。
2.2.3. 註入標記
通常手工註入使用”xxxx.asp?id=1 and 1=1”進行註入判斷,那麽這裏選中“ and 1=1”點擊標記註入,程序將在有註入的位置設置註入標記,程序註入時將標記替換成註入獲取數據的代碼。核心就是將我們測試語句中的“and 1=1”替換成標記。
示例:
標記其實就是選擇payload放在那個位置
數字型: 1 and 1=1 把and 1=1替換成標記
字符型: 1‘ and 1=1 and ‘1‘=‘1 把and 1=1替換成標記
字符型: 1‘ and 1=1# 把and 1=1替換成標記
字符型: 1‘ and 1=1-- 把and 1=1替換成標記
搜索型: 1%‘ and 1=1 and ‘%‘=‘ 把and 1=1替換成標記
2.2.4. 編碼標記
選擇數據包中需要使用URL編碼的字符,點擊標記編碼,程序將插入編碼標記。程序將自動一配置好的編碼方式進行編碼。
2.2.5. 註入取數據配置
參考我是如何開始註入章節的自動模式中的獲取數據配置。
3. 數據中心
3.1. 環境變量
3.1.1. 獲取環境變量
點擊右鍵彈出菜單,點擊獲取環境變量程序將獲取數據庫的基礎信息,Access數據庫不支持此功能。
3.1.2. 復制變量值
選中對應的變量,按右鍵復制值。
3.2. 數據庫信息
3.2.1. 獲取數據庫
點擊獲取數據庫,程序將獲取全部數據庫列表,Oracle將獲取所有用戶列表,Access沒有庫。
3.2.2. 獲取表
點擊獲取數據表,程序將獲取對應數據庫的表。
3.2.3. 獲取列
點擊獲取數據列,程序將獲取對應表的列。
3.2.4. 獲取數據
獲取開始數據,默認開始下標為0,即重第一條數據開始獲取,獲取條數可設置,但不能超過重下標開始的剩余行數。雙擊列名可進行排序操作。
3.2.5. 編碼設置
這裏的編碼設置用於Bool盲註取數據的配置,盲註如出現亂碼,可以選擇其他編碼方式嘗試獲取數據,查看是否有亂碼。這裏編碼主要用於數據庫中Hex、Ascw、Unicode等編碼函數的解碼。
3.2.6. 導出數據
點擊導出數據將選擇導出數據的磁盤路徑,程序將自動導出數據。
3.2.7. 添加節點
3.2.8. 刪除節點
3.2.9. 修改節點
4. 文件操作
4.1. MySQL Load_File讀文件
在Mysql的賬戶擁有文件讀寫權限下(一般情況下只有ROOT賬戶擁有),可在盲註、錯誤顯示、Union註入下,讀取地址路徑下的文本文件內容。填寫路徑,選擇MySQL Load_File讀文件,點擊開始即可。
4.2. MySQL Union寫文件
在Mysql的賬戶擁有文件讀寫權限下(一般情況下只有ROOT賬戶擁有),可在Union註入下,向磁盤寫文本文件。
4.3. SQLServer FileSystemObject寫文件
在SA權限下,可利用FileSystemObject寫文件,寫文件內容註入不要超過4000字節,同時如何是GET請求提交註意,一般GET提交不能超過1024個字節,所以如果沒寫成功,看看你提交的數據是否太長。
4.4. SQLServer Sp_MakeWebTask寫文件
在SA權限下,可利用Sp_MakeWebTask寫文件,寫文件內容註入不要超過4000字節,同時如何是GET請求提交註意,一般GET提交不能超過1024個字節,所以如果沒寫成功,看看你提交的數據是否太長。相比FileSystemObject成功率較低。
4.5. SQLServer利用備份數據庫寫文件
在SA權限下,可利用Back DataBase備份數據庫方法,將內容備份到文件中。此方法寫入文件後,此文件屬於數據庫備份文件,所以有一些其他多余數據。
4.6. SQLServer FileSystemObject讀文件
在SA權限下,可利用FileSystemObject讀文件,可在盲註、顯錯註入、Union註入下讀取文件。讀取文件長度不能超過4000字節。
5. 命令執行
目前此功能只支持SQLServer,在sa權限下,可利用xp_cmdshell執行操作系統命令,可選擇是否回顯執行結果。可在盲註、顯錯註入、Union註入下獲取回顯結果。執行此功能需支持多語句。
6. 註入繞過
6.1. 字符替換
替換編輯編碼內的字符,需註意的,默認系統設置在URL編碼前處理繞過字符,如果沒有選擇在URL編碼前處理繞過字符,那麽替換的字符就是URL編碼後的字符,如替換空格成//,那麽填寫的就是“%20”替換成“%2f%2f”。
6.2. 包含關鍵字
適用於MySQL數據庫的簡繞過,可人工測試可行後選擇使用/!/包含關鍵字來繞過防護。
6.3. 隨機大寫
將編碼標記內的字符進行隨機大小寫轉換,繞過SQL註入防護。
6.4. 發包延時
將每個包發送後休息一定時間在發送,繞過一些防護。
6.5. IP隨機頭
在HTTP請求頭中增加隨機IP值,這裏列出來常見的偽裝IP頭,可測試選擇對應的頭,程序會隨機產生IP。
6.6. Base64編碼
將編碼範圍內參數進行base64編碼。
7. 編碼轉換
填寫需要轉換的字符,選擇對應編碼解碼方法就行。
8. 日誌中心
8.1. 數據包歷史記錄
數據包歷史記錄記錄了程序每一個HTTP的請求與相應,可用於錯誤排查。如需要提高性能,可在菜單中的系統設置中選擇關閉HTTP發包日誌記錄。
8.2. 數據包詳情
在數據包歷史記錄中選擇一條記錄,程序將自動將詳細信息進行顯示,可以查看請求響應數據,在響應中同時按“Ctrl+Alt”鍵可以彈出查找關鍵字面板,進行關鍵字查找。
9. 批量掃描註入
導入域名或鏈接,選擇爬行或檢測註入。
10. 停止註入
10.1. 立即停止
當前功能下點擊右鍵,點擊立即停止,程序將停止當前所有線程。
11. 系統設置
開啟MySQL多字節取數據,將判斷數據是否有中文。
開啟自動檢測更新,程序將自動檢測更新。
開啟底部日誌,程序將在底部顯示日誌信息。
開啟發包日誌,程序將記錄HTTP每一個發包日誌。
開啟在URL編碼前處理繞過字符,所有繞過字符處理將處理後再進行URL編碼。
軟件關閉自動保存配置,軟件關閉時是否自動保存配置。
最大列數,自動識別註入時,自動進行Union測試時的最大測試列。
單域名最大爬行數,批量掃描註入時,如果選中爬行連接,一個域名爬行到最大鏈接數後將停止繼續爬行鏈接。
單域名最大掃描數,批量掃描註入時,單個域名最大檢測註入鏈接數。
12. 我如何開始註入?
12.1. 自動模式
自動模式適合網頁響應內容比較固定的註入檢測,自動模式只支持GET或者POST傳遞的參數的註入檢測,不支持HTTP請求屬性的註入,如Referer註入。
首先開始自動識別註入時,需要配置基礎信息,地址、端口、超時、編碼、線程、重試次數。
其次需要配置HTTP請求數據包,可以在數據包文本框裏按鼠標右鍵選擇生成GET或POST數據模板,然後修改請求的URL地址和HOST及提交數據。
? 註入http://127.0.0.1:8090/mysql.jsp?id=1 示例數據包配置:
一、 方法一
在數據包中輸入URL地址http://127.0.0.1:8090/mysql.jsp?id=1,在數據包空白處單擊鼠標右鍵,選擇“根據URL生成數據包”,即可自動配置GET型請求數據包,並自動設置IP地址和端口。
二、
首先生成GET數據包模板,修改請求URL地址,這裏取URL的根目錄“/mysql.jsp?id=1”,然後修改Host為“127.0.0.1:8090”即可。
最後點擊識別註入,就可以開始自動識別註入了,如果識別成功,會自動設置數據庫類型和註入類型,並自動進行註入標記,這時候只需要切換到數據中心選擇對應功能去獲取相關數據即可。
12.2. 手動模式
12.2.1. 基礎配置
手動模式相對自動模式配置相對復雜,但自動模式可以對付各種情況各種位置的註入。
首先需要完成基本配置,基本配置參考自動模式的整個過程。
然後需要人工對註入進行判斷後在選擇對應數據庫和註入類型,並進行標記,那麽如何進行判斷和標記呢?
首先需要判斷註入的類型,比如數字型、字符型、搜索型等,然後判斷對應的數據庫。
判斷完成後,需要對註入位置進行標記,如何判斷和標記,請往下看!
12.2.2. 判斷註入類型
12.2.2.1. 通用數字型
? URL地址:
http://127.0.0.1:8090/JavaSQLInjection/mysql.jsp?id=1
判斷註入:
改變參數id=1 and 1=1 和 id=1 and 1=2進行測試,如果1=1頁面顯示正常和原頁面一樣,並且1=2時頁面報錯或者頁面部分數據顯示不正常,那麽可以確定此處為數字型註入。
判斷數據庫類型:
使用exists函數判斷查詢對應數據庫的系統表是否存在,根據頁面是否正常來判斷對應數據庫類型。
MySQL:http://127.0.0.1:8090/JavaSQLInjection/mysql.jsp?id=1 and exists(select 1 from information_schema.tables)
SQLServer: http://127.0.0.1:8090/JavaSQLInjection/mysql.jsp?id=1 and exists(select 1 from sysobjects)
Access:http://127.0.0.1:8090/JavaSQLInjection/mysql.jsp?id=1 and exists(select 1 from MSysAccessObjects)
Oracle:http://127.0.0.1:8090/JavaSQLInjection/mysql.jsp?id=1 and exists(select 1 from user_tables)
12.2.2.2. 通用字符型
URL地址:
http://127.0.0.1:8090/JavaSQLInjection/mysql.jsp?id=1
判斷註入:
改變參數id=1’ and 1=1 and ‘1’=’1 和 id=1’ and 1=1 and ‘1’=’2進行測試,或者利用註釋符號“#”或者“— ”,當然特殊字符記得進行URL編碼,“#”URL編碼後是“%23”,“— ”編碼後是“—%20”,利用註釋符,那麽可以改變參數為id=1’ and 1=1%23和id=1’ and 1=2%23來進行測試,如果1=1頁面顯示正常和原頁面一樣,並且1=2時頁面報錯或者頁面部分數據顯示不正常,那麽可以確定此處為字符型註入。
判斷數據庫類型:
使用exists函數判斷查詢對應數據庫的系統表是否存在,根據頁面是否正常來判斷對應數據庫類型。
MySQL:http://127.0.0.1:8090/JavaSQLInjection/mysql.jsp?id=1’ and exists(select 1 from information_schema.tables) and ‘a’=’a
SQLServer:http://127.0.0.1:8090/JavaSQLInjection/mysql.jsp?id=1’ and exists(select 1 from sysobjects) and ‘a’=’a
Access:http://127.0.0.1:8090/JavaSQLInjection/mysql.jsp?id=1’ and exists(select 1 from MSysAccessObjects) and ‘a’=’a
Oracle:http://127.0.0.1:8090/JavaSQLInjection/mysql.jsp?id=1’ and exists(select 1 from user_tables) and ‘a’=’a
12.2.2.3. 通用搜索型
? URL地址:
http://127.0.0.1:8090/JavaSQLInjection/mysql.jsp?id=1
? 判斷註入:
改變參數id=1%’ and 1=1 and ‘%’=’ 和 id=1%’ and 1=2 and ‘%’=’進行測試,或者利用註釋符號“#”或者“— ”,當然特殊字符記得進行URL編碼,“#”URL編碼後是“%23”,“— ”編碼後是“—%20”,利用註釋符,那麽可以改變參數為id=1%’ and 1=1%23和id=1%’ and 1=2%23來進行測試,如果1=1頁面顯示正常和原頁面一樣,並且1=2時頁面報錯或者頁面部分數據顯示不正常,那麽可以確定此處為搜索型註入。
? 判斷數據庫類型:
使用exists函數判斷查詢對應數據庫的系統表是否存在,根據頁面是否正常來判斷對應數據庫類型。
MySQL:http://127.0.0.1:8090/JavaSQLInjection/mysql.jsp?id=1%’ and exists(select 1 from information_schema.tables) and ‘%’=’
SQLServer:http://127.0.0.1:8090/JavaSQLInjection/mysql.jsp?id=1%’ and exists(select 1 from sysobjects) and ‘%’=’
Access:http://127.0.0.1:8090/JavaSQLInjection/mysql.jsp?id=1%’ and exists(select 1 from MSysAccessObjects) and ‘%’=’
Oracle:http://127.0.0.1:8090/JavaSQLInjection/mysql.jsp?id=1%’ and exists(select 1 from user_tables) and ‘%’=’
12.2.2.4. OR類型
? URL地址:
http://127.0.0.1:8090/JavaSQLInjection/login.jsp?username=1&pass=1
? 判斷註入:
改變參數username=1’ or(1=1 and 1=1) and ‘1’=’1 和 username=1’ or(1=1 and 1=2) and ‘1’=’1進行測試,或者利用註釋符號“#”或者“— ”,當然特殊字符記得進行URL編碼,“#”URL編碼後是“%23”,“— ”編碼後是“—%20”,利用註釋符,那麽可以改變參數為1’ or(1=1 and 1=1)%23和1’ or(1=1 and 1=2)%23來進行測試,如果1=1頁面顯示正常和原頁面一樣,並且1=2時頁面報錯或者頁面部分數據顯示不正常,那麽可以確定此處為字符型註入。
? 判斷數據庫類型:
使用exists函數判斷查詢對應數據庫的系統表是否存在,根據頁面是否正常來判斷對應數據庫類型。
MySQL:http://127.0.0.1:8090/JavaSQLInjection/mysql.jsp?username=1’ or(1=1 and exists(select 1 from information_schema.tables)) and ‘a’=’a&password=1
SQLServer:http://127.0.0.1:8090/JavaSQLInjection/mysql.jsp?id=1’ or(1=1 and exists(select 1 from sysobjects)) and ‘a’=’a
Access:http://127.0.0.1:8090/JavaSQLInjection/mysql.jsp?id=1’ or(1=1 and exists(select 1 from MSysAccessObjects)) and ‘a’=’a
Oracle:http://127.0.0.1:8090/JavaSQLInjection/mysql.jsp?id=1’ or(1=1 and exists(select 1 from user_tables)) and ‘a’=’a
12.2.3. 註入標記
很簡單,首先選中需要進行URL編碼的參數值,選擇需要進行URL編碼的參數後再選中之前判斷註入類型中的“and 1=1”,然後點擊右邊的標記註入按鈕,或者直接刪除“and 1=1”後,在對應的位置插入註入標記。
12.2.4. 獲取數據配置
12.2.4.1. Bool盲註取數據配置
12.2.4.1.1. 基本配置
Bool盲註配置依靠關鍵字、狀態碼、響應時間等因素進行邏輯上的真假判斷。
? 關鍵字判斷
關鍵字是正常邏輯上為真,頁面上存在的字符,而邏輯上為假,頁面上沒有出現的字符。即“and 1=1”出現的字符,而“and 1=2”時未出現的字符。
示例:
正常的數字型註入:
盲註關鍵字可選擇and 1=1時,頁面上出現的關鍵字,and 1=2時沒有出現的關鍵字,比如“SQL” 、“我是SQL”、“SQL註入”。一個原則,只要確保這個詞是1=1條件是頁面出現這個關鍵詞,而1=2時不出現。
? 狀態碼判斷
狀態碼判斷原理同上,只是條件變成了and 1=1時出現這個狀態碼,二and 1=2時不出現這個狀態碼。
選擇狀態碼判斷後,程序盲註的關鍵字將依靠狀態碼判斷,即“and 1=1”時HTTP請求的狀態碼為此關鍵字(200、403、302、500等),而“and 1=2”時為其他狀態碼。
? 時間判斷:
需人工判斷網頁平均響應時間,設置一個時間閥值,當頁面響應時間超過這個閥值,證明當前判斷是正確的,否則不正確。
12.2.4.1.2. 關鍵字取反
關鍵字取反選擇後,程序將反過來取註入的判斷依據,比如即“and 1=2”出現的字符,而“and 1=1”時未出現的字符。如果選擇了狀態碼,即“and 1=2”出現的狀態碼,而“and 1=1”時未為其他狀態碼。
12.2.4.1.3. 驗證關鍵字是否正確
點擊關鍵字可以驗證關鍵字是否配置正確。
12.2.4.2. 錯誤顯示方式取數配置
無需配置,程序將自動獲取錯誤信息,需要註意的是程序可以顯示錯誤信息。
12.2.4.3. Union註入取數據配置
因為Union聯合查詢前後的列數需要保持一致,程序只能利用顯示列顯示註入獲取的數據,所以Union註入需要配置SQL註入的列數、和數據顯示列。
註意事項:由於Access數據庫沒有系統表,所以只能盲猜表和列,所以需要配置盲註取數據配置。配置參考Bool盲註取數據配置。
12.2.5. 獲取數據
切換到數據中心,嘗試獲取數據,如獲取失敗,可嘗試切換數據獲取方式,或者人工測試是否有相關防護規則,檢查網頁編碼是否正常,對HTTP發包日誌進行查看分析失敗原因,在調整配置。
SQL註入工具實踐