PHPGGC學習----理論

本文首發於先知: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類型

相關文章
相關標籤/搜索