11月的第一个星期浅浅学习了一下PHP反序列化字符逃逸,也算是给11月开了个好头,作为一只刚刚开始学习网络安全的小白 ,基础知识不太行,如果有不对的地方欢迎大家指正,阿里嘎多,但是看了一些老师的视频和文章终于懂了一点点,依照自己的理解记录一下,下面请欣赏wmm的第一篇博客,嘎嘎嘎。
First:PHP序列化格式(serialize)
<?php
class student{
public $name;
public $age;
function __construct($name,$age){
$this->name = $name;
$this->age = $age;
}
}
$a=new student("wmm",100);
var_dump(serialize($a));
?>
string(55) "O:7:"student":2:{s:4:"name";s:3:"wmm";s:3:"age";i:100;}"
O:7:"student":2:
O:class,序列化的对象类型
7:代表序列化对象名称的字符长度
2:字段数量(这些字段包括在对象所在类及其祖先类中用 var、public、protected 和 private 声明的字段,但是不包括 static 和 const 声明的静态字段)
{s:4:"name";s:3:"wmm";s:3:"age";i:100;}
s:变量类型
4:变量名长度
name:变量名
s:变量值的类型
3:变量值的长度
wmm:变量值
两个一组分别表示变量和变量的值
序列化字符逃逸利用的是:1.反序列化过程中是以字符长度为标准,而不是";"
2.反序列过程中是以.";}为结束标志
Second:修改替换后字符串变长
示例
<?php
function filter($str){
return str_replace('a', 'ab', $str);
}
class student{
public $name='aaa';
public $age='100';
}
$a=new student();
$b=serialize($a);
echo $b;
?>
O:7:"student":2:{s:4:"name";s:3:"aaa";s:3:"age";s:3:"100";}
O:7:"student":2:{s:4:"name";s:3:"ababab";s:3:"age";s:3:"100";}
$a中$name的‘aaa'会被替换成’ababab'长度大于序列化后规定的长度3,会导致反序列化过程报错,反序列化过程中会先找到aba,找够三个字符,后找";,但是后面两个字符是ba,导致反序列化出现问题
class student{
public $name='aaaaaaaaaaaaaaaaaaaaaaa";s:3:"age";s:3:"100";}';
public $age='100';
}
O:7:"student":2:{s:4:"name";s:46:"ababababababababababababababababababababababab";s:3:"age";s:3:"100";}";s:3:"age";s:3:"100";}
构造$name='aaaaaaaaaaaaaaaaaaaaaaa";s:3:"age";s:3:"100";}',替换后会多出23个字符,刚好将 ";s:3:"age";s:3:"100";}这23个字符顶出,反序列化过程中会先寻找46个字符ababababababababababababababababababababababab,然后发现了”;进行下一个字段的反序列化,s:3:"age";s:3:"100",后发现";},代表着序列化字符结束,导致后面的字符被丢弃,停止反序列化
相关题目:BUUCTF piapiapia
Third 修改替换后字符串变短
示例
<?php
function filter($str){
return str_replace('ab', 'a', $str);
}
class student{
public $name='ababab';
public $age='100';
}
$a=new student();
$b=serialize($a);
echo $b;
?>
O:7:"student":2:{s:4:"name";s:3:"ababab";s:3:"age";s:3:"100";}
O:7:"student":2:{s:4:"name";s:3:"aaa";s:3:"age";s:3:"100";}
$a中$name的‘ababab'会被替换成’aaa'长度小于序列化后规定的长度6,会导致反序列化过程报错,反序列化过程中会先找够6个字符,aaa";s,后找";,但是后面两个字符是;3,导致反序列化出现问题
class student{
public $name='ababababababababababababababababab';
public $age=';s:4:"name";s:3:"wmm";s:3:"age";s:3:"100";}';
}
O:7:"student":2{s:4:"name";s:34:"aaaaaaaaaaaaaaaaa";s:4;"name";s:3:"wmm";s:3:"age";s:22:";s:3:"age";s:3:"100";}";}
构造$name='ababababababababababababababababab',替换后会少出17个字符,刚好将 $age=';s:3:"age";s:3:"100";}'序列化后的前17个字符吃进去,反序列化过程中会先寻找34个字符,aaaaaaaaaaaaaaaaa";s:3:"age";s:22:,然后发现了”;进行下一个字段的反序列化,s:4:"name";s:3:"wmm";s:3:"age";s:3:"100",后发现";},代表着序列化字符结束,导致后面的字符被丢弃,停止反序列化
相关题目:BUUCTF easy_serialize_php