4.9 Deserialization

php 方面反序列化参考:https://www.cnblogs.com/20175211lyz/p/11403397.html

简介

是什么?

序列化是指将对象转化为字节流或者字符串,方便存储或运输。序列化后的信息包含:对象的类型、对象属性类型、对象属性对应的值。而反序列化是序列化的逆操作。

不安全的反序列化是指用户可以控制要进行反序列化的数据。注入恶意对象、触发恶意操作。所以有时又称对象注入(object injection)。

攻击点在于:

  1. 修改反序列化对象的数据或数据类型,以更改程序逻辑。
  2. 如果存在魔术方法,则可以尝试利用魔术方法中的敏感操作。
序列化使用场景

在很多应用中,需要对某些对象进行序列化,让它们离开内存空间,入住物理硬盘,以便减轻内存压力或便于长期保存。

比如最常见的是Web服务器中的Session对象,当有 10万用户并发访问,就有可能出现10万个Session对象,内存可能吃不消,于是Web容器就会把一些seesion先序列化到硬盘中,等要用了,再把保存在硬盘中的对象还原到内存中。

例子: 淘宝每年都会有定时抢购的活动,很多用户会提前登录等待,长时间不进行操作,一致保存在内存中,而到达指定时刻,几十万用户并发访问,就可能会有几十万个session,内存可能吃不消。这时就需要进行对象的活化、钝化,让其在闲置的时候离开内存,将信息保存至硬盘,等要用的时候,就重新加载进内存。

摘自网络

如何攻击

通常是白盒审计,因为不知道代码细节的话,几乎无法攻击成功。

黑盒时如果发现对方使用某些框架,则可以尝试对搜素这些框架已有反序列化利用链。工具 phpggcysoserial

白盒审计思路:

  1. 识别哪些可控输入最终会被反序列化。

    某些是框架的调用链。

  2. 尝试进行利用。

    读懂程序逻辑,通过构建代码构造恶意 反序列化数据

    如果发现使用了已存在 调用链利用的框架、插件之类,则直接使用相应的利用工具。

防御

在进行反序列化之前,对数据进行过滤、检查。

不同语言特性 & 检测 & 利用

php

serialize()、 unserialize()

调用链payload 工具 phpggc

反序列化特性

结合语言特性,例如 php 种 phar:// ,其读取 phar 文件,phar 文件是一种打包格式,其文件种的 metadata 区域的数据以 序列化形式存储。当通过该协议进行读取文件时,这部分数据会自动执行反序列化。

php >= 7.2 反序列化的时候对访问类别不敏感,但如果不指定全部的属性,就会出错。

不同属性的类变量序列化后数据的格式不同。

  • public变量
    直接变量名反序列化出来
  • protected变量
    x00 + * + x00 + 变量名
    可以用S:5:"0*0op"来代替s:5:"?*?op"
  • private变量
    x00 + 类名 + x00 + 变量名
魔术方法

php 官方手册 - 魔术方法

魔术方法(magic method )是 php 类中一组特殊的方法,在特定情况下会被隐性调用。

跟序列化相关:

__sleep   __serialize     #在序列化之前调用
__wakeup  __unserialize   #在反序列化之前调用
# 当同时定义 __sleep __serialize 时,后者将生效, __wakeup 与  __unserialize 也一样

在反序列化漏洞挖掘中常见的可能用到的魔术方法:

__destruct  # 当反序列化创建的对象被销毁,则调用这个方法。
__toString  # 当对象被当作字符串时,会被调用
__invoke    # 当对象被当作函数时,会被调用
__call      # 当调用对象中不可访问的函数时,会被调用

__set       # 给不可访问属性赋值时, 会被调用。
__get   	# 读不可访问属性的值时, 会被调用。
__isset		# 对不可访问属性调用 isset() 或 empty() 时,会被调用。
__unset		# 对不可访问属性调用 unset() 时,会被调用。
漏洞

CVE-2016-7124 (php < 5.6.25 | < 7.0.10)可以绕过 反序列化过程中 __wakeup() 方法的执行。

其它

burp 的被动审计功能会自动标记出http 请求数据中的序列化数据,但如果数据被多重编码,则失效

image-20210506114208383

暂未研究的

等到后面碰到了再研究,感兴趣请查阅 https://book.hacktricks.xyz/pentesting-web/deserialization

java

https://github.com/GrrrDog/Java-Deserialization-Cheat-Sheet

java 序列化的数据通常是以特殊的头部作为起始,HEX aced ,Base64 rO0

python

https://zhuanlan.zhihu.com/p/89132768

ruby
nodejs
jms
.net

https://github.com/pwntester/ysoserial.net

原文地址:https://www.cnblogs.com/starrys/p/14765864.html