攻防世界unserialize3题解

发布时间 2023-07-08 14:24:36作者: 是广东不是东

首先看题目知道是一道反序列化的题,说实话对于我这种菜鸡也是有点难度,这篇文章也是给像我一样的菜鸡写的,听大佬说写文章也是一种学习方式就试一下各位大佬轻点

#1概述

1.首先说到反序列化在这里给大家提一嘴反序列化作用,压缩格式化储存在数据传输中会比较方便,我们把一个东西放在磁盘里我们要用的时候可以随时把他拿出来,无论什么时候调用都可以恢复原样,听大佬说是用来解决php对象传递的一个问题---php在执行结束后会将对象销毁,而下一个页面要用到刚刚销毁的对象就用不了了(此时下一个页面心中也许会有一万个草泥马奔腾而过)而你又不能不销毁他,不然对象占用的内存又不能释放出来,当 PHP 脚本创建一个对象,但在使用完毕后未及时销毁该对象,就会导致该对象所占用的内存无法释放,从而导致内存泄漏。所以就想出了一个办法,就是php序列化要用的时候就反序列化一样就可以了,口头化一点序列化就是把对象传化成可传输的字符串而反序列化就是将字符串还原成对象(就像乘法和除法一样是互相的逆运算)

至于对象是个什么东东,解释在这:https://www.php.cn/faq/485330.html

2.举个栗子

<?php
class chybeta{
var $test='guangdong';
}
$class1 = new chybeta; //这里就是创建一个对象啦
$class1_ser = serialize($class1);  //将这个对象序列化
print_r($class1_ser);
?>

结果就是输出将对象序列化后的可传输字符串

解释一下:

O:7:"chybeta":1:{s:4:"test";s:9:"guangdong";}

O是object对象的意思

7代表函数名有7个占位

chybeta是对象名

1代表有一个变量

s就是string字符串

3.魔法函数

常见的几个魔法函数:
        __construct()当一个对象创建时被调用

        __destruct()当一个对象销毁时被调用

        __toString()当一个对象被当作一个字符串使用

        __sleep() 在对象在被序列化之前运行

        __wakeup将在序列化之后立即被调用

当我们碰到这几个魔法函数就要好好想一下序列化和反序列化了,如果服务器能接收反序列化过的字符串,将其变量未经任何过滤放入到魔法函数中就容易存在漏洞

#2实战

拿到题目了就给了这个

class xctf{
public $flag = '111';
public function __wakeup(){
exit('bad requests');
}
?code=

让我们康康有什么不对劲的东西

看到了魔法函数wakeup()

__wakeup()漏洞:一个对象被序列化后如果其属性被修改就不会执行此函数

那么这道题的思路就出来了:将这个对象进行反序列化传值修改其属性就可以绕过了

<?php
class xctf{
    public $flag = '111';
    public function __wakeup(){
        exit('bad requests');
    }
}
$c new xctf();
print(serialize($c));
?>

得到输出,大括号前的1是属性的个数将其修改即可绕过__wakeup()使exit()不被执行

拿到flag

 

这道题利用的是反序列化的知识:当被反序列化的字符串对应的属性个数发生改变会使反序列化失效---__wakeup()不可执行,如果不将1改成2那么就直接调用__wakeup()从而返回bad requests

 

顺便提一嘴这是我自己创建的交流群:275875303 欢迎各位大佬和像我一样的小白进群交流