这几天网上又报出来Dubbo的一个反序列化漏洞,一时间Dubbo又被推上了风口浪尖,对dubbo本身也褒贬不一. 漏洞报告地址如下,有兴趣的可以自己研究下: https://www.mail-archive.com/dev@dubbo.apache.org/msg06544.html 其实在2月份就有相似的漏洞报出来了 ,漏洞地址如下: https://www.mail-archive.com/dev@dubbo.apache.org/msg06225.html 我们抛开Dubbo不提,看看反序列化漏洞到底是什么样的? 序列化: 序列化是将Java对象转换成二进制字节,这些字节可以保存到磁盘上, 也可以通过网络传输,发送到其他服务上. 调用方法: ObjectOutputStream.writeObject(Object) 反序列化: 与序列化相反,是将二进制字节转换成Java对象 调用方法: ObjectInputStream.readObject
目录 反序列化漏洞 序列化和反序列化 JAVA WEB中的序列化和反序列化 对象序列化和反序列范例 JAVA中执行系统命令 重写readObject()方法 Apache Commons Collections 反序列化漏洞payload JAVA Web反序列化漏洞的挖掘和利用 由于本人并非JAVA程序员,所以对JAVA方面的知识不是很懂 本文参照几位大佬的博客进行归纳总结,给大家阐述了JAVA反序列化漏洞的原理以及Payload的构造,文章末尾会放出参考链接。 Part 1 反序列化漏洞 JAVA反序列化漏洞到底是如何产生的? 反序列化漏洞从无到有 Lib之过? Java反序列化漏洞通用利用分析 Java反序列化漏洞分析 Commons Collections Java反序列化漏洞深入分析
我们搞懂了什么是fastjson那我们理解一下序列化,反序列化又是什么意思呢 。 序列化:将对象转化成字节的过程 作用:因为对象统一存储在JVM中,所以就导致了如果JVM关闭,对象也就会消失。而序列化就可以将对象转换为字节的序列,可以写进硬盘文件中实现长期的保存。 反序列化:将字节转化成对象的过程 作用:将序列组成的字节,转换为对象。 对象序列化就是将对象的数据复制一个一模一样的对象(个人理解) 4. Fastjson漏洞产生原因 反序列化之后的数据本来是没有危害的,但是用户使用可控数据是有危害的 漏洞信息: fastjson 1.2.24 反序列化导致任意命令执行漏洞:fastjson在解析json Fastjson 1.2.47 远程命令执行漏洞:fastjson于1.2.24版本后增加了反序列化白名单,而在1.2.48以前的版本中,攻击者可以利用特殊构造的json字符串绕过白名单检测,成功执行任意命令
在说php反序列化漏洞之前,先讲讲什么是类,什么是对象,什么是函数 什么是类 类的概念:类是具有相同属性和操作的一组对象的集合。 (反)序列化函数 定义 序列化(serialization)在计算机科学的数据处理中,是指将数据结构或对象状态转换成可取用格式(例如存成文件,存于缓冲,或经由网络中发送),以留待后续在相同或另一台计算机环境中 ,序列化,反序列化一般用作缓存。 说了这么多,什么是反序列化漏洞呢? 当一个被序列化的对象,反序列化回去的时候,触发了魔术方法。而调用魔术函数时,传进去的值是用户可控的。 再说简单一点,就是服务器接收了攻击者上传的反序列化过的字符串,未经严格过滤,就把其中的变量作用到魔法函数里面,从而产生了预料之外的结果,造成的漏洞 演示 这里以wakeup()函数为例: mydx.php
echo 'serialize
'; return ['hack']; } function __unserialize($data) { // 反序列化时调用 ,session_start 函数会读取 Session 内容并反序列化<? phar:// 处理时会反序列化生成Payload<? __destruct绕过,前面抛出异常__destruct调用,结构错误,例:O:1:"c":1:{xxx}5.CTFprivate序列化有不可见字符,复制会出错,可以urlencode。 }要求俩值相等,$this->a = &$this->b,这样b改了a也会一起改看似反序列化的题结果静态函数不需要对象字符串逃逸,CTFshow-WEB入门-反序列化(https://www.cnblogs.com
序列化和反序列化的概念 序列化就是将一个对象转换成字符串。字符串包括 属性名 属性值 属性类型和该对象对应的类名。 反序列化则相反将字符串重新恢复成对象 对象的序列化利于对象的保存和传输,也可以让多个文件共享对象。 ctf很多题型也都是考察PHP反序列化的相关知识 PHP的序列化 序列化函数serialize() 首先我创一个Ctf类 里面写了三个属性 后创建了一个ctfer对象 将Ctf类里的信息进行了改变。 可以再__sleep()方法里可以决定哪些属性被序列化 如果没有__sleep()方法则默认序列化所有属性 上图__sleep()方法使flag age 属性序列化 name并没有被序列化 访问控制修饰符 该属性长度为6 s:9:"Ctfflag" //ctf前后也就是类名前后出现两个%00 所以长度为9 PHP的反序列化 反序列化函数unserialize() 反序列化就是将一个序列化的字符串,还原回去
漏洞成因 通过跟踪$PYTHON_HOME/lib/site-packages/yaml/constructor.py文件,查看PyYAML源码可以得到其针对Python语言特有的标签解析的处理函数对应列表 该函数会根据参数来动态创建新的Python类对象或通过引用module的类创建对象,从而可以执行任意命令~ 通用POC 经过上面的了解与验证,我们知道只要存在yaml.load()且参数可控,则可以利用yaml反序列化漏洞 漏洞修复 在PyYAML>=5.1版本中有两个补丁限制了反序列化内置类方法以及导入并使用不存在的反序列化代码: Path 1: ? Path 2: ? 简易测试 若要在ruamel.yaml中反序列化带参数的序列化类方法,我们有以下方法: load(data) load(data, Loader=Loader) load(data, Loader= 要序列化数据,可以使用下面的安全函数: ?
Apache Shiro 反序列化漏洞 shiro漏洞已经曝光很久了,一直没有整理思路与详细步骤,最近在学习java的反序列化,复现该漏洞来方便之后的学习 一、简介 Apache Shiro是一款开源企业常见 ,最终造成反序列化漏洞。 但是一些开源的项目内部集成了shiro的二次开发,可能会有低版本shiro的默认秘钥的风险,一些用户搭建环境时会使用网上的教程来快速搭建,直接复制了网上的秘钥,从而造成了秘钥的泄密,引发了反序列化漏洞。 cookie可控,从而引发反序列化漏洞。 print(e) if __name__ == '__main__': encode_rememberme(sys.argv[1]) 五、Shiro rememberMe反序列化漏洞
漏洞情况近期,火山信安实验室监测到在Roundcube Webmail 中 upload.php 文件的一个反序列化代码执行漏洞。该漏洞序号为CVE-2025-49113属于高危漏洞。 CVE-2025-49113 是 Roundcube Webmail 中 upload.php 文件的一个反序列化代码执行漏洞。 该漏洞源于对用户输入的 _from 参数未进行严格校验,导致攻击者可以通过构造恶意序列化数据触发反序列化操作,进而执行任意代码,从而可能完全控制受影响的 Roundcube 实例。 0x01漏洞利用方式攻击者通过构造恶意输入修改HTTP请求中的 _from 参数,插入恶意序列化数据。 当 Roundcube 处理该请求时,upload.php 会对 _from 参数进行反序列化操作,导致恶意代码被执行。攻击者可以利用反序列化漏洞执行系统命令、读取敏感文件或进行其他恶意操作。
本文作者:cream(贝塔安全实验室-核心成员) PHP序列化漏洞原理 1、序列化(串行化) 2、反序列化(反串行化) 3、序列化实例分析 4、反序列化实例分析 5、祸起萧墙---Magic函数 5.1 PHP反序列化漏洞CTF练习题 7、防御PHP序列化漏洞 1、序列化(串行化) 将变量转换为可保存或传输的字符串的过程; 2、反序列化(反串行化) 在适当的时候把这个字符串再转化成原来的变量使用。 常见的php系列化和反系列化方式主要有:serialize,unserialize;json_encode,json_decode。 6.2.2 漏洞介绍和复现 Typecho博客软件存在反序列化导致任意代码执行漏洞,恶意访问者可以利用该漏洞无限制执行代码,获取webshell,存在高安全风险。 出现一个比较明显的反序列化漏洞,首先获取到cookie中的__typecho_config值base64解码后,然后进行反序列化。
Yaml是什么 YAML是一种可读性高,用来表达数据序列化的格式。YAML是”YAML Ain’t a Markup Language”(YAML不是一种标记语言)的递归缩写。 ,就可以顺利导入该文件作为模块,执行当中的命令 首先写一个文件名为test.py的文件,内容如下 import os os.system('calc') 在触发漏洞的文件里 import yaml yaml.load python/object/new:test.aaaa {}' ) 如果写入的文件和触发漏洞的文件不在同一目录下 则需要加上目录,比如同级的uploads目录 yaml.load("!! 修复方法 1、按照官方推荐使用safe_load对于序列化内容进行加载。 2、检测加载文件头防止加载代码执行函数。 参考链接: PyYAML反序列化防御和ByPass | 柠檬菠萝 PyYAML反序列化漏洞 | DAMOXILAI 浅谈PyYAML反序列化漏洞 | Al1ex
序列化(serialize)和反序列化(unserialize) 序列化就是将对象转化为字节序列/字符串,便于之后的传递与使用,序列化会保存对象所有的变量。 __isset()对不可访问或者不存在属性调用isset()或者empty()是被调用 __unset()对不可访问或不存在的属性进行unset()时被调用 反序列化漏洞 条件 unserialize ()函数的参数可控 php中有可以利用的类并且类中有魔术方法 漏洞成因 当传给unserialize()的参数可控时,就可以注入精心构造的payload,在进行反序列化是就可能触发对象中的一些魔术方法, Web_php_unserialize 题目来源攻防世界 前置知识:在 PHP5 < 5.6.25, PHP7 < 7.0.10 的版本存在__wakeup()的漏洞。 正则表达式完整教程 利用__wakeup()漏洞绕过 然后绕过__wakeup(),修改类的属性个数大于真是属性个数即可。
简介 今儿复现一个陈年老漏洞,就说typecho的反序列化漏洞,可导致前台getshell,漏洞点在于文件夹下的install.php typecho是一个个人认为最清爽的一个cms,前端到后台一目了然 ,少了些繁杂的操作,安装过程也是一条龙,从安装到使用用不上5分钟,所以有需要建站的大佬们,可以尝试一下typecho 漏洞危害 可以直接getshell 漏洞复现 <? post data: __typechi_config= payload 如图所示↓ 输入完成后,直接发送请求,回到浏览器网页,如果发现变成了这样子↓ 则意味着复现成功,并且该网站存在这一个漏洞 修复建议 安装完typecho后,将install.php删除 升级版本 后言 我太菜了,不会代码审计,所以不做分析,如有需要,可以借鉴这篇文章《Typecho前台Getshell漏洞分析》 所有的漏洞复现文章在这里仅做学习测试使用
serialize:序列化
unserialize: 反序列化
简单解释:
serialize 把一个对象转成字符串形式, 可以用于保存
unserialize 把serialize序列化后的字符串变成一个对象
';
echo serialize($a);
上面例子是创建一个类, 并输出 filename的值 , 最后输出序列化字符串:
? 这里你可以看到, 我代码里的类定义为: class F, 这个序列化就是 F, 我定义变量名字是filename, 它这里也是 filename, 我们可以修改看看:
? 可以看到序列化后的变量名字变成 filenameF 了。
看下面代码:
<? 下面这个代码中的类跟上面代码的类一样, 不同的地方是我们修改了filename的值, 并生成序列化字符串:
<?
Java反序列化漏洞通用利用分析 转自:https://blog.chaitin.cn/2015-11-11_java_unserialize_rce/ 背景 2015年11月6日,FoxGlove Java反序列化漏洞简介 序列化就是把对象转换成字节流,便于保存在内存、文件、数据库中;反序列化即逆过程,由字节流还原成对象。 WebLogic、WebSphere、JBoss、Jenkins、OpenNMS这些应用的反序列化漏洞能够得以利用,就是依靠了Apache Commons Collections。 漏洞利用实例 利用过程概述 首先拿到一个Java应用,需要找到一个接受外部输入的序列化对象的接收点,即反序列化漏洞的触发点。 Jenkins Jenkins是一个非常流行的CI工具,在很多企业的内网中都部署了这个系统,这个系统常常和企业的代码相关联,这次也受到了Java反序列化漏洞的影响,非常危险。
主要函数 # 将对象序列化后返回 serialize() # 将字符串反序列化后返回 unserialize() 魔术方法 方法名 触发条件 __construct 创建对象 __destruct 销毁对象 __sleep 序列化对象 __wakeup 反序列化得到对象 __invoke 以函数的形式调用对象 __toString 以字符串的形式调用对象(改方法返回值为字符串) __call 在对象上下文中调用不可访问的方法 从不可访问的属性中读取数据 __set 将数据写入不可访问的数据 __isset 在不可访问的属性上调用isset()或empty()方法 __unset 在不可访问的属性上使用unset()方法 技巧 当序列化字符串中的属性个数大于原本属性个数时
0x001 漏洞产生原理 在反序列化的过程中自动触发了某些魔术方法。 以序列化对象格式为例 O:4:"info":2:{s:4:"name";i:2:"19";} 0x005 反序列化漏洞 1. XSS 漏洞示例demo2.php: <? 代码执行 漏洞示例test.php: <? 文件写入 漏洞示例demo3.php: <? 漏洞拓展 上面讲的都是基于魔术方法下的敏感操作导致的反序列化导致的安全问题。但是当漏洞/危险代码存在在类的普通成员方法中,该如何利用呢? 漏洞示例demo4.php: <?
NS1.NAMESERVER.COM/NS2.NAMESERVER.COM 这样payload.com的域名解析请求将由nameserver.com完成,同时将nameserver.com指向你的反连平台 1.1.1.1 搭建反连平台 https://github.com/Li4n0/revsuit/releases先运行一遍以便生成数据库和配置文件,修改config.yaml 在VPS 1.1.1.1
null) { System.out.println(s); } bufferedReader.close(); } } 四、PHP反序列化漏洞重现 靶场:pikachu // 漏洞源码 /* 核心: 以POST方式接收序列化对象o, 接收后并将o对象序列化后赋值给对象$unser,页面打印对象$unser的test属性 */ <? > # 序列化结构: O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";} 五、CTF-PHP反序列化漏洞利用 平台:https:// www.ctfhub.com/ 题目名称:AreUSerialz 思路: // 弱类型对比:== (存在漏洞:“2”==“ 2” 返回true) // 强类型对比:=== 1 git方式提交str 因为代码中并创建对象,所以未使用__construct()函数,只执行__destruct() 7 __destruct()函数中将$content变量中的值清空了,所以write方法无效 8 利用弱类型对比漏洞
2017 年 9 月 14 日,国家信息安全漏洞共享平台( CNVD )收录了 JBOSS Application Server 反序列化命令执行漏洞( CNVD-2017-33724,对应 CVE-2017 -12149 ),远程攻击者利用漏洞可在未经任何身份验证的服务器主机上执行任意代码。 漏洞细节和验证代码已公开,近期被不法分子利用出现大规模攻击尝试的可能性较大。 0x01. 漏洞复现 1). 漏洞利用 利用刚才下载好的 EXP 进行漏洞利用,打开 jboss 反序列化_CVE-2017-12149.jar ?