在之前咱们剖析了php下序列化进犯的一些知识点:
由浅入深剖析序列化进犯(一)
https://www.tiechemo.com/Article/60/61/2019/93995.htm
由浅入深剖析序列化进犯(二)
https://www.tiechemo.com/Article/60/61/2019/94171.htm
由浅入深剖析序列化进犯(三)
https://www.tiechemo.com/Article/60/61/2019/95434.htm
今日咱们来剖析一下php序列化的武器库:PHPGGC。
PHPGGC 是一款可以主动生成干流结构的序列化测验payload的东西,相似 Java 中的 ysoserial,支撑很多干流结构的序列化exp一键生成。
但由于东西作者的时刻有限,不能做到实时更新。而本文旨在剖析phpggc原理,并为其增加拓宽,以便咱们参加最新的,自己需求的exp生成模块。
phpggc流程剖析
当咱们运转:
phpggc Laravel/RCE1 system id
咱们盯梢一下详细流程。
初始化流程
在创立目标时,咱们下断点,发现首要程序会进行load_gadget_chains():
紧接着程序会寻觅界说声明过的class:
经过array_filter,将程序自己结构的gadget取出:
$classes = array_filter($classes, function($class) {
return is_subclass_of($class, 'PHPGGCGadgetChain') &&
strpos($class, 'GadgetChain') === 0;
});
然后是取出模块名:
咱们跟进get_name(),就可以发现,例如:GadgetChainZendFrameworkFD1经过处理睬变成ZendFramework/FD1:
然后将模块名与类声明构成映射联系:
$gcs = array_combine($names, $classes);
至此停止,初始化进程完结。
exp生成
然后初始化完结后,咱们成功创立了PHPGGC目标x,然后调用其generate办法进行exp生成:
$x->generate();
首要是从咱们的cmdline获取脚本运转参数,并将其解析:
例如咱们此刻解分出的参数:
一起假如发现咱们没有input参数,就会友好性的打出help界面。
然后代码就会来到gadget chain的获取:
$gc = $this->get_gadget_chain($class);
这儿就用到了之前的模块名和类名的映射联系,经过咱们传入的模块名敏捷找到已声明的类。
然后在需求时,再将其包括进来:
咱们跟进该函数:
依据命名规矩,程序会在其目录gadgetchains下寻觅对应文件夹,例如咱们对应的目录为:
/phpggc/gadgetchains/Laravel/RCE/1
然后获取其目录下的gadgets.php,拿到对应的类的界说。
然后便是使用咱们界说的chain.php结构序列化了:
$parameters = $this->get_type_parameters($gc, $parameters);
$generated = $this->serialize($gc, $parameters);[1][2]黑客接单网