1、序列化的概念(摘自pikachu平臺的介紹)
(1)序列化serialize()
序列化說通俗點就是把一個物件變成可以傳輸的字串,比如下面是一個物件:
class S{
public $test="pikachu";
}
$s=new S(); //創建一個物件
serialize($s); //把這個物件進行序列化
序列化后得到的結果是這個樣子的:O:1:"S":1:{s:4:"test";s:7:"pikachu";}
O:代表object
1:代表物件名字長度為一個字符
S:物件的名稱
1:代表物件里面有一個變數
s:資料型別
4:變數名稱的長度
test:變數名稱
s:資料型別
7:變數值的長度
pikachu:變數值
(2)反序列化unserialize()
就是把被序列化的字串還原為物件,然后在接下來的代碼中繼續使用,
$u=unserialize("O:1:"S":1:{s:4:"test";s:7:"pikachu";}");
echo $u->test; //得到的結果為pikachu
序列化和反序列化本身沒有問題,但是如果反序列化的內容是用戶可以控制的,且后臺不正當的使用了PHP中的魔法函式,就會導致安全問題
常見的幾個魔法函式:
__construct()當一個物件創建時被呼叫
__destruct()當一個物件銷毀時被呼叫
__toString()當一個物件被當作一個字串使用
__sleep() 在物件在被序列化之前運行
__wakeup將在序列化之后立即被呼叫
2、反序列化漏洞演示:
1、反序列化漏洞的攻擊原理,
(1)一般反序列化漏洞都是通過代碼審計而發現,一般的黑盒測驗是很難發現的,
(2)例如我們通過代碼審計發現了漏洞,我們要測驗這個漏洞,那么我可以根據站點后臺的邏輯進行payload的生成,
(3)我們將生成的payload(一串序列號的字串)通過前臺介面發送至后臺,后臺在創建、銷毀物件的時候會執行魔法函式,比如取出物件的值,那么如果物件的值是一段惡意的js代碼,那么將會被執行,
2、下面開始正式的演示環節,我們先來觀察代碼:
3、我們根據上邊的邏輯進行構建,生成我們的payload,
(1)我們在我們的站點環境根目錄下創建一個PHP檔案(我這里是test.php),寫一段我們的PHP代碼如下:
<?php
class S{
var $test = "<script>alert('xss')</script>";
}
echo '<br>';
$a = new S();
echo serialize($a);
?>
(2)我們通過瀏覽器訪問這個檔案,
(3)我們查看頁面源代碼,獲得我們的payload,
4、執行下圖中的操作,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/43257.html
標籤:其他
