php反序列化之pop鏈構造

2022-06-19 09:54:10 字數 1384 閱讀 1798

本題是某信有一次內部比賽的題目,涉及到pop鏈的構造問題,所以在這裡與大家分享一下

檢視原始碼

邏輯是當引數fn存在且不包含string、zlib、flag這三個字串時,進行檔案包含

這裡的過濾是為了防止我們直接讀取到flag.php的原始碼,因為畢竟題名是反序列化

如果不存在fn,對code進行反序列化

先利用php://filter偽協議讀取try.php原始碼

再base64解碼之後拿到原始碼

1

<?php

2$test = "hello world";

3include "flag.php";

4function check_fn($filename)9

return

true;10

}1112class

agood

17}

1819

class

bgood

26}

2728

class

cgood

35 }

這裡的思路是,對agood類反序列化觸發__wakeup魔術方法,執行過程中呼叫了$gooda進行了字串拼接,觸發了bgood中的__tostring魔術方法,方法內部呼叫$items[『ss』]的變數,呼叫物件中不存在的成員變數,觸發__get($key),方法,這裡的$key就是我們所呼叫的變數的值,也就是sword。

最後輸出$$tmp,也就是要將$tmp賦值為flag,給cgood中params[$sword]賦值為flag即可。

agood中的$this->gooda觸發bgood中的__tostring方法,將$this->gooda賦值為new bgood()。

bgood中的$items[『ss』]觸發cgood中的__get函式,給$items[『ss』]賦值為new cgood()。

最後讓cgood中的$params[『sword』]=」flag」

payload

1

<?php

2class

agood89

}10class

bgood16}

1718

class

cgood

21echo

serialize(new

agood());

22 ?>

由於變數都是私有的,所以需要在變數名之前加上%00類名%00

這裡我們直接輸出,%00是輸出不出來的,所以手動加上

最後是:

PHP反序列化

php反序列化漏洞 一 序列化定義 序列化 serialization 在電腦科學的資料處理中,是指將資料結構或物件狀態轉換成可取用格式 例如存成檔案,存於緩衝,或經由網路中傳送 以留待後續在相同或另一台計算機環境中,能恢復原先狀態的過程。概念很容易理解,其實就是將資料轉化成一種可逆的資料結構,自然...

php反序列化

php序列化 將物件或變數轉換成字串。php反序列化 是將字串轉換成原來的變數。serialize serialize 函式用於序列化物件或陣列,並返回乙個字串。serialize 函式序列化物件後,可以很方便的將它傳遞給其他需要它的地方,且其型別和結構不會改變。sites array google...

PHP反序列化

類定義是以關鍵字class開頭,後跟類的名稱。類的主體是包含在一對花括號中,裡面有類的屬性與方法的定義。類屬性存在於資料段,類方法存在於 段,對於乙個類來說,類的方法不占用類的空間,佔空間的只有類的屬性。要建立乙個類的例項,必須使用new關鍵字。當建立新物件時該物件總是被賦值,除非該物件定義了建構函...