本文首發於先知:https://xz.aliyun.com/t/5450
PHPGGC 是一款可以自動生成主流框架的序列化測試payload的工具,相似 Java 中的 ysoserial, 當前支持的框架包括Doctrine, Guzzle, Laravel, Magento, Monolog, Phalcon, Slim, SwiftMailer, Symfony, Yii 和 ZendFramework,能夠說是反序列化的武器庫了。本文從該工具出發,以 Drupal Yaml 反序列化漏洞和 Typo3 反序列化漏洞爲例, 分析其中的多種利用方式,並介紹一下今年 BlackHat 議題關於新型 php 反序列化攻擊的部分。
首先git clone一下項目:php
git clone https://github.com/ambionics/phpggc
運行phpggc 的條件是php cli的版本>=5.6html
1:使用方法:laravel
經過./phpggc -l 能夠列出全部可用的pop鏈,其中每條鏈條都包括可利用組件的名稱、版本範圍、可利用其進行的操做、觸發的反序列化函數(即攻擊向量)git
經過./phpggc 組件名 -i 能夠顯示與組建相關的信息,其中就包括了具體生成攻擊payload所須要的參數github
以上圖爲例,生成laravel/rce1的payload須要提供函數名以及傳給該函數的參數,所以使用:shell
便可生成序列化的payload數組
對於只能知足寫文件需求的組件,要利用必須知道網站的絕對路徑,例如目標網站絕對路徑爲:app
/var/www/html,須要寫入shell.php ,寫入的文件位於咱們本機的/tmp/data,則須要執行:框架
利用phpggc -w參數能夠對序列化的數據進行一個再次包裝處理ionic
若是漏洞代碼以下:
<?php
$data = unserialize($_GET['data']); print $data['message'];
傳入的data是一個二維數組,而且data的值不是一個序列化的字符串,而data['message']的值纔是一個字符串,所以要反序列化的是鍵message對應的值,所以可使用
process_object($object): Called right before serialize(), allows to change the object
即在序列化數據造成以前能夠改變要序列化的對象,這裏只須要將要序列化的對象的值賦給message,便可以使用:
<?php
# /tmp/my_wrapper.php
function process_object($object) { return array( 'message' => $object ); }
這裏將序列化對象的值賦給了message,而且返回爲一個數組,而後再對數組進行serialize()函數處理,造成序列化的數據,運行結果以下:
由上面兩個圖能夠看出通過再次包裝處理,序列化的數據成了一個包含一個元素的數組,即a:1
phpggc也支持生成phar歸檔的序列化數據:
phpggc也支持編碼:
./phpggc -b -u -u slim/rce1 system id
好比如上則是對生成的序列化數據先進行base64,再進行urlencode兩次
高級用法:
使用-f參數進行快速反序列化,在unserialize()函數之後當即銷魂對象,而不是在php腳本運行結束之後,建議在組件的攻擊向量爲__destruct時進行使用,有利於提升穩定性,加上-s選項進行軟urlencode
例如:
ASCII Strings:
使用-a參數將序列化數據中的空字符轉換爲其16進制的表示,可是在一些狀況下可能不適用
Plus Numbers:
主要用於bypass,若是waf檢測序列化數據中是否包含php對象,經過正則O:[0-9]+來判斷,則能夠經過O:+123代替
O:123
--plus-numbers <types>
其中types是指要在何種數據類型的數字前加「+」,好比O就是php對象,i就是int類型