php反序列化注入,php關於反序列化物件注入漏洞

2021-10-25 21:47:07 字數 2955 閱讀 2250

php物件注入是乙個非常常見的漏洞,這個型別的漏洞雖然有些難以利用,但仍舊非常危險。本文主要和大家分享php關於反序列化物件注入漏洞詳解,希望能幫助到大家。

分析php基礎

serialize 把乙個物件轉成字串形式, 可以用於儲存

unserialize 把serialize序列化後的字串變成乙個物件

php類可能會包含一些特殊的函式叫magic函式,magic函式命名是以符號__開頭的,

比如 __construct, __destruct, __tostring, __sleep, __wakeup等等。

這些函式在某些情況下會自動呼叫,比如

__construct當乙個物件建立時被呼叫,

__destruct當乙個物件銷毀時被呼叫,

__tostring當乙個物件被當作乙個字串使用。

舉例說明

舉個例子:<?php

php允許儲存乙個物件方便以後重用,這個過程被稱為序列化。

為什麼要有序列化這種機制呢?

在傳遞變數的過程中,有可能遇到變數值要跨指令碼檔案傳遞的過程。試想,如果為乙個指令碼中想要呼叫之前乙個指令碼的變數,但是前乙個指令碼已經執行完畢,所有的變數和內容釋放掉了,我們要如何操作呢?難道要前乙個指令碼不斷的迴圈,等待後面指令碼呼叫?這肯定是不現實的。

serialize和unserialize就是用來解決這一問題的。serialize可以將變數轉換為字串並且在轉換中可以儲存當前變數的值;unserialize則可以將serialize生成的字串變換回變數。這樣在跨指令碼傳輸和執行就完美解決了。

magic函式__construct和__destruct會在物件建立或者銷毀時自動呼叫;

__sleep magic方法在乙個物件被序列化的時候呼叫;

__wakeup magic方法在乙個物件被反序列化的時候呼叫。<?phpclass user public function __construct()

現在我們了解序列化是如何工作的,但是我們如何利用它呢?

有多種可能的方法,取決於應用程式、可用的類和magic函式。

記住,序列化物件包含攻擊者控制的物件值。

你可能在web應用程式源**中找到乙個定義__wakeup或__destruct的類,這些函式會影響web應用程式。

例如,我們可能會找到乙個臨時將日誌儲存到檔案中的類。當銷毀時物件可能不再需要日誌檔案並將其刪除。把下面這段**儲存為log.php。<?php class logfile

結果,解析出來的物件,在釋放過程中,呼叫了log.php的__destruct()函式,把檔案1.php給刪除了。

利用總結

在變數可控並且進行了unserialize操作的地方注入序列化物件,實現**執行或者其它坑爹的行為。

先不談 __wakeup 和 __destruct,還有一些很常見的注入點允許你利用這個型別的漏洞,一切都是取決於程式邏輯。

舉個例子,某使用者類定義了乙個__tostring為了讓應用程式能夠將類作為乙個字串輸出(echo $obj),而且其他類也可能定義了乙個類允許__tostring讀取某個檔案。

也可以使用其他magic函式:

如果物件將呼叫乙個不存在的函式__call將被呼叫;

如果物件試圖訪問不存在的類變數__get和__set將被呼叫。

但是利用這種漏洞並不侷限於magic函式,在普通的函式上也可以採取相同的思路。

例如user類可能定義乙個get方法來查詢和列印一些使用者資料,但是其他類可能定義乙個從資料庫獲取資料的get方法,這從而會導致sql注入漏洞。

set或write方法會將資料寫入任意檔案,可以利用它獲得遠端**執行。

php反序列化注入,有趣的php反序列化總結

前言 漏洞種類 一是將傳來的序列化資料直接unserilize,造成魔幻函式的執行。這種情況在一般的應用中依然屢見不鮮。二是php session 序列化及反序列化處理器設定使用不當會帶來的安全隱患。ryat牛講得很明白了。php 內建了多種處理器用於訪問 session 資料時會對資料進行序列化和...

PHP反序列化

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

php反序列化

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