影响版本:

2.0.0-2.0.9

1.0.0-1.0.5

0x00 前言

这个漏洞与之前那个SpringBoot的SpEL表达式注入漏洞点基本一样,而且漏洞爆出来的时间点也差不多,可是没有找到那个漏洞的CVE编号,不知道是什么原因。

这个漏洞的触发点也是对用户传的参数的递归解析,从而导致SpEL注入,可是两者的补丁方式大不相同。Springboot的修复方法是创建一个NonRecursive类,使解析函数不进行递归。而SpringSecurityOauth的修复方法则是在前缀${前生成一个六位的字符串,只有六位字符串与之相同才会对其作为表达式进行解析。然而如果请求足够多,这种补丁也是会失效的。

0x01 调试分析

payload:
http://localhost:8080/oauth/authorize?response_type=token&client_id=acme&redirect_uri=${new%20java.lang.ProcessBuilder(new%20java.lang.String(new%20byte[]{99,97,108,99})).start()}

首先,这个漏洞是在错误页触发的,所以这里在错误页的控制器打个断点。可以看到,最后渲染视图的时候使用了SpelView,并传入一个模板字符串,跟springboot的洞类似。

然后跟到render方法,接收模板字符串之后,接着使用replacePlaceholders方法,对模板进行解析。

跟进一下replacePlaceholders方法

跟进parseStringValue方法,这个方法与springboot中的方法基本相同,简单看一下。

72行进行一次递归,用于解析模板中类似于${${}}的结构。由于这里的模板只是一个单纯的${errorSummary},故不跟进这里。

73行是将errorSummary作为参数传入SpEL模板解析引擎

可以看到,35行将errorSummary转换成了一个字符串,注意看这个值,其中包含我们的payload:${xxxx}。

return之后回到parseStringValue函数,将返回值赋值给propVal。

继续跟进,到87行,这里对propVal又进行了一次递归解析。而propVal的值中刚好包含我们的payload(即包含“${}”)

跟进递归,到66行成功将我们的payload从${}中提取出来,马上就到触发点了

跟进到73行,将payload传入resolvePlaceholder,继续跟进

成功在35行将payload作为SpEL表达式解析,弹出了计算器。

0x02 补丁分析

可以看到,这里在${前加了个

RandomValueStringGenerator().generate(),用于生成一个随机字符串。可是正如前面说的,如果可以发出足够多的请求,那么这个补丁依旧是可以被利用的。

0x03 参考

Spring Security OAuth RCE (CVE-2016-4977) 漏洞分析

SpringSecurityOauth RCE (CVE-2016-4977) 分析与复现的更多相关文章

  1. DLink 815路由器栈溢出漏洞分析与复现

    DLink 815路由器栈溢出漏洞分析与复现 qemu模拟环境搭建 固件下载地址 File DIR-815_FIRMWARE_1.01.ZIP - Firmware for D-link DIR-81 ...

  2. CVE 2021-44228 Log4j-2命令执行复现及分析

    12月11日:Apache Log4j2官方发布了2.15.0 版本,以修复CVE-2021-44228.虽然 2.15.0 版本解决了Message Lookups功能和JNDI 访问方式的问题,但 ...

  3. Windows RDP的RCE漏洞分析和复现(CVE-2019-0708)

    0x00 漏洞描述 Windows系列服务器于2019年5月15号,被爆出高危漏洞,该漏洞影响范围较广如:windows2003.windows2008.windows2008 R2.windows ...

  4. 2016年终分析(传统开发与网络时代的Java开发)

    2016重大事件:(在此将2016年的开发称为传统开发) 1.乌镇互联网大会大会(大数据&云计算) 2.某东struts2安全漏洞 3.作为一个程序呀对于淘宝双11和双12的分析应该是最好的案 ...

  5. SpringBoot SpEL表达式注入漏洞-分析与复现

    目录 0x00前言 0x01触发原因 0x02调试分析 0x03补丁分析 0x04参考文章 影响版本: 1.1.0-1.1.12 1.2.0-1.2.7 1.3.0 修复方案:升至1.3.1或以上版本 ...

  6. thinkphp5.0.22远程代码执行漏洞分析及复现

    虽然网上已经有几篇公开的漏洞分析文章,但都是针对5.1版本的,而且看起来都比较抽象:我没有深入分析5.1版本,但看了下网上分析5.1版本漏洞的文章,发现虽然POC都是一样的,但它们的漏洞触发原因是不同 ...

  7. Nexus Repository Manager 3(CVE-2019-7238) 远程代码执行漏洞分析和复现

    0x00 漏洞背景 Nexus Repository Manager 3是一款软件仓库,可以用来存储和分发Maven,NuGET等软件源仓库.其3.14.0及之前版本中,存在一处基于OrientDB自 ...

  8. [CVE-2017-5487] WordPress <=4.7.1 REST API 内容注入漏洞分析与复现

    记录下自己的复现思路 漏洞影响: 未授权获取发布过文章的其他用户的用户名.id 触发前提:wordpress配置REST API 影响版本:<= 4.7 0x01漏洞复现 复现环境: 1) Ap ...

  9. webmin RCE漏洞利用及分析

    Webmin是目前功能最强大的基于Web的Unix系统管理工具.管理员通过浏览器访问Webmin的各种管理功能并完成相应的管理动作. 利用条件:webmin <= 1.910 原因:官网 Sou ...

随机推荐

  1. Chatbot思考录

    人工分词产生不一致性的原因主要在于人们对词的颗粒度的认知问题.在汉语里,词是表达意最基本的意思,再小意思就变了.在机器翻译中会有一种颗粒度比另外一种颗粒度更好的情况,颗粒度大的翻译效果好. 为了解决词 ...

  2. 在Linux上安装Python3

    1. 安装依赖环境 # yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline- ...

  3. 【多线程】-ThreadPool线程池

    ThreadPool介绍: Thread类是一个静态类,所有不存在实例化构造函数操作,直接可以调用其内所存在的方法. 微软官网给出的解释: 提供一个线程池,该线程池可用于执行任务.发送工作项.处理异步 ...

  4. CUDA编程模型之内存管理

    CUDA编程模型假设系统是由一个主机和一个设备组成的,而且各自拥有独立的内存. 主机:CPU及其内存(主机内存),主机内存中的变量名以h_为前缀,主机代码按照ANSI C标准进行编写 设备:GPU及其 ...

  5. Nginx虚拟主机

    [root@Nginx-server ~]# tar zxvf nginx-1.11.2.tar.gz [root@Nginx-server ~]# useradd -M -s /sbin/nolog ...

  6. 微信小程序基于第三方websocket的服务器端部署

    微信小程序后台请求越来越严格 1.request要求用https 2.websocket要求用wss 3.测试后发现websocket只能走433端口 作为.net开发,websocket又是使用的第 ...

  7. 【手记】解决启动SQL Server Management Studio 17时报Cannot find one of more components...的问题

    刚装好SSMS 17.1准备体验,弹出: 一番搜索,普遍办法都是安装VS2015独立shell.删除某个注册表项什么的,没用,首先这个shell我是装了的,然后也没有那个注册表项.我自己尝试过重装sh ...

  8. How to untar a TAR file using Apache Commons

    import org.apache.commons.compress.archivers.tar.TarArchiveEntry; import org.apache.commons.compress ...

  9. spring-boot-starter-druid

    i have found from the document, and seems that spring-boot only support tomcat-jdbc,HikariCP and DBC ...

  10. checkbox事件的变化

    <input type="checkbox" checked={this.state.checked} onChange={this.checkedChangeHandler ...