php序列化

字符串转数组(php版)

牧云@^-^@ 提交于 2019-12-02 02:15:38
思路: 1.判断当前传来的值是否为数组 2.若不是现将传来的值转换为字符串类型 3.判断当前值是否为空 4.若不为空,采用正则进行匹配,如下图 preg_match('/^{.*?}$/', $string) || preg_match('/^\[.*?]$/', $string) || preg_match('/^a:.*?(})$/', $string) 5.若正则无法匹配,则采用查找首次字符串出现的位置进行拆分分割 strpos($string, $delimiter) >= 1 具体代码示例如下 /** * 字符串、数组转换为格式化的数组 * @param string|array $data 原始字符串,可以为数组、 json字符串、 序列化字符串 * @param string $delimiter 字符串分隔符,默认为英文逗号 * @return array */ function cm_unserialize($data, string $delimiter = ','): array { // 数组原样返回 if (is_array($data)) { return $data; } // 字符串处理 $string = (string)$data; if (empty($string)) { $result = []; } else if (preg_match

[代码审计]php反序列化漏洞

为君一笑 提交于 2019-12-01 02:40:32
0x01 php面向对象简介 对象:可以对其做事情的一些东西。一个对象有状态、行为和标识三种属性。 类:一个共享相同结构和行为的对象的集合。 每个类的定义都以关键字class开头,后面跟着类的名字。 一个类可以包含有属于自己的变量,变量(称为“属性”)以及函数(“称为方法”)。 类定义了一件事物的抽象特点。通常来说,类定义了事物的属性和它可以做到的。 类可能会包含一些特殊的函数叫magic函数,magic函数命名是以符号“_”开头的,比如_construct,_destruct,_toString,_sleep,_wakeup等。 这些函数在某些情况下会自动调用,比如:_construct当一个对象创建时调用(constructor);_destruct当一个对象被销毁时调用(destructor);_toString当一个对象被当作一个字符串时使用。 0x02 php对象概念及特性 我们先创建一个简单的php对象: <?php class TestClass { //一个变量 public $variable = 'This is a string'; //一个简单的方法 public function PrintVariable() { echo $this->variable; } } //创建一个对象 $object = new TestClass(); //调用一个方法

浅谈PHP反序列化漏洞原理

梦想与她 提交于 2019-11-30 03:02:23
序列化与反序列化 序列化用途:方便于对象在网络中的传输和存储 0x01 php反序列化漏洞 在PHP应用中,序列化和反序列化一般用做缓存,比如session缓存,cookie等。 常见的序列化格式: 二进制格式 字节数组 json字符串 xml字符串 序列化就是将对象转换为流,利于储存和传输的格式 反序列化与序列化相反,将流转换为对象 例如:json序列化、XML序列化、二进制序列化、SOAP序列化 而php的序列化和反序列化基本都围绕着 serialize() , unserialize() 这两个函数 php对象中常见的魔术方法 __construct() // 当一个对象创建时被调用, __destruct() // 当一个对象销毁时被调用, __toString() // 当一个对象被当作一个字符串被调用。 __wakeup() // 使用unserialize()会检查是否存在__wakeup()方法,如果存在则会先调用,预先准备对象需要的资源 __sleep() // 使用serialize()会检查是否存在__wakeup()方法,如果存在则会先调用,预先准备对象需要的资源 __destruct() // 对象被销毁时触发 __call() // 在对象上下文中调用不可访问的方法时触发 __callStatic() // 在静态上下文中调用不可访问的方法时触发 _

php phar反序列化任意执行代码

丶灬走出姿态 提交于 2019-11-30 01:46:50
2018年 原理 一。关于流包装stream wrapper 大多数的文件操作允许使用各种URL协议去访问文件路径,如data://,zlib://,php:// 例如常见的有 include('php://filter/read=convert.base64-encode/resource=index.php') include('data://text/plain;base64,xxxxx') phar://也是流包装的一种 二。phar原理 ① phar是一种压缩文件,其中每个被压缩文件的权限、属性信息都放在这部分。并且这部分 以序列化的形式存储用于自定义的meta-data。 ② 对于phar文件的stub,可以理解为一个标志,他的格式是固定的 ……<?php ……; __HALT_COMPILER();?> 也就是必须要__HALT_COMPILER();结尾才可以,否则无法识别 ③ 如果要生成phar文件就必须要将php.ini中的phar.readonly设置为off ④ 在一些文件函数通过phar://伪协议解析phar文件时都会将meta-data反序列化。 受影响的函数有 fileatime filectime filemtime file_exists file_get_contents file_put_contents file filegroup

刷题记录:[LCTF]bestphp's revenge

扶醉桌前 提交于 2019-11-29 10:29:31
目录 刷题记录:[LCTF]bestphp's revenge 一、知识点 1、SoapClient触发反序列化导致ssrf 2、serialize_hander处理session方式不同导致session注入 3、crlf漏洞 二、解题思路 三、解题步骤 刷题记录:[LCTF]bestphp's revenge 题目复现链接: https://buuoj.cn/challenges 参考链接: https://xz.aliyun.com/t/3341#toc-22 从LCTF WEB签到题看PHP反序列化 LCTF2018-bestphp's revenge 详细题解 这是LCTF的web签到题??打扰了。现在一天一题已经有点跟不上了。。。。 一、知识点 这几个知识点环环相扣形成利用链,所以我一起讲了 session反序列化->soap(ssrf+crlf)->call_user_func激活soap类 1、SoapClient触发反序列化导致ssrf 2、serialize_hander处理session方式不同导致session注入 3、crlf漏洞 二、解题思路 首先,php反序列化没有可利用的类时,可以调用php原生类,参考 反序列化之PHP原生类的利用 , 贴上源码和poc讲 //index.php <?php highlight_file(__FILE__); $b

php反序列化漏洞复现过程

拈花ヽ惹草 提交于 2019-11-29 04:50:05
PHP反序列化漏洞复现 测试代码 我们运行以上代码文件,来证明函数被调用: 应为没有创建对象,所以构造函数__construct()不会被调用,但是__wakeup()跟__destruct()函数都被调用,如果这些函数里面包含的是恶意代码会怎么样呢? 利用场景 __wakeup() 或__destruct() 由前可以看到,unserialize()后会导致__wakeup() 或__destruct()的直接调用,中间无需其他过程。因此最理想的情况就是一些漏洞/危害代码在__wakeup() 或__destruct()中,从而当我们控制序列化字符串时可以去直接触发它们。这里针对 __wakeup() 场景做个实验。 基本的思路是,本地搭建好环境,通过 serialize() 得到我们要的序列化字符串,之后再传进去。通过源代码知,把对象中的test值赋为 “<?php phpinfo(); ?>”,再调用unserialize()时会通过__wakeup()把$test的写入到shell.php中。为此我们写个php脚本: 运行结果: 我们再来看shell1.php: 成功的利用反序列化漏洞来得到phpinfo()信息 不过具体的环境多是像下面代码这样,我们的test是我们可控的参数 我们传入参数test=O:7:"bmjoker":1:{s:4:"test";s:18:"<

windows下php配置redis

别说谁变了你拦得住时间么 提交于 2019-11-28 10:11:33
windows下php配置redis 需要注意的地方: 第一、下载的扩展一定要根据自己的环境匹配。 第二、如果都配置好了,也重启了apache,但是phpinfo()里面就是没有redis的扩展信息。 我这里用的是phpstudy环境,要打勾,可能是要系统自动去配置路径 然后重启下 ok redis扩展不需要安装 php_igbinary.dll,百度的文章有的会把这个也写进去,亲测没有php_igbinary.dll,redis也可以启动 php_igbinary : 在序列化和反序列化的效率上高于其自带的 同样根据版本下载:安装方法同上,下载压缩包把php_igbinary.dll文件拷贝到php的ext文件夹下,在php.ini中加上 extension=php_igbinary.dll,放在extension=php_redis.dll的前面 参考地址: https://blog.csdn.net/xudejun/article/details/92973842 https://www.cnblogs.com/godlei/p/6502174.html 来源: 51CTO 作者: 许琴 链接: https://blog.51cto.com/xuqin/2451483

PHP7 的新增性能

眉间皱痕 提交于 2019-11-28 00:45:24
1,标量类型声明 默认情况下,所有的PHP文件都处于弱类型校验模式。 PHP 7 增加了标量类型声明的特性,标量类型声明有两种模式: 强制模式 (默认) 严格模式 标量类型声明语法格式: declare(strict_types=1); 代码中通过指定 strict_types的值(1或者0),1表示严格类型校验模式,作用于函数调用和返回语句;0表示弱类型校验模式。 可以使用的类型参数有:int,float,bool,string,interfaces,array,callable 案例: <?php // 强制模式 function sum ( int ... $ints ) { return array_sum ( $ints ); } print( sum ( 2 , '3' , 4.1 )); 输出:9 <?php // 严格模式 declare( strict_types = 1 ); function sum ( int ... $ints ) { return array_sum ( $ints ); } print( sum ( 2 , '3' , 4.1 )); 会报错: Uncaught TypeError : Argument 2 passed to sum () must be of the type integer , string given ,

PHP序列化和反序列化

蓝咒 提交于 2019-11-26 17:05:43
PHP 序列化和反序列化: 1,序列化 (串行化):是将变量转换为可保存或传输的字符串的过程; 反序列化 (反串行化):就是在适当的时候把这个字符串再转化成原来的变量使用。 这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性。 常见的php系列化和反系列化方式主要有:serialize,unserialize;json_encode,json_decode 在进行类的序列化时 私有属性 会加 空白字符 类名 空白字符 ; 保护属性会加 *(注意空白字符不是空格,空格的16进制为 20,空白字符的16进制为00) O:4:"text":2:{s:10:"textfalg";s:4:"gggg";s:5:"*fg";s:4:"hhhh";} 2, file_put_contents (生成的文件名,字符串) 将一个字符串写入文件 和依次调用 fopen() , fwrite() 以及 fclose() 功能一样 3,gzcompress($data, level)此函数使用 ZLIB 数据格式压缩给定的字符串,这是 不 一样gzip压缩,它包括一些报头数据 data 要压缩的数据。 level 压缩程度。可以给出为0表示无压缩,最高压缩为9。 如果使用-1,则使用zlib库的默认压缩,即6。 4, 1. serialize和unserialize函数