CTF做题笔记--unserialize3

文章讲述了如何通过PHP中的反序列化过程,利用__wakeup函数的特性,检测并修改序列化字符串中的属性值,以避免__wakeup函数的执行。重点介绍了序列化和反序列化的概念以及如何利用serialize()函数获取和修改属性值。

这道题主要是考察大家反序列化的知识,我们先来进入一下题目

通过观察,在这里有一个wakeup()函数,我们就可以得知这是一个反序列化的漏洞

在这里我们先介绍一下什么叫序列化,

序列化指的是:是将变量转换为可保存或传输的字符串的过程,反序列化就是一个相反的过程

PHP反序列化漏洞:执行unserialize()时,先会调用__wakeup()。

当序列化字符串中属性值个数大于属性个数,就会导致反序列化异常,从而跳过__wakeup()。

所以在这道题目中,我们需要去确认一下该序列化字符串的属性值

那么我们该如何去实现呢?诶,我们可以通过serialize()函数来获取属性值

<?php
    class xctf{
        public $flag = '111';
        public function __wakeup(){
        exit('bad requests');
        }
    }
    $code = new xctf();  //使用new运算符来实例化类xctf的对象为code
    echo(serialize($code));

?>

 我们运行这个代码块:

我们得到了上面这段字符串,乍一看还挺复杂,我来解释一下:

O:表示被序列化的是一个对象

4:表示对象名 xctf 有4个字符

"xctf":表示对象的名称为 xctf

1:表示该对象只有一个属性

{}:表示该对象的属性列表为空

s:表示属性类型为字符串

4:表示属性名 flag 有4个字符

"flag":表示属性名为 flag

s:表示属性类型为字符串

3:表示属性值 111 有3个字符

"111":表示属性值为 111

如果我们按照上图的方式,直接将获取的字符串输入进去,发现wakeup()函数成功的调用了,为了让他不被使用,我们可以将里面的属性值1改成其他任意大于他的数字就可以获得flag

即:

如果你将属性值改成0的话还是会报错的:

如果不明白为什么,请往上面翻一下,上面有记录什么是php反序列化。 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值