一道挺好的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. iNeuOS工业互联平台,增加OPC UA驱动,同步和订阅方式读取数据

    目       录 1.      概述... 1 2.      平台演示... 2 3.      OPC UA应用效果... 2 1.   概述 最近的项目,用户需要使用OPC UA读取数据,通 ...

  2. noip模拟47

    原版在 \(linux\) 本地写完没保存关机给没了-- 再简单写一下 \(t2\) 用 \(dp\) 转移 \(f[i]=\sum _ {j=last[a[i]]}^{i-1} f[j]\) 用前缀 ...

  3. Linux常用命令 - nl命令详解

    21篇测试必备的Linux常用命令,每天敲一篇,每次敲三遍,每月一循环,全都可记住!! https://www.cnblogs.com/poloyy/category/1672457.html 显示行 ...

  4. Docker(23)- 注册 docker hub 的账号

    如果你还想从头学起 Docker,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1870863.html 前言 Docker Hub 是 ...

  5. 第二课:启动 GDB 调试

    使用 GDB 调试程序一般有三种方式: gdb filename gdb attach pid gdb filename corename 这也对应着本节课的核心内容: 直接调试目标程序 附加进程 调 ...

  6. Maven专题4——Maven测试

    Java世界的主流测试框架是JUnit和TestNG,Maven在构建执行到特定生命周期阶段的时候,通过插件执行JUnit和TestNG的测试用例. Maven执行测试的插件是maven-surefi ...

  7. Nginx总结(九)Nginx服务器高性能优化的配置--轻松实现10万并发访问量

    前面讲了如何配置Nginx虚拟主机,如何配置服务日志等很多基础的内容,大家可以去这里看看nginx系列文章:https://www.cnblogs.com/zhangweizhong/category ...

  8. Javascript 判断 iframe 中的变量是否为对象

    Javascript 判断 iframe 中的变量是否为对象 前言 公司之前的项目中,为了实现模块化,在 web 后端使用了 iframe 来组织框架和页面.由于当时没有很好地规划,iframe 子页 ...

  9. Android View post 方法

    解析View.post方法.分析一下这个方法的流程. 说起post方法,我们很容易联想到Handler的post方法,都是接收一个Runnable对象.那么这两个方法有啥不同呢? Handler的po ...

  10. 【PHP】随机生成名字

    public function test(){ $a = "赵 钱 孙 李 周 吴 郑 王 冯 陈 楮 卫 蒋 沈 韩 杨 朱 秦 尤 许 何 吕 施 张 孔 曹 严 华 金 魏 陶 姜 戚 ...