实战经验丨PHP反序列化漏洞总结

admin 2022年1月13日03:21:01安全文章评论15 views3335字阅读11分7秒阅读模式
又到了金三银四跳槽季,很多小伙伴都开始为面试做准备,今天小编就给大家分享一个网安常见的面试问题:PHP反序列化漏洞
虽然PHP反序列化漏洞利用的条件比较苛刻,但是一旦被利用就会产生很严重的后果,所以很多公司都比较关注这个技能点,小伙伴们一定要掌握哦。

PHP序列化与反序列化介绍

什么是序列化与反序列化

维基百科中这样定义:序列化(serialization)在计算机科学的数据处理中,是指将数据结构或对象状态转换成可取用格式(例如存成文件,存于缓冲,或经由网络中发送),以留待后续在相同或另一台计算机环境中,能恢复原先状态的过程。 
概念很容易理解,其实就是将数据转化成一种可逆的数据结构,自然,逆向的过程就叫做反序列化。
那么序列化与反序列化有什么用处呢? 
举个例子:
比如:现在我们都会在淘宝上买桌子,桌子这种很不规则的东西,该怎么从一个城市运输到另一个城市,这时候一般都会把它拆掉成板子,再装到箱子里面,就可以快递寄出去了,这个过程就类似我们的序列化的过程(把数据转化为可以存储或者传输的形式)。当买家收到货后,就需要自己把这些板子组装成桌子的样子,这个过程就像反序列的过程(转化成当初的数据对象)。
也就是说,序列化的目的是方便数据的传输和存储。
在PHP应用中,序列化和反序列化一般用做缓存,比如session缓存,cookie等。  
常见的序列化格式:
  • 二进制格式

  • 字节数组

  • json字符串

  • xml字符串 

PHP序列化与反序列化

PHP通过string serialize ( mixed $value )mixed unserialize ( string $str )两个函数实现序列化和反序列化。
下面是比较典型的PHP反序列化漏洞中可能会用到的魔术方法:
void __wakeup ( void )
unserialize( )会检查是否存在一个_wakeup( ) 方法。如果存在,则会先调用_wakeup 方法,预先准备对象需要的资源。
void __construct ([ mixed $args [, $... ]])
具有构造函数的类会在每次创建新对象时先调用此方法。
void __destruct ( void )
析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。
public string __toString ( void )
__toString( ) 方法用于一个类被当成字符串时应怎样回应。例如 echo $obj;应该显示些什么。
此方法必须返回一个字符串,否则将发出一条 E_RECOVERABLE_ERROR 级别的致命错误。

PHP反序列化漏洞

漏洞成因

PHP反序列化漏洞又称PHP对象注入,是因为程序对输入数据处理不当导致的。
先看一个例子:

实战经验丨PHP反序列化漏洞总结

这个例子中,析构函数会回显$test的值,我们可以构造一个对象,控制$test的值,达到控制数据流的目的,实现反序列化漏洞的利用。
构造过程如下:

实战经验丨PHP反序列化漏洞总结

利用方式

一、__wakeup( )绕过

(CVE-2016-7124)
反序列化时,如果表示对象属性个数的值大于真实的属性个数时就会跳过__wakeup( )的执行。
影响版本:
  • PHP before 5.6.25

  • 7.x before 7.0.10

DEMO如下:

实战经验丨PHP反序列化漏洞总结实战经验丨PHP反序列化漏洞总结

二、注入对象构造方法

当目标对象被private、protected修饰时的构造方法。
示例代码:

实战经验丨PHP反序列化漏洞总结实战经验丨PHP反序列化漏洞总结

这个例子中,class B和class C有一个同名方法action,我们可以构造目标对象,使得析构函数调用class C的action方法,实现任意代码执行。
构造代码:

实战经验丨PHP反序列化漏洞总结

三、Session反序列化漏洞

PHP中的Session经序列化后存储,读取时再进行反序列化。
相关配置:
session.save_path=""        //设置session的存储路径
session.save_handler=""     //设定用户自定义存储函数,如果想使用PHP内置会话存储机制之外的可以使用本函数(数据库等方式) 
session.auto_start boolen   //指定会话模块是否在请求开始时启动一个会话默认为0不启动
session.serialize_handler string//定义用来序列化/反序列化的处理器名字。默认使用php

PHP中有三种序列化处理器,如下表所示:

实战经验丨PHP反序列化漏洞总结示例代码:

实战经验丨PHP反序列化漏洞总结

命名为sess_Session_id。
存储内容为序列化后的session:test|s:4:"test";
不同处理器的格式不同,当不同页面使用了不同的处理器时,由于处理的Session序列化格式不同,就可能产生反序列化漏洞。
下面演示漏洞利用:
实战经验丨PHP反序列化漏洞总结该页面中有类demo3,开启session,并用php处理器处理session。

实战经验丨PHP反序列化漏洞总结

通过session.php设置session,通过generate.php构造实例。
由于session.php与demo3.php采用的序列化处理器不同,我们可以构造“误导”处理器,达到漏洞利用的目的。
实例构造:

实战经验丨PHP反序列化漏洞总结

访问demo3.php成功创建了一个类demo3的实例。

四、PHAR利用

1、PHAR简介
PHAR (“Php ARchive”) 是PHP里类似于JAR的一种打包文件,在PHP 5.3 或更高版本中默认开启,这个特性使得 PHP也可以像 Java 一样方便地实现应用程序打包和组件化。一个应用程序可以打成一个 Phar 包,直接放到 PHP-FPM 中运行。
2、PHAR文件结构
PHAR文件由3或4个部分组成:  
(1)stub  //PHAR文件头
stub就是一个简单的php文件,最简文件头为:
<?php __HALT_COMPILER( );?>是可有可无的,若使用?>,则;与?>间至多一个空格。
文件头中必须包含__HALT_COMPILER();除此之外没有限制。(PHP通过stub识别一个文件为PHAR文件,可以利用这点绕过文件上传检测)
(2)manifest describing the contents  //PHAR文件描述该部分存储文件名、文件大小等信息,如下图所示。

实战经验丨PHP反序列化漏洞总结

图中标出的地方,存储了经serialize( )的Meta-data,有序列化过程必有反序列化过程,这就是我们的注入点。
(3)the file contents
PHAR文件内容
(4)[optional] a signature for verifying Phar integrity (phar file format only)  //可选的签名部分,支持MD5和SHA1

实战经验丨PHP反序列化漏洞总结

3、攻击方法
2018年Black Hat研究院Sam Thomas的议题:
It’s a PHP unserialization vulnerability Jim, but not as we know it提供了一种新的php反序列化攻击姿势。PHAR文件的Meta-data可以是任何能够序列化的PHP对象,当PHAR文件被任何文件系统函数首次通过phar://协议解析时Meta-data部分会被反序列化,这个反序列化过程就是我们的攻击点,Meta-data部分填充payload。
漏洞利用条件:  
在目标系统上投放一个装在payload的可访问的PHAR文件,通过文件系统函数利用phar://伪协议解析目标PHAR文件。
下面演示利用过程:
先创建一个PHAR文件。
注意:要将php.ini中的phar.readonly选项设置为Off,否则无法生成phar文件。
实战经验丨PHP反序列化漏洞总结箭头标出Meta-data部分,可以看到为序列化后结果。

实战经验丨PHP反序列化漏洞总结

输出了之前打包的phar文件中,test.txt文件内容,并成功实例化TestObject对象,调用了析构函数。
由于PHP仅通过stub部分判断文件是否为PHAR文件,我们可以通过添加文件头、修改后缀的方式绕过上传检测。
示例代码:

实战经验丨PHP反序列化漏洞总结


【历史文章】:

【入门教程】常见的Web漏洞--XSS

【入门教程】常见的Web漏洞--SQL注入

sql注入--入门到进阶

短信验证码安全常见逻辑漏洞

最全常见Web安全漏洞总结及推荐解决方案

常见的Web应用的漏洞总结(原理、危害、防御)

代码审计常见漏洞总结

Web安全漏洞的靶场演示

13 款 Linux 比较实用的工具

xss攻击、绕过最全总结


学习更多技术,关注我:

觉得文章不错给点个‘再看’吧实战经验丨PHP反序列化漏洞总结

原文始发于微信公众号(编码安全研究):实战经验丨PHP反序列化漏洞总结

特别标注: 本站(CN-SEC.COM)所有文章仅供技术研究,若将其信息做其他用途,由用户承担全部法律及连带责任,本站不承担任何法律及连带责任,请遵守中华人民共和国安全法.
  • 我的微信
  • 微信扫一扫
  • weinxin
  • 我的微信公众号
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年1月13日03:21:01
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                  实战经验丨PHP反序列化漏洞总结 http://cn-sec.com/archives/735123.html

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: