php反序列化漏洞

2022-09-12 01:00:41 字數 2259 閱讀 4017

想要了解php反序列化漏洞首先要清楚php的魔法方法

php魔法方法:

__construct: 在建立物件時候初始化物件,一般用於對變數賦初值。

__destruct: 和建構函式相反,當物件所在函式呼叫完畢後執行。

__tostring:當物件被當做乙個字串使用時呼叫。

__sleep:序列化物件之前就呼叫此方法(其返回需要乙個陣列)

__wakeup:反序列化恢復物件之前呼叫該方法

__call:當呼叫物件中不存在的方法會自動呼叫該方法。

__get:在呼叫私有屬性的時候會自動執行

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

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

php反序列繞過:

1、當object物件的長度超出長度時,php低版本的反序列化並不會執行__wakeup漏洞;

因為超出,所以永遠不會執行__wakeup,由此,可以繞過

2、若後面還出現正規表示式(較為嚴格的)對o:1這個格式進行過濾,可以使用

o:1:"a":2:

o:+1:"a":2://此處+號需要使用ascii碼的加號,因為+號在url中代表空格

反序列化各類型別的變化:

protected $op;

"%00*%00op"

private $op;

"%00a%00op"

關於反序列化物件的繞過

①php7.1以上版本對屬性型別不敏感,public屬性序列化不會出現不可見字元,可以用public屬性來繞過

o:11:"filehandler":3:

②private屬性序列化的時候會引入兩個\x00,注意這兩個\x00就是ascii碼為0的字元。這個字元顯示和輸出可能看不到,甚至導致截斷,但是url編碼後就可以看得很清楚了。

同理,protected屬性會引入\x00*\x00。此時,為了更加方便進行反序列化payload的傳輸與顯示,我們可以在序列化內容中用大寫s表示字串,此時這個字串就支援將後面的字串用16進製表示。

o:11:"filehandler":3:

生成序列化**格式如下:

<?php

class flag

$a = new flag();

echo urlencode(serialize($a));//防止不可見字元無法傳參

pop鏈構造

乙個lemon類,呼叫呼叫另乙個normal類,使用了乙個action方法,而這個action方法,eval類也有

<?php

class lemon

function __destruct()

}class normal

}class evil

}unserialize($_get['d']);

呼叫方法如下:

<?php

class lemon

}class evil

echo urlencode(serialize(new lemon()));

echo "\n\r";

此處 protect $classobject = new evil() 是不行的,需要通過__construct來例項化

poc如下:

o:5:"lemon":1:}

phar://協議

<?php

class b

}$phar = new phar("test.phar"); //例項化乙個phar類,並輸出該檔案

$phar -> startbuffering(); //開啟快取

$phar -> setstub("/*可以加任何東西*/<?php __halt_compiler(); ?>/*此處不行*/")

//phar檔案的標誌類(乙個php**)<?php __halt_compiler(); ?>

$o = new b();

$o -> name = 'paohhee';

$phar -> setmetadata($o); //設定**

$phar -> addfromstring("test.txt","test"); //寫入資料 ,此處不需要使用

$phar ->stopbuffering();

往**資料中寫入乙個 物件,該物件會以序列化的方法儲存下來,在提取時會成反序列化

php反序列漏洞 例項 PHP反序列化漏洞

雖然胳膊廢了,也不能停止我更新的腳步。寫個簡單點的吧 0x00 何為類和物件 說到序列化和反序列化就不得不提到兩個詞 類和物件 那麼什麼是類,什麼是物件 教科書式的答案是類是物件的抽象,物件是類的例項 那啥叫個抽象,啥叫個例項呢 簡單的說,類就是物件的乙個標準模板,而物件就是按照模板做出來的實物 一...

PHP反序列化漏洞

序列化簡單利用 serialize 序列化 使用函式serialize 可將例項序列化為字串 unserialize 反序列化 使用函式unserialize 可將序列化的字串還原 示例 class example unserialize get code 漏洞利用 構造漏洞利用的 儲存為test....

PHP反序列化漏洞

前幾天安恆月賽兩道web題中有一道題是關於php反序列化的,然後剛好前幾天剛好看過這個知識點,於是乎這次比賽才沒有爆零,總算是寫出來了一道題 doge 所有php裡面的值都可以使用函式serialize 來返回乙個包含位元組流的字串來表示。unserialize 函式能夠重新把字串變回php原來的值...