php反序列化總結

2021-09-23 15:46:03 字數 1983 閱讀 3314

反序列化漏洞黑盒很難發現,即使發現了也好難利用。不過危害很大。

序列化使用函式serialize()來返回乙個包含位元組流的字串來表示。unserialize()函式能夠重新把字串變回php原來的值。 序列化乙個物件將會儲存物件的所有變數,但是不會儲存物件的方法,只會儲存類的名字。

序列化結果

string(5) "i:34;"     //number

string(13) "s:6:"uusama";" //str

string(4) "b:1;" //bool

string(2) "n;" //null

string(30) "a:2:" //array('a' => 1, 'b' => 2);

string(52) "o:2:"cc":2:" //new cc('uu', true);

__wakeup() //使用unserialize時觸發

__sleep() //使用serialize時觸發 該方法挑選一些特定的變數名稱進行下一步序列化,而不是使用類中所有變數進行序列化

__destruct() //物件被銷毀時觸發

__call() //在物件上下文中呼叫不可訪問的方法時觸發

__callstatic() //在靜態上下文中呼叫不可訪問的方法時觸發

__get() //用於從不可訪問的屬性讀取資料

__set() //用於將資料寫入不可訪問的屬性

__isset() //在不可訪問的屬性上呼叫isset()或empty()觸發

__unset() //在不可訪問的屬性上使用unset()時觸發

__tostring() //把類當作字串使用時觸發,返回值需要為字串

__invoke() //當指令碼嘗試將物件呼叫為函式時觸發

php預定義序列化介面serializable

反序列化漏洞舉例:

<?php

class a

}$a = $_get['test'];

$a_unser = unserialize($a);

?>

變數$a從url中test引數獲取到內容,並且在反序列化的時候通過__destruct()直接將傳入的資料不經過任何處理,echo出來,這裡就存在反射型xss漏洞了。

當指令碼結束執行時,所有的物件都會銷毀,就會自動呼叫__destruct方法。要關注__wakeup和__destruct,追蹤是否存在可利用的函式。

高危函式:

exec()

passthru()

popen()

system()

file_put_contents()

file_get_contents()

unlink()

。。。

php的 unserialize() 函式只能反序列化在當前程式上下文中已經被定義過的類.在傳統的php中你需要通過使用一大串的include() 或者 require()來包含所需的類定義檔案。於是後來出現了 autoloading 技術,他可以自動匯入需要使用的類,再也不需要程式設計師不斷地複製貼上 那些include**了。這種技術同時也方便了我們的漏洞利用.因為在我們找到乙個反序列化點的時候我們所能使用的類就多了,那麼實現漏洞利用的可能性也就更加高。

還有乙個東西要提一下,那就是composer,這是乙個php的包管理工具,同時他還能自動匯入所以依賴庫中定義的類。這樣一來 unserialize() 函式也就能使用所有依賴庫中的類了,攻擊面又增大不少。

1.composer配置的依賴庫儲存在vendor目錄下

2.如果要使用composer的自動類載入機制,只需要在php檔案的開頭加上

require __dir__ . '/vendor/autoload.php';
參考:

rfc for a secure unserialization mechanism in php

PHP反序列化逃逸總結

function filter short img function filter long img extract post if get cmd else serialize by short filter short serialize session userinfo unserialize...

PHP反序列化

php反序列化漏洞 一 序列化定義 序列化 serialization 在電腦科學的資料處理中,是指將資料結構或物件狀態轉換成可取用格式 例如存成檔案,存於緩衝,或經由網路中傳送 以留待後續在相同或另一台計算機環境中,能恢復原先狀態的過程。概念很容易理解,其實就是將資料轉化成一種可逆的資料結構,自然...

php反序列化

php序列化 將物件或變數轉換成字串。php反序列化 是將字串轉換成原來的變數。serialize serialize 函式用於序列化物件或陣列,並返回乙個字串。serialize 函式序列化物件後,可以很方便的將它傳遞給其他需要它的地方,且其型別和結構不會改變。sites array google...