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类型

相关文章
相关标签/搜索