WEB 知識點專題

2021-09-29 12:34:15 字數 2861 閱讀 2318

php的序列化和反序列化:serialize()和unserialize()函式的作用是把複雜的資料型別壓縮到乙個字串中來傳輸。

relax.php

<?php

error_reporting

(e_all

^e_notice

^e_warning);

$_=$_get

['pw'];

$__=

$_get

['file'];

$___

=$_get

['(><)'];

if(isset($_

)&&(file_get_contents($_

,'r'

)===

"two thousand three hundred

and thirty-three"))

else

}else

heicore.php

<

?php

class

heicore}}

?>

可以知道需要先設定$_ 變數,file_gets_content( $_,『r』)的意思是把這個 $ _(在這裡是乙個檔案)以字串的形式讀出來,並且字串要完全等於""two thousand three hundred and thirty-three(這裡要用到php偽協議,使用php://input 1

,並且當傳進去的引數作為檔名變數去開啟檔案時,可以將引數php://傳進,同時post方式傳進去值作為檔案內容)

將這個源**讀了出來,發現include如果包含這個heicore.php,那麼我們可以將(><)序列化(class的序列化),並且讓其值是flag.php,這樣就可以讀到這個檔案了(有魔法函式自動執行語句滴~),如此一來就避免了preg _match函式的魔爪,可以順利得到flag。

payload.php

<?php

class

heicore$a=

newheicore()

;$a->

file

="flag.php";$a

=serialize($a

);print_r($a

);?>

url中(><)=o:7:%22heicore%22:1得到flag

php序列化與反序列化(二)

php類可能會包含一些特殊的函式叫magic函式,magic函式命名是以符號__開頭的,比如 __construct, __destruct, __tostring, __sleep, __wakeup等等。這些函式在某些情況下會自動呼叫,__construct當乙個物件建立時被呼叫,__destruct當乙個物件銷毀時被呼叫,__tostring當乙個物件被當作乙個字串使用。(序列化反序列化的題目時常和magic函式放在一起進行繞過)

sofun.php

<?php

class

sofun

else}}

function

__wakeup()

public

function

__tostring()

}if(!

isset

($_get

['file'])

)else

?>

#

可以看到首先變數不為空,其次這個變數不能有"\" or 「/」,這樣他才會顯示出這個檔案的內容,這裡又再次看到了unserialize形式,使file的值是flag.php即可,但是這個時候需要考慮到base64編碼和wakeup魔法函式,因為通過unserialize反序列化之後,也會呼叫__wakeup方法,它會把file設為index.php。所以還需要考慮怎麼繞過_ wakeup函式才可。但是還是有漏洞可以鑽一鑽的,查詢各種小資料,發現_wakeup漏洞,簡單來說,當乙個字串或物件被序列化後,如果其屬性被修改,則不會執行__wakeup()函式,這就是乙個繞過點。 這下我們就可以放心大膽的serialize$file了,最後只需要修改其屬性值得數目就可以繞過magic函式。但是注意protected屬性,protected 宣告的字段為保護字段,在所宣告的類和該類的子類中可見,但在該類的物件例項中不可見。因此保護欄位的欄位名在序列化時,欄位名前面會加上\0*\0的字首。這裡的 \0 表示 ascii 碼為 0 的字元,而不是 \0 組合。這是我在網上查詢到的資料,並且欄位名被作為字串序列化時,字串值中包括根據其可見性所加的字首。字串長度也包括所加字首的長度。其中 \0 字元也是計算長度的。

構造假payload:o:5:「sofun」:2:3

最後將假payload進行base64加密即可得到真payload!

可以訪問請求的原始資料的唯讀流, 將post請求中的資料作為php**執行。 ↩︎

可以讀取源**並進行base64編碼輸出,不然會直接當做php**執行就看不到源**內容了。 ↩︎

如果前面是s,則 \0 算乙個字元,如果前面是s,則 \0 為兩個字元,在序列化時注意改變前面的字元數目。 ↩︎

web安全知識點

前端資料的不信任原則 對使用者輸入校驗包括 表單驗證 正規表示式規範資料 限制長度 轉換特殊字元 sql注入 不使用動態拼接sql 使用引數化的sql 使用儲存過程查詢訪問 管理員許可權資料庫連線 有限的資料庫連線 單獨許可權 機密資訊不可明文存放 加密或者hash xss 非法獲取使用者資訊 使用...

web 新手知識點

web開發程式設計 1 能否系統的說出http狀態碼?說出一些常見的 狀態碼,並描述其含義。200 伺服器成功處理了請求並提供了請求的網頁 204 伺服器成功處理了請求,但沒有返回任何內容 400 伺服器不理解請求的語法 403 伺服器拒絕請求 404 伺服器找不到請求的網頁,伺服器不存在的網頁 5...

web知識點記錄

備份檔案 g lo bals 乙個包含 了全部變 量的全域性 組合陣列 變數的 名字就是 陣列的鍵 即所 有出現過 的全域性變 量,都可 通過globals乙個包含了全部變數的全域性組合陣列。變數的名字就是陣列的鍵。即所有出現過的全域性變數,都可通過 global s乙個包 含了全部 變數的全 局組...