一道挺好的web。

做完这一题,感觉php序列化(甚至魔术方法)之类的有点开始玩明白了。

题面很长:

  预备知识:

   PHP类的方法中,有一部分以下划线开头的“魔术方法”。不同于普通方法的 被调用才会执行,魔术方法在满足某些条件时会自动执行。

   __construct()在使用new声明对象时会自动执行;

   __destruct()在对象被释放(unset或在程序结束时自动释放)时自动执行;

   __wakeup()在对象被成功unserialize时自动执行;

   __sleep()在对象被serialize时自动执行;

   __toString()在对象被当作字符串使用时自动执行;

    这里特别解释一下,“对象被当作字符串使用”是指对象被作为一个函数或方法的参数,而该参数本来限定为字符串类型。

    emmmm因为PHP弱类型的原因,我对这个理解也不是特别清楚。直接举例:

      echo new 类名();  会触发__toString(),因为echo可以输出字符串但不能直接输出对象。

      addslashes($xxx); 当$xxx是对象时会触发__toString(),因为addslashes本应操作字符串的。

   __call()在调用不存在的方法时被调用。本题里,就可以看到经典的__call()触发实例。

    addslashes在字符串中的单引号、双引号、反斜杠和NULL之前添加反斜杠。

     默认地,PHP 对所有的 GET、POST 和 COOKIE 数据自动运行 addslashes()。

分析本题,我们的最终目标,是进入Admin::login且相关变量符合条件;

要这样,我们必须借助Admin::__toString()

如何进入呢?Admin自己方法中的addslashes肯定不行;

  我们借助Guest中的addslashes,控制它参数其中的一个为Admin类。

如何进入Guest::__call()呢?得让一个Guest类的对象执行一个Guest类没有的方法。

程序中的__construct我们是控制不了的;除此之外调用方法的地方就只有:

  User::login中的$this->admin->ban();Guest类没有ban方法。

  User有可用的__wakeup(); 搞定了。

最终payload:

  

SharkCTF2021 bbpop题记的更多相关文章

  1. SharkCTF2021 fastcalc题记

    web --> python脚本编写练习. 直接访问发现全是乱码: 看包发现Content-Type里面没有charset=utf-8. 于是用python访问一下,用.encoding='ut ...

  2. SharkCTF2021 easy_phpserialize题记

    ***先说教训: (1)不要看到正则就走不动路:有些正则不一定能绕. (2)__wakeup()漏洞在php5.6以上就被修复了: 本地复现各种题目时要注意环境. -------- 扫描,得到inde ...

  3. SharkCTF2021 bybypass&baby_phpserialize题记

    (国庆褪10天了 先水一篇) bybypass: payload:?anime_is_bae=hehellotherehoomanllotherehooman baby_phpserialize ro ...

  4. kendo-ui学习笔记——题记

    1.Kendo UI基于最新技术HTML5.CSS3和JavaScript标准设计开发.2.官方网址:http://www.kendoui.com/3.API网上查阅英文版网址:http://docs ...

  5. NOIp 0924 水题记

    这场貌似是gcd专场? 第一题很有意思,模拟gcd的过程即可. //0924 candy //by Cydiater //2016.9.24 #include <iostream> #in ...

  6. 使用Netty收发二进制报文问题记

    1.java二进制编解码 byteBuffer.flip() byteBuffer.getInt() 与 byteBuf.getInt(11) 2.粘包拆包问题 LengthFieldBasedFra ...

  7. 51nod水题记

    妈呀51nod已经刷不动了又开始跟bzoj一样总是得看题解了...那么发一下总结吧... 1051:最大子矩阵 #include<cstdio> #include<cstring&g ...

  8. 把这两天遇到的码(e)农(xin)题记下来

    1019: [SHOI2008]汉诺塔 1858: [Scoi2010]序列操作 1058: [ZJOI2007]报表统计

  9. 2014第一周五开发问题记URL传参乱码等

    今天修改了页面中URL传中文参数乱码问题,本来远离通过在tomcat中配置URIEncoder是可以解决所有乱码问题的,但怕以后有人下载一个新的tomcat然后直接把程序放里面运行然后再发现乱码问题而 ...

随机推荐

  1. 提交Spark作业遇到的NoSuchMethodError问题总结

    测试应用说明 测试的Spark应用实现了同步hive表到kafka的功能.具体处理流程: 从 ETCD 获取 SQL 语句和 Kafka 配置信息 使用 SparkSQL 读取 Hive 数据表 把 ...

  2. jq的slideToggle效果

    slideToggle() 方法通过使用滑动效果(高度变化)来切换元素的可见状态. 如果被选元素是可见的,则隐藏这些元素,如果被选元素是隐藏的,则显示这些元素. 例子:一个简单的下拉菜单效果----& ...

  3. openswan发送状态机分析

    openswan发送状态机分析 1. 函数调用关系 2. 函数说明 如果按用户空间.内核空间划分的话,此部分代码更多是运行在内核空间的. 2.1 ipsec_tunnel_init_devices() ...

  4. python爬区csdn文章信息(原始稿)

    使用python对csdn的博主文章进行爬取,期间又遇到了新的问题和旧的已经遇到过的问题.首先做一个笔记,免得以后遇到同样的问题时还得浪费时间和经历. 刚开始目的没那么明确,主要在于熟悉相关的规则及流 ...

  5. IO流实现简单的文件的剪切

    思路: 判断 即将 复制的文件是文件夹还是文件 遍历需要复制的源文件夹 如果是文件夹,就通过流创建一个同样的子文件夹 如果是文件,就复制过去 接下来上代码 public class Demo1 { p ...

  6. Java基础学习3

    Java语法学习3 基本运算符 关系运算符返回结果为布尔类型 %:取余 模运算 +.-.*./.% :二元运算符 两个变量间的运算 ++.-- 一元运算符 package Study; public ...

  7. mysql升级-rpm安装

    mysql版本5.7.29升级到5.7.30 由于我们安装mysql的方式是通过mysql-5.7.29-1.el7.x86_64.rpm-bundle.tar中的rpm包安装:rpm -Uvh my ...

  8. 真香!原来 CLI 开发可以这么简单

    CLI(命令行工具,Command Line Interface)大家都非常熟悉了,比如 create-react-app 等.我们今天介绍一个 CLI 工具的开发框架,可以帮助我们快速构建 CLI ...

  9. [AtcoderABC200E]Patisserie

    [AtcoderABC200E]Patisserie 题面翻译 对于一个三元组\((i,j,k)\) 我们对它按如下要求进行升序排序: 第一关键词 \(i + j + k\) 即三者总和 第二关键词 ...

  10. vue中的watch

    1.第一种 watch:{ total:{ // total:要检测的数据   handler:(val,oldVal)=>{ // handler方法自动执行   }, deep:true / ...