Wmm的学习日记(浅学PHP反序列化字符逃逸)

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

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值