天天看點

pikachu靶場練習記錄說明越權通路BAC目錄周遊敏感資訊洩漏PHP反序列化URL任意跳轉SSRF

說明

    本篇針對pikachu靶場中的越權、目錄周遊、敏感資訊洩漏、SSRF、PHP反序列化和url任意跳轉等題目進行了記錄。

越權通路BAC

    此處的越權通路主要是針對應用系統本身管理的越權,比如登陸使用者權限進行了不屬于其自身權限範圍内的操作等。

1、水準越權

    所謂水準越權其實是針對同一水準或者同一類型的互相越權,比如同一角色的不同使用者互相越權操作來說的。

    根據提示資訊登陸lili賬戶,密碼為123456。點選檢視個人資訊,檢視到的是lili的個人資訊。如果我們可以檢視到其他人的資訊,比如lucy的(根據之前的提示猜測lucy應該是和lili權利一樣),那麼就說明此處存在水準越權。使用burpsuite檢視

pikachu靶場練習記錄說明越權通路BAC目錄周遊敏感資訊洩漏PHP反序列化URL任意跳轉SSRF

    從檢視使用者資訊請求中我們發現有兩處資訊點,一處是username的值,另一處是submit的值。我們先将username的值修改為lucy,重新發送請求。我們發現響應包中顯示出來了lucy的個人資訊,說明此處存在水準越權。

2、垂直越權

    與水準越權對應着了解,垂直越權就是從低水準線跳過限制解除到了高水準線接口,以低權限低級别的使用者身份資訊進了了高權限進階别才允許的操作。

    根據提示資訊,admin/123456是超級管理者,而pikachu/000000是普通管理者。我們使用pikachu/000000登陸進去,顯示了使用者清單資訊,我們退出之後更換為admin/123456登陸系統,發現除了使用者顯示資訊,還提供了使用者添加的入口,點選入口發現連結:http://192.168.10.150/pikachu/vul/overpermission/op2/op2_admin_edit.php。

    現在退出使用普通使用者pikachu登陸進去,将url上的op2_user.php修改為op2_admin_edit.php,然後重新整理發現普通使用者也可以通路添加使用者的接口,說明此處存在垂直越權。

目錄周遊

    目錄周遊主要是存在在一些系統上,将所展示檔案名字等資訊以參數的形式指派在請求中,背景如果沒有對請求參數進行過濾的話,就可以通過../等形式周遊出來其他的系統檔案。

    點選href,通路連結http://192.168.10.150/pikachu/vul/dir/dir_list.php?title=jarheads.php,在頁面中顯示出來檔案jarheads.php的内容。我們可以将title的值修改為../../../README.md,就可以通路README.md的檔案。

    pikachu安裝在答主的電腦E盤,E盤目錄下面正好有passwd.txt檔案,現在通路連結:http://192.168.10.150/pikachu/vul/dir/dir_list.php?title=../../../../../../../../passwd.txt,将passwd.txt顯示出來了。

敏感資訊洩漏

    敏感資訊洩漏的概念比較寬泛,比如在代碼中暴露出來的使用者名、郵箱、密碼等重要個人資訊,或者從通路的請求中得到的作業系統、中間件、伺服器資訊以及系統上的其他重要檔案内容等,都可以稱之為存在敏感資訊洩漏。

    選擇IcanseeyouABC時,使用burpsuite檢視對應的請求包和響應包,發現測試賬号。

pikachu靶場練習記錄說明越權通路BAC目錄周遊敏感資訊洩漏PHP反序列化URL任意跳轉SSRF

PHP反序列化

    序列化和反序列化一般是用于資料傳輸,序列化簡單了解就是将資料結構對象按照一定格式轉換為字元串,反序列化就是将序列化的字元串轉換成資料結構及對象。比如類對象S跟其對應的序列化格式字元串。

資料對象
class S {

    var $test = "pikachu";

    function __construct() {

        echo $this->test;
    }    

}
對應的格式化後的字元串:
O:1:"S":1:{s:4:"test";s:7:"pikachu"}

說明:
O -> 代表類對象
1 -> 對象名長度
S -> 對象名
1 -> 有一個參數
s -> 參數名是字元串格式
4 -> 參數名長度
test -> 參數名
s -> 參數值是字元串格式
7 -> 參數值長度為7
pikachu -> 參數值
           

    php中跟反序列化相關的漏洞有很多,一般都是因為使用者輸入的序列化資料沒有做校驗,是不可控的,另一方面是由于php序列化和反序列化中使用了一些魔術方法。

    答主不是很懂php的相關知識,通過學習發現了一些簡單的漏洞利用。比如在漏洞中僞造script代碼進行前端注入,或者通過修改序列化字元串中的參數個數字段的值,使得php背景繞過wakeup函數(反序列化函數執行時,一般會刷線調用wakeup函數,然後在會調用__destruct函數。而參數個數字段的值大于實際的參數時就不會執行自動調用wakeup了)。更多的反序列化漏洞就需要在使用過程中邊發現邊學習了。php的魔術方法(Magic methods)一般有__construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sleep(), __wakeup(), __toString(), __invoke(), __set_state(), __clone() 和 __debugInfo() 等。

    該題目中随意輸入字元串,使用burpsuite檢視。

pikachu靶場練習記錄說明越權通路BAC目錄周遊敏感資訊洩漏PHP反序列化URL任意跳轉SSRF

    我們可以看到題目中調用了unser.php檔案,找到該檔案并打開審閱一下。 通過檢視代碼我們發現對象為S,具體格式見上面的Class S例子。

if (isset($_POST['o'])) {
    $s = %_POST['o'];
    if (!@$unser = unserialize($s))
        $html.="<p>大兄弟,來點勁爆點的!</p>";
    else
        $html.="<p>{$unser->test}</p>";
}
           

    通過背景代碼我們可以發現,當序列化成功之後,我們的代碼可以顯示在頁面上。于是攔截并僞造o的參數值為:O:1:"S":1:{s:4:"test";s:38:"</p><script>alert('hello')</script><p>";},重新發送請求。

pikachu靶場練習記錄說明越權通路BAC目錄周遊敏感資訊洩漏PHP反序列化URL任意跳轉SSRF

URL任意跳轉

    如果前端采用了背景傳遞進來的參數作為新的url進行跳轉就可能存在URL任意跳轉漏洞。查詢了下,常見的跳轉主要存在以下三種跳轉方式:

1、header(“Location: 新的url”);

2、在script中進行跳轉,通路新的url,比如window.location.href=“新的url”。

3、在html頭部使用meta來進行跳轉,<meta http-equiv="refresh" content="5;url=新的url"> 5代表5秒後跳轉。

    總體來說url任意跳轉的漏洞的直接危害相對小一些,就是利用一些安全的url服務提供商背景校驗不嚴格,而進行惡意網站的跳轉。出于對一些權威ISP的信任,由這些權威url通路的頁面使用者一般也都是信任的,進而會帶來安全隐患。

    在題目中點選連結會通路http://192.168.10.150/pikachu/vul/urlredirect/urlredirect.php?url=i,将url後面修改為自己想要跳轉的網站即可,比如修改為url=http://www.baidu.com,重新發送請求即跳轉至百度。注:該題目的背景使用的是 header("location: ($url)")的方式。

SSRF

    ssrf跟csrf是對應的,csrf是跨站請求僞造,也可以了解為用戶端請求僞造,而ssrf就可以了解為服務端請求僞造。csrf一般對于ISP等服務商來說危害不大,一般受影響和損失的都是使用者端,但ssrf的危害卻是極大的。

    服務端根據使用者的輸入,在服務背景的業務邏輯中去請求對應的一些資源(由于資源和服務分離,這些場景是非常易見的),進而造成服務端資訊的洩漏和僞造,這也要求了服務端需要做好資源目的位址過濾。題目中也對ssrf進行了簡單介紹,一般在PHP中,不正确使用file_get_contents()、fsockopen() 、curl_exec()等函數可能容易造成ssrf攻擊。

SSRF之curl

    該題目中,通路連結http://192.168.10.150/pikachu/vul/ssrf/ssrf_curl.php?url=http://127.0.0.1/pikachu/vul/ssrf/ssrf_info/info1.php,發現背景将url為參數,通路了該連結,并将讀取的資料顯示在頁面上。

    答主E盤下又個passwd.txt檔案,我們将連結修改一下,修改成http://192.168.10.150/pikachu/vul/ssrf/ssrf_curl.php?url=file:///e:\\passwd.txt,既可在頁面中檢視到密碼檔案。

    curl除了file,還支援ftp、http、https、gopher、telnet、dict以及ldap等多種協定。

    ssrf中常看到gopher的影子,以gopher為例,通過查詢發現perl、curl、php、asp.net和java等都支援gopher,不過curl太老的版本可能不支援gopher,php不同的版本支援度也不同(直接通路的時候使用了phpstudy的5.2.17版本,php7.3版本不能直接通過gopher協定通路),JDK1.7及以上也不支援。

    答主由一台centos6(IP位址為192.168.10.17)和centos7的系統,在centos6上啟動nc随便監聽8090端口,nc -l 8090。在centos7上(centos6上的curl版本太低了,不支援gopher協定)使用curl的gopher協定發出http請求: curl gopher://192.168.10.17:8090/_helloworld,nc頁會列印出來helloworld字樣。

    現在測試一個gopher在ssrf中經常用到的方法,編寫一個test_curl.php的檔案,放置到pikachu目錄下面,檔案内容:

<?php
    echo $_POST['ARG'];
?>
           

    該檔案可以接受一個POST請求(修改成GET請求也可以),然後在終端上使用curl指令:curl -v 'gopher://192.168.10.150:80/_POST%20/pikachu/vul/ssrf/test_curl.php%20HTTP/1.1%0d%0aHost:%20192.168.10.150%0d%0aContent-Type:%20application/x-www-form-urlencoded%0d%0aContent-Length:%2014%0d%0aUser-Agent:%20Chrome%0d%0a%0d%0aARG%3Dhelloworld'。發送請求會傳回包含ARG的值的新頁面。

1、當背景test_curl.php檔案使用GET時,上述http請求指令中的_POST也可以換成_GET。

2、請求中的回車、空格等符号需要進行url編碼。

3、POST和GET請求前需要加_(換成其他無特殊意義的字元也可以),這是跟gopher協定相關的,第一個字元需要忽略。

    我們可以将gopher請求連結追加到http://192.168.10.150/pikachu/vul/ssrf/ssrf_curl.php?url=後面,同時需要做二次編碼,因為在php背景通過url拿到gopher連結時會進行一次解碼。二次編碼後的gopher連結為:

http://192.168.10.150/pikachu/vul/ssrf/ssrf_curl.php?url=gopher://192.168.10.150:80/_POST%2520/pikachu/vul/ssrf/test_curl.php%2520HTTP/1.1%250d%250aHost:%2520192.168.10.150%250d%250aContent-Type:%2520application/x-www-form-urlencoded%250d%250aContent-Length:%252014%250d%250aUser-Agent:%2520Chrome%250d%250a%250d%250aARG%253Dhelloworld。發送請求,會顯示出來test_curl.php的結果。這裡需要将php的版本調整到php7.3,懷疑是低版本php中的curl不支援。

    同時,利用gopher/dict等協定也可以進行内網探測,比如通過post請求或者get請求對192.168.10.150網段的伺服器的某些特定端口進行探測。

    例如發送請求http://192.168.10.150/pikachu/vul/ssrf/ssrf_curl.php?url=gopher://192.168.10.150:22。

pikachu靶場練習記錄說明越權通路BAC目錄周遊敏感資訊洩漏PHP反序列化URL任意跳轉SSRF
pikachu靶場練習記錄說明越權通路BAC目錄周遊敏感資訊洩漏PHP反序列化URL任意跳轉SSRF

SSRF之file_get_contents

    與上面的SSRF之curl基本一樣,通路連結:http://192.168.10.150/pikachu/vul/ssrf/ssrf_fgc.php?file=http://127.0.0.1/pikachu/vul/ssrf/ssrf_info/info2.php可以從file中得到新的url,php背景會通過file_get_contents擷取到新的url并通路。現在将請求修改為:http://192.168.10.150/pikachu/vul/ssrf/ssrf_fgc.php?file=file://e:\\passwd.txt,頁面中會顯示出來passwd.txt檔案内容。

    答主在file_get_contents函數裡面,試了試dict和gopher協定來探測22端口,沒有生效,暫時沒有做進一步的研究。