CTF攻防世界小白刷题自学笔记4

1.unserialize3,难度:1,方向:Web,

今天的题目是反序列化,还是PHP知识,吐槽一下,我看的学习文档是有PHP章节,但是那里是一片空白,所以今天还得学习一下PHP,正好大佬的答案里给了相关的文章。题目依旧是在线场景,下面给出链接攻防世界,WEB方向新手模式第三题,打开界面如下:

大佬原话哈:代码审计走起,最重要的是这一个函数function __wakeup(),配合题目unserialize想到PHP的序列化和反序列化,关于PHP的序列化请参考文章:深度剖析PHP序列化和反序列化

__wakeup()函数用法:__wakeup()是用在反序列化操作中。unserialize()会检查存在一个__wakeup()方法。如果存在,则先会调用__wakeup()方法。

这道题的解题原理就是利用_wakeup()函数漏洞——【PHP反序列化漏洞:执行unserialize()时,先会调用__wakeup()。当序列化字符串中属性值个数大于属性个数,就会导致反序列化异常,从而跳过__wakeup()。】

 我在大佬们的答案中找到一篇更友好的文章https://xz.aliyun.com/t/3674,唯一的缺点就是大佬文章很多图片裂开了,很可惜。建议先看友好的哈,防止一开始就糊涂了。下图就是友好大佬的开篇,直接就把序列化和反序列化说清楚了。

因为我对PHP知识不懂,所以我下面就先学习一下上面的参考文章,毕竟是自学笔记,学习才是关键。如果读者很会PHP就可以跳过了,我这个系列感觉正好是把自己萌新时的困惑写下来,人往往在强大时忘记自己弱小的感受。

我看了很久了,但还是感觉似懂非懂的,没事,题目我懂了,以后再接触就好了。这道题就是利用_wakeup()函数漏洞——【PHP反序列化漏洞:执行unserialize()时,先会调用__wakeup()。当序列化字符串中属性值个数大于属性个数,就会导致反序列化异常,从而跳过__wakeup()。】

大佬原话:首先,序列化字符串的标准格式:这道题的话,如果要对 xctf 类进行正确的序列化,那么它的字符串应该是:

`O:4:"xctf":1:{S:4:"flag";S:3:"111";}`

大佬的问题—— 其实这里有一个小问题,我看到资料上说反序列化的目标是一个对象,那么现在的 `xctf`类到底可否被看作一个对象呢? - 再仔细看了一下,其实本题中序列化的目标本身就是一个对象,根据php 官方文档显示: [序列化一个对象将会保存对象的所有变量,但是不会保存对象的方法,只会保存类的名 字。](https://www.php.net/manual/zh/language.oop5.serialization.php) - 这就意味着我们不必在意对象的名称,只需要知道它是哪个类的实例化即可,表现在这道题中就是 `O:4:"xctf"` .(省流别在意,直接用)

 现在我们官方正确的序列化字符串为`O:4:"xctf":1:{S:4:"flag";S:3:"111";}`,我感觉我看到所有的序列化字符串的标准格式说的都不对,它们括号内都是S:+属性名长度:+属性名;然后我就跟着S数属性个数了,但是它们实际上都是先描述属性名+属性名对应的值的描述(即一个属性,两个S)。但有些好像不全是S,没事数这些字母或者分号;然后除以2就行。

下面废话不多说,加速,卡bug,把属性个数1改成2、3、4、5等都行,

以 get 方式发出去,直接拼接 url:/?code=O:4:"xctf":5:{S:4:"flag";S:3:"111";} ,注意:字符串两边没有单引号。直接出来了。

the answer is : cyberpeace{720c5298a7c8116c9d9513db3bb679fb}

  • 21
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值