例题可看:https://www.cnblogs.com/v2ish1yan/articles/16118319.html

今天才学的,做个记录。

字符串逃逸分为两种,减少和增多。

主要是通过一个preg_replace()函数来进行字符串的减少和增多。

首先要知道逃逸的原理,就是反序列化时,是以}来进行结尾的,同时在字符串内,是以关键字后面的数字来规定所读取的内容的长度。

1.字符串增多

demo:

<?php
class A{public $a='q';public $b='21';}
$a=new A;
var_dump($a);

得到结果为:

string(45) "O:1:"A":2:{s:1:"a";s:1:"q";s:1:"b";s:2:"21";}"

要将反序列后$b的值变为我们想要的值。

我们还要有一个关键的函数。

function filter($a){$filter='/q/i';return preg_replace($filter,'ww',$a);
}

这个就是将序列化后的值,将所有的'q'变为'ww'。

例子:

<?php
class A{public $a='qqqqqqq';public $b='21';}function filter($a){$filter='/q/i';return preg_replace($filter,'ww',$a);
}
$a=new A;
var_dump(serialize($a));
echo'<pre>';
$r=filter(serialize($a));
var_dump($r);

得到:

假设我们想要$b=104,构造的$b的值的序列化后为:

";s:1:"b";s:3:"104";}
这里的";是用来闭合前面的,往下看就知道了

如何进行逃逸

我们先看看把上面的字符串加到$a后是什么样的。

然后仔细看,如果我们把s:28后面的内容以字符串按要求填满了28个,那么s:1:"b";s:3:"104";}就会被包含在序列化字符串内。而}”后面的内容,即;s:1:"b";s:2:"21";}"就不会被认为是序列化字符串的内容,从而执行了我们构造的";s:1:"b";s:3:"104";},即让一个成员b的值为104。

然后进行构造:

在上面,只要让'w'字符的数量按要求达到s:后面所要求的的数量(28)即可。

但是我们要根据实际情况来选择构造多少个w。

因为在filter函数中,一个q被换成了两个w,所以让q的数量等于";s:1:"b";s:3:"104";}的字符串长度就行了。因为";s:1:"b";s:3:"104";} 的字符串长度为21,让q的数量为21,反序列化后a的值的长度为就是q的数量加上";s:1:"b";s:3:"104";}  的长度(42),在filter()之后,w的数量就是刚好42,而我们添加上去的字符串就会被逃逸出来,会在反序列化的时候成功执行。【文笔不好】

<?php
class A{public $a='qqqqqqqqqqqqqqqqqqqqq";s:1:"b";s:3:"104";}';public $b='21';}function filter($a){$filter='/q/i';return preg_replace($filter,'ww',$a);
}
$a=new A;
var_dump(serialize($a));
echo'<pre>';
$r=filter(serialize($a));
var_dump($r);

得到

string(87) "O:1:"A":2:{s:1:"a";s:42:"qqqqqqqqqqqqqqqqqqqqq";s:1:"b";s:3:"104";}";s:1:"b";s:2:"21";}"string(108) "O:1:"A":2:{s:1:"a";s:42:"wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww";s:1:"b";s:3:"104";}";s:1:"b";s:2:"21";}"

然后再进行反序列化就可以发现,$b的值变成了104。

接上面代码:

print_r(unserialize($r));

总的就是说,让字符'w'占用了原本属于";s:1:"b";s:3:"104"}的位置,从而让";s:1:"b";s:3:"104"}逃逸出去而成功执行。

2.字符串减少

demo:

<?php
class A{public $a='qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq';public $b='20';}
function filter($a){$filter='/qq/i';return preg_replace($filter,'w',$a);
}
$a=new A;
var_dump(serialize($a));
echo '<pre>';
$r=filter(serialize($a));
var_dump($r);

由名字可知,这个就是让字符串变少。

那么要如何让字符串逃逸呢?

同上面字符串增加:如果要让$b=104,那么他的序列化后就是:";s:1:"b";s:3:"104";}

但是前面要加个东西,如:A";s:1:"b";s:3:"104";},那个A是用来闭合的。

我们先把$b=A";s:1:"b";s:3:"104";}

得到:

这里可以看到,在序列化字符串里,有两个 s:1:"b",第一个是序列化得到的,第二个是我们自己构造的。

那么要如果让我们构造的104生效呢?

就要让s:1:"a":s:32:"读取到s:22:"A",这样s:22:"A就会变成$a的值了,后面的内容就可以执行,所以这个时候就要想如何使这些字符串在一个合理的数量了。

有filter可以知道,两个q会变成一个w,所以只要让w的个数等于黄色字符串的长度

"O:1:"A":2:{s:1:"a";s:44:"wwwwwwwwwwwwwwwwwwwwww";s:1:"b";s:22:"A";s:1:"b";s:3:"104";}";}"

这个黄色字符串长度为17,所以qq的数量就为17,就有34个q。

所以这样:

<?php
class A{public $a='qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq';public $b='A";s:1:"b";s:3:"104";}';}
function filter($a){$filter='/qq/i';return preg_replace($filter,'w',$a);
}
$a=new A;
var_dump(serialize($a));
echo '<pre>';
$r=filter(serialize($a));
var_dump($r);
print_r(unserialize($r));

就可以得到

看$b变成了104。

与字符串增加的区别:

1.字符串增加:构造的序列化加在qqqq(就是值有很多qqqq的)那个变量里。字符串减少:构造的序列化加在另一个变量里。

2.字符串增加:字符串'qqqqxxx'的数量依照构造的那个序列化字符串的长度。字符串减少:字符串'qqqqxxx'的数量依照"O:1:"A":2:{s:1:"a";s:44:"wwwwwwwwwwwwwwwwwwwwww";s:1:"b";s:22:"A";s:1:"b";s:3:"104";}";}"中黄色字符串的长度。(只能意会)(doge)

PHP反序列化字符串逃逸相关推荐

  1. 浅析php反序列化字符串逃逸

    前言: php反序列化字符串逃逸之前没有详细的学习过,所以遇到题目看的有点懵,这次好好学习一下. 反序列化的特点 首先要了解一下反序列化的一些特点: php在反序列化时,底层代码是以 ; 作为字段的分 ...

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

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

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

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

  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. url获取网站信息不包含网页源文件内的标签_前嗅ForeSpider链接抽取应用场景及链接在源码的html标签里写脚本...
  2. R语言使用sqldf包按照SQL语法操作dataframe数据(Using SQL statements to manipulate data frames)
  3. Rancher upgrade webhook之CI/CD
  4. 微软发布Azure Service Fabric Mesh公开预览版
  5. hooks组件封装 react_react-hooks amp; context 编写可复用react组件的一种实践
  6. 笨办法学 Python · 续 练习 20:二叉搜索树
  7. 为什么优秀的程序员也是优秀的设计师
  8. java里pom.xml是啥意思_maven中pom.xml详细介绍
  9. java面试之String的理解(自我理解)
  10. matlab中的欧拉法,欧拉法函数
  11. windows最常用的快捷键(windows10 )
  12. 加密狗检测不到mysql_广联达检测不到加密锁
  13. 英伟达显卡老版本驱动下载网址
  14. 第二章 Python数据类型和运算符
  15. 用命令打开文件服务器资源管理器,Windows10使用命令参数打开文件资源管理器的方法...
  16. 聊聊微服务架构中的多级缓存设计
  17. dos下用move命令移动文件夹
  18. [文摘20080131]89个管理定律及点评
  19. 二代测序的原理和简介
  20. mysqldump导出表结构

热门文章

  1. 【UE4 第一人称射击游戏】12-全自动步枪并显示剩余弹药量
  2. 雨伞被拿错,你怎么办?!
  3. Java--Spring入门
  4. Github上Laravel开源排行榜Star数31-60名
  5. SQL语句基础-子查询
  6. SVN设置忽略文件列表
  7. 学习Python数据分析,需要几个阶段?
  8. 不小心删了(或覆盖了)window系统变量的PATH的怎么办?
  9. 学生用什么台灯对眼睛最好呢?一起来看看选哪些护眼灯吧
  10. 图形学/OpenGL/3D数学/Unity