前言:

php反序列化字符串逃逸之前没有详细的学习过,所以遇到题目看的有点懵,这次好好学习一下。

反序列化的特点

首先要了解一下反序列化的一些特点:

  1. php在反序列化时,底层代码是以 ; 作为字段的分隔,以 } 作为结尾,并且是根据长度判断内容的 ,同时反序列化的过程中必须严格按照序列化规则才能成功实现反序列化 。
class A{public $name='shy';public $pass='123456';
}$lemon = new A();
echo serialize($lemon);
#反序列化后的结果为:
O:1:"A":2:{s:4:"name";s:3:"shy";s:4:"pass";s:6:"123456";}

超出的部分并不会被反序列化成功,如下图:

这说明反序列化的过程是有一定识别范围的,在这个范围之外的字符都会被忽略,不影响反序列化的正常进行。而且可以看到反序列化字符串都是以";}结束的,那如果把";}添入到需要反序列化的字符串中(除了结尾处),就能让反序列化提前闭合结束,后面的内容就相应的丢弃了。

2. 长度不对应的时候会报错

在反序列化的时候php会根据s所指定的字符长度去读取后边的字符。如果指定的长度错误则反序列化就会失败

3. 可以反序列化类中不存在的元素

<?php
$str='O:1:"A":3:{s:4:"name";s:3:"shy";s:4:"pass";s:6:"123456";s:5:"pass2";s:6:"123456";}';
var_dump(unserialize($str));


这些特点一定要清楚,否则在做题时可能就因为这些基础知识而做出不来。

字符串逃逸

0x0:特点

这类CTF题目的本质是因为改变序列化字符串的长度,从而导致反序列化漏洞。

具体的话大致都是因为php序列化后的字符串经过了替换或者修改,导致字符串长度发生变化。而且总是先进行序列化,再进行替换修改操作。

0x01:过滤后字符变多

实验代码:

#参考字节脉搏实验室
<?php
function lemon($string){$lemon = '/p/i';return preg_replace($lemon,'ww',$string);
}
$username = $_GET['a'];
$age = '20';
$user = array($username,$age);
var_dump(serialize($user));
echo "<br>";$r = lemon(serialize($user));
var_dump($r);
var_dump(unserialize($r));
?>

正常输入的话

因为我们输入的是apple,含有两个p,所以会被替换成四个w,但是发现长度并没有变化,因此根据反序列化的特点,指定的长度错误则反序列化就会失败。

但是正是因为存在这个过滤,我们便可以去修改age的值,首先来看一下,原来序列化后";i:1;s:2:"20";}长度为16,我们已经知道了当输入一个p会替换成ww,所以如果输入16个p,那么会生成32个的w,所以如果我们输入16个p再加上构造的相同位数的";i:1;s:2:"30";},恰好是32位,即

32 pppppppppppppppp";i:1;s:2:"30";}
经过替换后
32 wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww

所以非常明显了,在过滤后的序列化时会被32个w全部填充,从而使构造的代码 ";i:1;s:2:"30";} 成功逃逸,修改了age的值,而原来的那";i:1;s:2:"20";}则被忽略了因为反序列化字符串都是以";}结束的,我们传入的";i:1;s:2:"30";}已经在前面成功闭合了

0x02:过滤后字符变少

搭建一个简单的实验环境代码如下:

#参考Mr. Anonymous师傅的代码学习
<?php
function str_rep($string){return preg_replace( '/lemon|shy/','', $string);
}$test['name'] = $_GET['name'];
$test['sign'] = $_GET['sign'];
$test['number'] = '2020';
$temp = str_rep(serialize($test));
printf($temp);
$fake = unserialize($temp);
echo '<br>';
print("name:".$fake['name'].'<br>');
print("sign:".$fake['sign'].'<br>');
print("number:".$fake['number'].'<br>');
?>

如果正常输入的话,回显出的结果如下:

已经知道number的值是固定的2020

如果想要修改这个值,就要在sign中加入";s:6:"number";s:4:"2000";},其长度为27,仔细观察便可以发现是利用反序列化的第一个特点底层代码是以;作为字段的分隔,以}作为结尾,想要将之前的number挡在序列化之外,从而可以反序列化自己构造的,但直接输入发现是不行的,并没有将我们输入的给反序列化了


在实验代码中有替换功能,当遇到lemon 或 shy会自动替换为空,也这里用shy做为name的输入,故意输入敏感字符,替换为空之后来实现字符逃逸,三个字符变成零个字符,吃掉了三个字符,输入8个shy,也就是腾出了24个字符的空间,利用这个空间来进行构造,由于";s:4:"sign";s:54:"hello成了name的内容,所以还要在后面加个";s:4:"sign";s:4:"eval作为sign序列化的内容。


这个构造其实也很简单,因为经过测试发现,";s:4:"sign";s:这个长度其实是不变的,变的是我们在参数sign输入的参数,这里假设输入9个shy,那么吃掉了27个字符,对应的就需要添加27个字符,目前";s:4:"sign";s:这个长度为15,所以还差12个,因为整个payload肯定是不超过100个字符的,所以加上后面的长度,也就是";s:4:"sign";s:xx:",这个长度为19,因此我们要输入的字符只需8个即可

payload:

http://127.0.0.1/1.php
?name=shyshyshyshyshyshyshyshyshy
&sign=hello123";s:4:"sign";s:4:"eval";s:6:"number";s:4:"2000";}


这样便可以将number的值给更改了,原理的话就是这样,做题时还要多动手进行测试。

浅析php反序列化字符串逃逸相关推荐

  1. [0CTF 2016]piapiapia php反序列化字符串逃逸

    一.php反序列化字符串逃逸 <?phpclass user{public $user = 'admin';public $pass = 'passwd'; }$a = new user(); ...

  2. php反序列化--字符串逃逸

    php反序列化–字符串逃逸 PHP反序列化的字符串逃逸,一共分有两种情况,情况一:过滤后字符串变多,情况二:过滤后字符变少(本篇文章默认已有反序列化相关知识基础) 过滤后字符串变多 以ctfshow- ...

  3. PHP反序列化字符串逃逸

    例题可看:https://www.cnblogs.com/v2ish1yan/articles/16118319.html 今天才学的,做个记录. 字符串逃逸分为两种,减少和增多. 主要是通过一个pr ...

  4. CTFshow新春欢乐赛--web6--反序列化字符串逃逸

    web6 考点:反序列化数组+字符串逃逸 这道题还是挺有意思的,首先看代码 <?phperror_reporting(0); highlight_file(__FILE__); $functio ...

  5. php反序列化字符逃逸

    文章目录 php反序列化字符逃逸 php反序列化字符逃逸的原理 php反序列化字符逃逸分类 过滤后字符变多 过滤后字符串变少 参考文章: php反序列化字符逃逸 php反序列化字符逃逸的原理 当开发者 ...

  6. PHP反序列化由浅入深,细说php反序列化字符逃逸

    原标题:细说php反序列化字符逃逸 11/5 文章共计4381个词 预计阅读10分钟 前言 php反序列化的字符逃逸算是比较难理解的一个知识点,在最近的好几场比赛中都出现了相关的题,于是下定决心彻底理 ...

  7. 一道ctf题关于php反序列化字符逃逸

    0x01 前言 无意间做应该是0ctf2016的一道web题,get新点,总计一下. 0x02 代码审计 进去之后是一个登录界面,试了一下register.php发现可以注册,注册完成后登录跳转到up ...

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

    11月的第一个星期浅浅学习了一下PHP反序列化字符逃逸,也算是给11月开了个好头,作为一只刚刚开始学习网络安全的小白 ,基础知识不太行,如果有不对的地方欢迎大家指正,阿里嘎多,但是看了一些老师的视频和 ...

  9. 0CTF-2016-piapiapia(PHP反序列化字符逃逸)

    0CTF-2016-piapiapia(PHP反序列化字符逃逸) 0x01 前言 开学果然是对更新博客没得想法,趁着闲工夫,做了一下这个题,之前XCTF新春赛也出现了PHP反序列化逃逸,不过没做出来. ...

最新文章

  1. WiredTiger引擎编译 及 LT_PREREQ(2.2.6)问题解决
  2. 怎么计算一组数据的波动_[理论+spss实战]一组数据的描述性统计分析
  3. 学习官方示例 - System.Frac: 返回小数部分
  4. Apache虚拟主机指南
  5. winform程序最大化时,页面显示不全的问题
  6. 从0到1写RT-Thread内核——线程定义及切换的实现
  7. PRML-系列一之1.2.2~1.2.3
  8. OkHttp+Stetho+Chrome调试android网络部分(原创)
  9. spring的事务回滚机制,事务原理
  10. XP下安装ubuntu双系统
  11. SpringBoot自学笔记《黑马程序员》
  12. 小米手机 浏览器 添加收藏页面到主页
  13. 怎样全面了解应聘者的实力
  14. jetlinks之Thing(六)
  15. HTML特效代码大全
  16. 苹果电脑系统太卡如何彻底清理内存?
  17. Flash Player For Android
  18. 数学文化 卢卡斯数列和黄金分割
  19. 【基础框架-SSM】MyBatisPlus入门
  20. 操作系统基本功能(操作系统)

热门文章

  1. 三十三、深入Vue.js语法(上篇)
  2. redis 启动无输出_深入剖析Redis系列: Redis入门简介与主从搭建
  3. 千元显卡玩转百亿大模型,清华推出工具包BMInf让模型推理轻而易举
  4. 关于NLP相关技术全部在这里:预训练模型、图神经网络、模型压缩、知识图谱、信息抽取、序列模型、语法分析、文本处理...
  5. 第四届AutoDL挑战赛——AutoSpeech2019正式开赛
  6. 从CNN视角看在自然语言处理上的应用
  7. PaperWeekly社区 | 知识图谱 vs. 对话系统专题讨论
  8. 爬虫笔记7正则表达式与re库
  9. log4j监控mybatis的普通配置
  10. hibernate原理