PHP 反序列化漏洞學(xué)習(xí)及CVE-2016-7124漏洞復(fù)現(xiàn)

序列化與反序列化了解

  • serialize ()
    serialize() 返回字符串蝌诡,此字符串包含了表示 value 的字節(jié)流溉贿,可以存儲(chǔ)于任何地方。
    簡單來講浦旱,就是將對(duì)象轉(zhuǎn)化為可以傳輸?shù)淖址钌址写鎯?chǔ)著對(duì)象的變量、類型等颁湖。
    舉個(gè)例子:
    test.php
<?php 
class test{
  public $name = "wcute";
  public $age = "18";
}

$fairy = new test();
echo serialize($fairy);
 ?>
圖片.png
  • unserialize ()
    將序列化后的字符串轉(zhuǎn)化為PHP的值宣蠕。

test.php

<?php 
class test{
  public $name = "wcute";
  public $age = "18";
}

$fairy = new test();
$s_fairy = serialize($fairy);
$uns_fairy = unserialize($s_fairy);
var_dump($uns_fairy);      # 打印對(duì)象
 ?>
圖片.png

魔術(shù)方法

PHP 將所有以 __(兩個(gè)下劃線)開頭的類方法保留為魔術(shù)方法。所以在定義類方法時(shí)甥捺,除了上述魔術(shù)方法抢蚀,建議不要以 __ 為前綴。
__construct()镰禾,__destruct()皿曲,__call()__callStatic()吴侦,__get()屋休, __set()__isset()妈倔,__unset()博投,__sleep()__wakeup()盯蝴,__toString()__invoke()听怕,__set_state()捧挺,__clone()__debugInfo() 等方法在 PHP 中被稱為"魔術(shù)方法"(Magic methods)。

常用魔術(shù)方法舉例:

  • __construct()
    PHP 5 允行開發(fā)者在一個(gè)類中定義一個(gè)方法作為構(gòu)造函數(shù)尿瞭。具有構(gòu)造函數(shù)的類會(huì)在每次創(chuàng)建新對(duì)象時(shí)先調(diào)用此方法闽烙,所以非常適合在使用對(duì)象之前做一些初始化工作。

  • __destruct()
    析構(gòu)函數(shù)會(huì)在到某個(gè)對(duì)象的所有引用都被刪除或者當(dāng)對(duì)象被顯式銷毀時(shí)執(zhí)行声搁。

  • __sleep()
    serialize() 函數(shù)會(huì)檢查類中是否存在一個(gè)魔術(shù)方法 __sleep()黑竞。如果存在,該方法會(huì)先被調(diào)用疏旨,然后才執(zhí)行序列化操作很魂。

  • __wakeup()
    unserialize() 會(huì)檢查是否存在一個(gè) __wakeup() 方法。如果存在檐涝,則會(huì)先調(diào)用 __wakeup 方法遏匆,預(yù)先準(zhǔn)備對(duì)象需要的資源法挨。

  • __toString()
    __toString() 方法用于一個(gè)類被當(dāng)成字符串時(shí)應(yīng)怎樣回應(yīng)。例如 echo $obj; 應(yīng)該顯示些什么幅聘。

反序列化漏洞

PHP 中的魔術(shù)方法通常會(huì)因?yàn)槟承l件觸發(fā)執(zhí)行凡纳,所以在unserialize ()的參數(shù)可控時(shí),通過一定條件構(gòu)造惡意序列化代碼觸發(fā)魔術(shù)方法帝蒿,可造成嚴(yán)重代碼執(zhí)行等危害荐糜。

實(shí)例一

URL:http://120.79.33.253:9001/


圖片.png

對(duì)傳入的 str 參數(shù)值反序列化后與 KEY 的值相等即輸出flag
因此只需將 KEY 的值序列化一下然后傳給 str 參數(shù)即可
如圖編寫代碼獲取序列化值


圖片.png

傳值獲取 flag
圖片.png
實(shí)例二:__wakeup()魔術(shù)方法繞過(CVE-2016-7124)
  • 漏洞影響版本:
    PHP5 < 5.6.25
    PHP7 < 7.0.10
  • 漏洞產(chǎn)生原因:
    如果存在__wakeup方法,調(diào)用 unserilize() 方法前則先調(diào)用__wakeup方法葛超,但是序列化字符串中表示對(duì)象屬性個(gè)數(shù)的值大于 真實(shí)的屬性個(gè)數(shù)時(shí)會(huì)跳過__wakeup的執(zhí)行
  • 漏洞復(fù)現(xiàn)
    編寫測試腳本
    test.php
<?php 

class test{
    public $name = "fairy";
    public function __wakeup(){
        echo "this is __wakeup<br>";
    }
    public function __destruct(){
        echo "this is __destruct<br>";
    }
}

// $s = new test();
// echo serialize($s);  
// $s = O:4:"test":1:{s:4:"name";s:5:"fairy";}

$str = $_GET["s"];
@$un_str = unserialize($str);

echo $un_str->name."<br>";

 ?>

腳本上標(biāo)明接收s參數(shù)暴氏,對(duì)其反序列化后輸出name屬性的值
為了方便觀察,我將傳入的s參數(shù)的name屬性值更改為xss代碼
訪問test.php
頁面顯示語句代表反序列化之前先調(diào)用了__wakeup 方法巩掺,

圖片.png

點(diǎn)擊確定后偏序,頁面完成后自動(dòng)執(zhí)行__destruct方法
圖片.png

將傳入的序列化數(shù)據(jù)的對(duì)象變量個(gè)數(shù)由1更改為2,頁面只執(zhí)行了__destruct方法胖替,而且輸出name屬性時(shí)報(bào)錯(cuò)研儒,是由于反序列化數(shù)據(jù)時(shí)失敗無法創(chuàng)建對(duì)象。
圖片.png

  • 漏洞利用
    更改測試代碼
    test.php
<?php 
class test{
    public $name = "fairy";

    public function __wakeup(){
        echo "this is __wakeup<br>";
        foreach(get_object_vars($this) as $k => $v) {
                $this->$k = null;
        }
    }
    public function __destruct(){
        echo "this is __destruct<br>";
        $fp = fopen("D:\\phpStudy\\WWW\\wcute.php","w");
        fputs($fp,$this->name);
        fclose($fp);
    }
}

// $s = new test();
// echo serialize($s);  
// $s = O:4:"test":1:{s:4:"name";s:5:"fairy";}

$str = $_GET["s"];
@$un_str = unserialize($str);

echo $un_str->name."<br>";
 ?>

其中 __destruct方法在調(diào)用時(shí)將name參數(shù)寫入wcute.php文件
但是由于__wakeup方法清除了對(duì)象屬性独令,所以在調(diào)用__destruct時(shí)已經(jīng)沒有了name屬性端朵,因此文件將會(huì)寫入失敗,XSS代碼也不會(huì)執(zhí)行燃箭。


圖片.png

將對(duì)象屬性個(gè)數(shù)改為2繼續(xù)嘗試冲呢,成功繞過__wakeup方法執(zhí)行,將代碼寫入文件


圖片.png

參考鏈接:
https://secure.php.net/manual/zh/language.oop5.magic.php
https://blog.csdn.net/dyw_666666/article/details/90199606
https://xz.aliyun.com/t/378#toc-4

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末招狸,一起剝皮案震驚了整個(gè)濱河市敬拓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌裙戏,老刑警劉巖乘凸,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異累榜,居然都是意外死亡营勤,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門壹罚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來葛作,“玉大人,你說我怎么就攤上這事猖凛÷复溃” “怎么了?”我有些...
    開封第一講書人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵形病,是天一觀的道長客年。 經(jīng)常有香客問我霞幅,道長,這世上最難降的妖魔是什么量瓜? 我笑而不...
    開封第一講書人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任司恳,我火速辦了婚禮,結(jié)果婚禮上绍傲,老公的妹妹穿的比我還像新娘扔傅。我一直安慰自己,他們只是感情好烫饼,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開白布猎塞。 她就那樣靜靜地躺著,像睡著了一般杠纵。 火紅的嫁衣襯著肌膚如雪荠耽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,190評(píng)論 1 299
  • 那天比藻,我揣著相機(jī)與錄音铝量,去河邊找鬼。 笑死银亲,一個(gè)胖子當(dāng)著我的面吹牛慢叨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播务蝠,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼拍谐,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了馏段?” 一聲冷哼從身側(cè)響起轩拨,我...
    開封第一講書人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎院喜,沒想到半個(gè)月后气嫁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡够坐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了崖面。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片元咙。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖巫员,靈堂內(nèi)的尸體忽然破棺而出庶香,到底是詐尸還是另有隱情,我是刑警寧澤简识,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布赶掖,位于F島的核電站感猛,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏奢赂。R本人自食惡果不足惜陪白,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望膳灶。 院中可真熱鬧咱士,春花似錦、人聲如沸轧钓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽毕箍。三九已至弛房,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間而柑,已是汗流浹背文捶。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留牺堰,地道東北人拄轻。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像伟葫,于是被迫代替她去往敵國和親恨搓。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354