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乙個包 含了全部 變數的全 局組...