PHP反序列化漏洞

聊一聊PHP反序列化漏洞

2016年11月4日
反序列化漏洞在各种语言中都较为常见,下面就简单聊一聊PHP的反序列化漏洞(PHP对象注入)。第一次了解这个洞还是在某次ctf上,就简单记录下个人理解以及对CVE-2016-7124的简单分析。

序列化与反序列化

php允许保存一个对象方便以后重用,这个过程被称为序列化,序列化一个对象将会保存对象的所有变量,但是不会保存对象的方法,只会保存类的名字。先看一眼具体什么样子

name . ‘\‘s phone is ‘ . $this->phone;
}
}
$usr = new info();
$usr->printdata();
echo serialize($usr);
?>
此时输出

church‘s phone is 111111
O:4:"info":2:{s:4:"name";s:6:"church";s:5:"phone";s:6:"111111";}
可以看到其中没有任何跟类有关的东西,只有其中的数据被数据化。

O:4:"info":2:{s:4:"name";s:6:"church";s:5:"phone";s:6:"111111";}
O:4:"info":2: 参数类型为对象(object),数组(array)为a。类名为info,有两个变量(参数
s:4:"name";s:6:"church"; s:变量类型为字符串(数字为i),长度为4,名为name,值是长度为6的字符串church
s:5:"phone";s:6:"111111"; 长度为5的字符串phone,值是长度为6的字符串111111
反序列化是将序列化后的字符串转换回一个数组对象。由于对象实例化和自动加载,反序列化可能会导致代码被加载并被执行。再看一下反序列化

printdata();
这时输出

church‘s phone is 111111
反序列化漏洞

现在我们了解了序列化是如何工作的,那我们该如何利用它?因为反序列化对象的值是可控的,如果反序列化对象中存在魔术方法,而且魔术方法中的代码又能够被我们控制,漏洞就产生了,根据不同的代码可以导致各种攻击,如代码注入、SQL注入、目录遍历等等。

影响:Joomla反序列化漏洞、SugarCRM v6.5.23 PHP对象注入漏洞、WordPress 3.6.1反序列化漏洞等。

魔术方法

php类可能会包含一些特殊的函数叫magic函数,magic函数命名是以符号”__“开头的,比如 __construct, __destruct, __toString, __sleep, __wakeup等。

而这些函数在某些情况下是自动调用的,比如:

__construct当一个对象创建时调用,相反__destruct当一个对象被销毁时调用

__sleep方法在一个对象被序列化时调用,__wakeup方法在一个对象被反序列化时调用

__toString当一个对象被当作一个字符串使用时调用

name;
}
public function __construct() {
echo ‘__construct‘;
}
public function __destruct() {
echo ‘__destruct‘;
}
public function __toString() {
return ‘__toString‘;
}
public function __sleep() {
echo ‘__sleep‘;
return array(‘name‘);
}

public function __wakeup() {
echo ‘__wakeup‘;
}
}
$usr = new info();
$usr->printdata();
echo $usr;
$serialized = serialize($usr);
echo $serialized;
$unserialized = unserialize($serialized);
$unserialized->printdata();
?>
这时会输出

__construct
church
__toString
__sleep
O:4:"info":1:{s:4:"name";s:6:"church";}
__wakeup
church
__destruct
__destruct
可以很清楚的看到这些魔术函数的自动调用,类似的魔术方法还有很多,这里不再一一列举。

漏洞利用

先看一个简单的demo:

file)) {
include($this->file);
}
}
}

$file = $_GET["file"];
if(isset($file)) {
echo unserialize($file);
}
?>
这个代码调用了Read类,并且有一个file值是我们可以控制的,所以构造类似这样的payload:

test.php?file=O:4:"Read":1:{s:4:"file";s:11:"/etc/passwd";}
这时仅需一个GET请求便能读取文件。

CVE-2016-7124

php前一段时间爆了一个漏洞(php bugs 72663 ),当反序列化一个对象时,假如属性发生了变化,就会导致__wakeup()中的return 0不会执行。简单来说就是当序列化字符串中表示对象属性个数的值大于真实的属性个数时就会跳过__wakeup()方法。

影响版本PHP5 < 5.6.25 、PHP7 < 7.0.10

写了个简单的demo:

正常情况下序列化后$serialized是这样的

O:4:"info":1:{s:4:"name";s:6:"church";}
执行之后,结果是这样的

__wakeup
__destruct
可以看到__wakeup()方法被调用了。

那把$serialized改成下面这个样子

O:4:"info":2:{s:4:"name";s:6:"church";}
再次执行之后,看结果

__destruct
由于表示对象属性个数的值大于真实的属性个数,很明显__wakeup()方法这次被跳过了。

漏洞实例分析:SugarCRM v6.5.23 PHP反序列化对象注入漏洞分析

时间: 2024-07-30 09:42:43

PHP反序列化漏洞的相关文章

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

2015年11月6日,FoxGlove Security安全团队的@breenmachine 发布的一篇博客[3]中介绍了如何利用Java反序列化漏洞,来攻击最新版的WebLogic.WebSphere.JBoss.Jenkins.OpenNMS这些大名鼎鼎的Java应用,实现远程代码执行. 然而事实上,博客作者并不是漏洞发现者.博客中提到,早在2015年的1月28号,Gabriel Lawrence (@gebl)和Chris Frohoff (@frohoff)在AppSecCali上给出了

(单例设计模式之一)饿汉式的反射与反序列化漏洞

1.闲话少说,直接上代码. import java.io.Serializable;//饿汉式public class Singleton01 implements Serializable{    //1.私有的属性    private static Singleton01 instance=new Singleton01();    //2.私有的构造器    private Singleton01(){}    //3.共有的get()方法    public static  Singl

Java反序列化漏洞分析

相关学习资料 http://www.freebuf.com/vuls/90840.html https://security.tencent.com/index.php/blog/msg/97 http://www.tuicool.com/articles/ZvMbIne http://www.freebuf.com/vuls/86566.html http://sec.chinabyte.com/435/13618435.shtml http://www.myhack58.com/Articl

php反序列化漏洞绕过魔术方法 __wakeup

0x01 前言 前天学校的ctf比赛,有一道题是关于php反序列化漏洞绕过wakeup,最后跟着大佬们学到了一波姿势.. 0x02 原理 序列化与反序列化简单介绍 序列化:把复杂的数据类型压缩到一个字符串中 数据类型可以是数组,字符串,对象等  函数 : serialize() 反序列化:恢复原先被序列化的变量 函数: unserialize() 1 <?php 2 $test1 = "hello world"; 3 $test2 = array("hello"

weblogic打补丁修复JAVA反序列化漏洞 &nbsp; &nbsp; &nbsp;

之前一篇文章记录部署web代理修复漏洞通过部署web代理来修复JAVA反序列化漏洞,这篇通过打补丁来修复这个漏洞.详见(Doc ID 2075927.1) 系统环境如下所示: OS:Oracle Linux Server release 6.1 64bit Weblogic:10.3.6 具体操作如下步骤所示: 1.备份备份备份 2.一切操作安装补丁README来 2.1 更新PSU 2.2 打补丁 1.备份 做好备份工作,无论是否可以回退,保证有备份 2.上传PSU weblogic补丁上传,

WebLogic反序列化漏洞导致getshell

本文主要是讲述在主机渗透中我们经常使用的一条路径(存活判断-端口扫描-端口删选(web端口)-针对性渗透(web渗透))进行渗透,其中主要涉及发现漏洞.利用漏洞.获取上传位置等过程中自己的一点经验技巧.简单来说,本文主要是对某主机进行渗透的全过程记录!如有不合理或错误的地方,烦请各位多多指教,谢谢! 1.1    主机存活判断 当我们得到一个主机IP时,我们首先对它进行存活判断,最简单的就是通过ping命令,但是如果主机是禁ping那么我们可能会判断失误,因此我们需要使用nmap来再次进行存活判

关于反序列化漏洞

0x00 关于序列化和反序列化 在了解反序列化漏洞之前需要先了解序列化和反序列化. 序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程. 把字节序列恢复为对象的过程称为对象的反序列化. 0x01 关于概述反序列化漏洞 由于把字节序列恢复为对象,并且没有限制恢复对象的类型.攻击者可以传入恶意的字节序列,通过反序列化,恢复成对象,并调用其它函数.如果调用命令执行的函数可能会导致命令执行.>_< 0x02 有深入研究后再继续写

小白审计JACKSON反序列化漏洞

1. JACKSON漏洞解析 poc代码:main.java import com.fasterxml.jackson.databind.ObjectMapper; import com.sun.org.apache.xerces.internal.impl.dv.util.Base64; import org.springframework.util.FileCopyUtils; import java.io.ByteArrayOutputStream; import java.io.File

Typecho 反序列化漏洞导致前台 getshell

前言 最早知道这个漏洞是在一个微信群里,说是install.php文件里面有个后门,看到别人给的截图一看就知道是个PHP反序列化漏洞,赶紧上服务器看了看自己的博客,发现自己也中招了,相关代码如下: 然后果断在文件第一行加上了die: <?php die('404 Not Found!'); ?> 今天下午刚好空闲下来,就赶紧拿出来代码看看. 漏洞分析 先从install.php开始跟,229-235行: <?php$config = unserialize(base64_decode(T