反序列化漏洞原理详解

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

Apache shiro 简介

Apache Shiro 是一个强大且易用的 Java 安全框架,执行身份验证、授权、密码和会话管理。使用 Shiro 的易于理解的 API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。

本文针对 Shiro 进行了一个原理性的讲解,从源码层面来分析了 Shiro 的认证和授权的整个流程,并在认证与授权的这个流程讲解冲,穿插说明 rememberme 的作用,以及为何该字段会导致反序列化漏洞。

Apache shiro 认证

在该小节中我们将会详细讲解 Shiro 是如何认证一个用户为合法用户的 Shiro 漏洞环境测试代码修改自 Vulhub 中的 CVE-2016-4437。首先是 Shiro 的配置文件,代码如下所示

@Configuration
public class ShiroConfig {
    @Bean
    MainRealm mainRealm() {
        return new MainRealm();
    }

    @Bean
    RememberMeManager cookieRememberMeManager() {
        return (RememberMeManager)new CookieRememberMeManager();
    }

    @Bean
    SecurityManager securityManager(MainRealm mainRealm, RememberMeManager cookieRememberMeManager) {
        DefaultWebSecurityManager manager = new DefaultWebSecurityManager();
        manager.setRealm((Realm)mainRealm);
        manager.setRememberMeManager(cookieRememberMeManager);
        return (SecurityManager)manager;
    }

    @Bean(name = {"shiroFilter"})
    ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
        ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
        bean.setSecurityManager(securityManager);
          //设置登录页面uri
        bean.setLoginUrl("/login");
          //设置登录失败页面uri
        bean.setUnauthorizedUrl("/unauth");

        Map<String, String> map = new LinkedHashMap<>();
        map.put("/doLogin", "anon");
        map.put("/doLogout", "authc");
        map.put("/user/add","perms[user:add]");
        map.put("/user/update","perms[user:update]");
        map.put("/user/delete","perms[user:delete]");
        map.put("/user/select","perms[user:select]");
        map.put("/**", "authc");

        bean.setFilterChainDefinitionMap(map);

        return bean;
    }
}

小伙伴们有兴趣想了解更多相关学习资料请点赞收藏+评论转发+关注我之后私信我,注意回复【000】即可获取更多免费资料!

 然后是 Controller 的代码

@Controller
public class UserController {
    @PostMapping({"/doLogin"})
    public String doLoginPage(@RequestParam("username") String username, @RequestParam("password") String password, @RequestParam(name = "rememberme", defaultValue = "") String rememberMe) {
        Subject subject = SecurityUtils.getSubject();
        try {
            subject.login(new UsernamePasswordToken(username, password, rememberMe.equals("remember-me")));
        } catch (AuthenticationException e) {
            return "forward:/login";
        }
        return "forward:/";
    }

    @RequestMapping({"/doLogout"})
    public String doLogout() {
        Subject subject = SecurityUtils.getSubject();
        subject.logout();
        return "forward:/login";
    }

    @RequestMapping({"/"})
    public String helloPage() {
        return "hello";
    }

    @RequestMapping({"/unauth"})
    public String errorPage() {
        return "error";
    }

    @RequestMapping({"/login"})
    public String loginPage() {
        return "loginUser";
    }

    @RequestMapping({"/user/add"})
    public String add(){
        return "/user/add";
    };

    @RequestMapping({"/user/delete"})
    public String delete(){
        return "/user/delete";
    };

    @RequestMapping({"/user/update"})
    public String update(){
        return "/user/update";
    };

    @RequestMapping({"/user/select"})
    public String select(){
        Subject subject = SecurityUtils.getS
反序列化(Unserialize)漏洞详解 序列化和反序列化漏洞分析   序列化(serialize) 就将对象的状态信息转换为可以存储或传输的形式的过程 在序列化期间,对象将当前的状态写入到临时或持久性的存储区 【将状态信息保存为字符串】。   反序列化(unserialize) 就是把序列化之后的字符串在转化为对象。 其实在序列化的过程中是没有任何的漏洞的,产生漏洞的主要的原因就是在反序列化的过程中,通过我们的恶意篡改会产生魔法函数绕过,字符逃逸,远程命令执行等漏洞,最早发现这些漏洞的大佬是真的牛。 一、简单的魔法函数 魔法函数 调用 阅读详情

相关推荐

反序列化漏洞详解

目录 一、什么是序列化和反序列化 二、什么是反序列化漏洞 三、序列化函数(serialize) 四、反序列化(unserialize) ​五、什么是PHP魔术方法 六、一些常见的魔术方法 七、魔术方法的利用 八、反序列化漏洞的利用 1.__destruct()函数 2.__wakeup() 3.toString() ​九、反序列化漏洞的防御 一、什么是序列化和反序列化 序列化是将对象转换为字符串以便存储传输的一种方式。而反序列化恰好就是序列化的逆过程,反序列化会将字符串.

LJH1999ZN的博客 3万+

安全常见漏洞篇——反序列化漏洞

要了解反序列化漏洞,首先我们得知道什么是序列化和反序列化,简单来说序列化:就是将对象转化为字符串进行存储;反序列化:就是将字符串转化为对象;反序列化漏洞:就是在反序列化过程中,如果恶意者可以对将要转换的字符串进行操控,从而达到任意代码执行的操作,就是反序列化漏洞反序列化漏洞的主要原理是应用程序在反序列化过程中没有对传入的数据进行足够的验证和过滤,导致攻击者可以利用构造的恶意序列化数据来执行任意代码或远程代码执行攻击。一般情况下,应用程序在接受到序列化数据后会使用反序列化操作将数据还原成对象。

ewii12567的博客 5098

Java反序列化漏洞利用:从原理到实战的回显技术详解

Java反序列化Java对象持久化和络传输的核心机制,其原理是将对象状态转换为字节流,以便存储或传输,并在需要时重建为内存中的对象。然而,当程序反序列化不可信数据时,攻击者可能构造恶意序列化数据,触发预设的代码执行逻辑,从而形成反序列化漏洞。这种漏洞的技术价值在于,它允许攻击者在目标服务器上远程执行任意命令,直接威胁应用安全。在渗透测试和安全研究中,漏洞利用的关键一步是获取命令执行的结果,即实现“回显”。回显技术通过寻找目标服务器运行时环境中的特定通道,将命令执行结果直接写入HTTP响应,从而无需依赖外

weixin_28518991的博客 532

反序列化漏洞原理、成因、危害、攻击、防、修复方法

首先,我们定义一个简单的Java类,该类具有可序列化的属性。// 标准的getter和setter方法 public String getUsername() {} }// 标准的getter和setter方法 public String getUsername() {} }// 标准的getter和setter方法。

白帽子凯哥聊黑客 1万+

全版本Shiro反序列化漏洞原理详解

本文为是作者耗时两个通宵写出的Shiro反序列化漏洞原理详解,主要涉及Shiro认证的一些基础概念以及为什么能够这样进行攻击。文章削弱了具体代码以及反序列化部分,主要强调很多新手宝宝看不懂(面试常考)的漏洞版本划分即利用区别等内容。因为反序列化部分其实是一个攻击大类,在利用中也只是把对应攻击链Poc进行加密,Shiro反序列化的根本我认为还是在如何能让服务器开始反序列化这一步,即伪造明文这一步。

smile_3779的博客 1025

Shiro反序列化漏洞原理详解及复现

生成CC链,再次按照上述方式发送,执行命令为反弹shell(CC6可打通),注意vulhub靶机本身没有nc,如果使用nc需要先上传。在登录时勾选Remember me,burp抓包可以看到,响应包的set-cookie字段存在rememberMe。删除JSESSIONID(当该字段存在时,不检测rememberMe),修改rememberMe为加密后的值发送。AES解密,shiro默认加密方式,存在padding oracle攻击及密钥泄露,是可以利用的核心。

Javachichi的博客 1166

shiro-550反序列化漏洞原理分析详解

shiro-550反序列化漏洞原理分析详解

CleanMe的博客 1761

源码层面详解Node.js反序列化漏洞原理与利用

NodeJS反序列化漏洞分析 该漏洞源于node-serialize库在反序列化过程中错误地将字符串数据当作可执行代码处理。当遇到以"$$ND_FUNC$$"开头的字符串时,库会直接通过eval()执行后续内容,导致任意代码执行风险。 漏洞成因: 序列化时仅简单地在函数字符串前添加标记前缀 反序列化时未做安全校验,直接eval处理标记后的内容 利用方式: 攻击者可构造恶意序列化数据,在前缀后植入任意JS代码,当服务端反序列化时就会执行这些代码。 防御建议: 避免使用存在安全问题的序列化库

Python1111111的博客 795

Shiro 反序列化漏洞原理(小白零基础详解

Apache Shiro反序列化漏洞(CVE-2016-4437)是Java Web安全领域的经典RCE漏洞。该漏洞源于Shiro框架的RememberMe功能存在两个致命缺陷:1)早期版本使用硬编码AES密钥(kPH+bIxk5D2deZiIxcaaaA==);2)反序列化时缺乏安全校验。攻击者可构造恶意序列化对象,利用默认密钥加密后通过Cookie提交,服务器解密后执行反序列化即可触发任意代码执行。该漏洞家族还包括多个补丁绕过变种(如Shiro-721),影响范围覆盖Shiro 1.7.1及以下版本。漏

yihan小白的博客 421

反序列化漏洞详解(第一期):从基础认知到原理拆解

Web安全领域,反序列化漏洞之所以被称为“高危漏洞之王”,核心原因在于其危害范围广、利用门槛相对较低,且隐蔽性极强——它不像SQL注入、XSS漏洞那样有明显的输入输出反馈,往往隐藏在程序的底层逻辑中,一旦被利用,可能直接导致远程代码执行(RCE)、服务器控制权被夺取,甚至引发内横向渗透、核心数据泄露等严重后果。无论是企业安全测试、渗透测试工程师岗位,还是CTF竞赛,反序列化漏洞都是高频考点与必测项。

logic1001的博客 418

反序列化漏洞详解原理、攻击链与防御,一篇文章彻底搞懂!

在编程中,序列化(Serialization)是将内存中的对象(Object)转换成字节流(如字符串、二进制数据)的过程,以便于存储(如存入文件、数据库)或传输(如络通信)。反序列化(Deserialization)则是将字节流还原回内存对象的过程。举个例子,在 Web 应用中,用户登录后,服务器可能会将用户对象序列化后存入 Session,下次请求时再反序列化恢复用户信息。又如,分布式系统之间通过 JSON、XML 或二进制格式传递数据,本质也是一种序列化/反序列化Java接口,PHP函数。

xx16755498979的博客 672

WebLogic反序列化漏洞CVE-2019-2729详解原理、利用与防御

本文深度剖析了WebLogic反序列化漏洞CVE-2019-2729,该漏洞是对CVE-2019-2725补丁的一次精妙绕过。文章详细阐述了其核心原理在于wls9-async组件对XML数据的不安全处理,并提供了漏洞环境搭建、利用链解析以及从络层、应用层到代码层的立体化纵深防御策略,帮助安全人员理解补丁绕过漏洞的本质并构建有效防

spice的博客 1004

PHP 反序列化漏洞详解原理、利用链、真实案例与防御方案

PHP 反序列化漏洞详解:通过将用户可控数据反序列化为PHP对象,触发魔术方法(如__wakeup、__destruct)执行危险操作。漏洞核心在于构造POP链,利用类中的文件删除、命令执行等功能。典型利用方式包括文件删除和RCE,防御措施包括禁用unserialize函数、限制允许类、禁用危险魔术方法等。审计时应关注用户输入反序列化、魔术方法实现和危险函数调用。

BEICHEN的博客 883
上一篇: 自学Java只需要学这些内容,15K的offer保准拿下
下一篇: Spring 源码(14)Spring Bean 的创建过程(6)对象的提前暴露
wadfdhsajd
博客等级 码龄4年 219粉丝 265原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值