[unserialize3]攻防世界

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

[unserialize3]攻防世界
这是⼀道反序列化的题⽬,⾸先了解⼀波什么是序列化
它的定义是将对象的状态信息转换成可以存储或传输的形式的过程,这其实是解决⼀个PHP对象传递的⼀个问题。

在php⽂件执⾏结束后会将对象销毁,但是这个对象很多时候不是只调⽤⼀次的,为了解决这个问题,便⽤序列化的这种⽅式来长久保存对象。

那么反序列化也可以从中得来,既将那个存储的信息再次转换成对象的形式。

序列化返回字符串的格式
序列化返回的字符串格式
O:<length>:"<class name>":<n>:{<field name 1><field value 1>...<field name n><field value n>} O:表⽰序列化的事对象< length>:表⽰序列化的类名称长度< class name>:表⽰序列化的类的名称< n >:表⽰被序列化的对象的变量个数< field name 1>:属性名< field value 1>:属性值
接下来开始做题。

我们⾸先打开这个环境,可以看到如下代码
class xctf{ //类 public $flag = '111'; //public定义flag变量公开可见 public function __wakeup(){ exit('bad requests');}?code=
serialize()和unserialize()函数对魔术⽅法的处理:serialize()函数会检查类中是否存在⼀个魔术⽅法__sleep() 这⾥想没想到就是上⾯讲的这个函数是在序列化之前被调⽤的所以在序列化之前要检验有没有这个魔法函数。

如果存在,该⽅法会先被调⽤,然后才执⾏序列化操作,此功能可以⽤于清理对象。

unserialize()函数会检查类中是否存在⼀个魔术⽅法__wakeup(),如果存在,则会先调⽤ __wakeup ⽅法,预先准备对象需要的资源。

__wakeup()执⾏漏洞;⼀个字符串或对象被序列化后如果其属性被改变,则不会执⾏__wakeup()函数,这是⼀个绕过点
我们先执⾏下⽅代码
<?phpclass xctf{ //类public $flag = '111';//public定义flag变量公开可见public function __wakeup(){exit('bad requests');}}//少了⼀个}$a=new xctf();echo(serialize($a)); //serialize() 函数⽤于序列化对象或数组,并返回⼀个字符串。

?>
可以看到它打印出来了⼀串字符串,如果我们直接传参给code会被__wakeup()再次序列化,所以要⽤刚刚提到的漏洞
cyberpeace{5cb4d19039d0d44ba98af0d067d7c4f4}
知识补充;
⼀般魔法函数是以__开头的,再碰到这⼏个魔法函数时就好好好想想能不能利⽤序列化与反序列化漏洞了:
__constuct() 在创建对象是⾃动调⽤
__destuct() 相当于c++中的析构最后会将对象销毁,所以在对象销毁时被调⽤
__toString() 但⼀个对象被当成字符串使⽤时被调⽤
__sleep() 当对象被序列化之前使⽤
__wakeup() 将在被序列化后⽴即被调⽤ //咱们这道题就是利⽤的这个来利⽤序列化的
这些就是经常在序列化与反序列化中遇到的魔法函数了,如果服务器能接受反序列化过的字符串,并且未经过任何的过滤直接将其中的变量放进魔法函数中,就容易造成很严重的漏洞了。

相关文档
最新文档