zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    HDU 1063 Exponentiation
    HDU 1261 字串数
    HDU 1715 大菲波数
    HDU 1002 A + B Problem II
    csharp 復制DataTable修改某列的值
    解决IE6下透明PNG图片有灰底的解决方案
    webform TextBox以一条横线显示 兼容各主流瀏覽器 .
    SQL 工齡計算
    csharp Format CultureInfo
    Csharp Winform TextBox 樣式以一條橫線顯示
  • 原文地址:https://www.cnblogs.com/starrys/p/14765864.html
Copyright © 2011-2022 走看看