web 極客大挑戰 2019 PHP

2021-10-05 12:51:00 字數 2020 閱讀 2421

函式 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}}

?>

index.php關鍵原始碼

<?php

include

'class.php'

;$select

=$_get

['select'];

$res

=unserialize

(@$select);

?>

大致思路就是通過反序列化來執行__destruct()中的echo fla

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:'

)print

(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...