函式 serialize():將php中建立的物件,變成乙個字串private屬性序列化的時候格式是 %00類名%00成員名
protected屬性序列化的時候格式是 %00*%00成員名
protected宣告的字段為保護字段,在所宣告的類和該類的子類中可見,但在該類的物件例項中不可見。因此保護欄位的欄位名在序列化時,欄位名前面會加上\0*\0的字首。這裡的\0 表示 ascii 碼為 0 的字元(不可見字元),而不是 \0組合。這也許解釋了,為什麼如果直接在**上,傳遞\0*\0username會報錯,因為實際上並不是\0,只是用它來代替ascii值為0的字元。必須用python傳值才可以。-------------------------------------
private 宣告的字段為私有字段,只在所宣告的類中可見,在該類的子類和該類的物件例項中均不可見。因此私有欄位的欄位名在序列化時,類名和欄位名前面都會加上\0的字首。字串長度也包括所加字首的長度。其中\0 字元也是計算長度的。
作用:與__sleep()函式相反,__sleep()函式,是在序序列化時被自動呼叫。__wakeup()函式,在反序列化時,被自動呼叫。繞過:當反序列化字串,表示屬性個數的值大於真實屬性個數時,會跳過__wakeup 函式的執行。
首先找到備份的**檔案 — www.zip
class
.php 原始碼
<?php
include
'flag.php'
;error_reporting(0
);class
name
function
__wakeup()
function
__destruct()
if($this
->
username
==='admin'
)else}}
?>
大致思路就是通過反序列化來執行__destruct()中的echo flaindex.php關鍵原始碼
<?php
include
'class.php'
;$select
=$_get
['select'];
$res
=unserialize
(@$select);
?>
g。兩個
條件flag。兩個條件
flag。兩
個條件this->password == 100,$this->username === 『admin』。
注意:
這裡使用python提交,因為他是私有類,
類名和欄位名前面都會加上\0的字首
這裡的 \0 表示 ascii 碼為 0 的字元(不可見字元),而不是 \0 組合。這也許解釋了,為什麼如果直接在**上,傳遞\0*\0username會報錯,因為實際上並不是\0,只是用它來代替ascii值為0的字元。必須用python傳值才可以。
解法一:
解法二:import requests
url =
""html = requests.get(url+
'?select=o:4:"name":3:'
(html.text)
如果不使用python提交
在url欄中會出現\0
有空白符,而複製的時候會丟失。
加上%00
payload:
o:4:
"name":3
:
極客大挑戰 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...