0x01 前言

Spring Security OAuth是为Spring框架提供安全认证支持的一个模块。在用户使用Whitelabel views来处理错误时,攻击者在被授权的情况下可以通过构造恶意参数来远程执行命令。

影响版本:Spring Security OAuth 2.0.0 到 2.0.9 和 1.0.0 到 1.0.5

描述:在使用 Spring Security OAuth 2.0.0 到 2.0.9 和 1.0.0 到 1.0.5 中的白标签视图处理授权请求时,response_type(不止这个参数可以) 参数值作为 Spring SpEL 执行,这使得恶意用户能够通过制作触发远程代码执行response_type 的值。

0x02 环境准备

利用vulhub提供的环境进行复现。

  • 首先进入vulhub对应目录执行docker-compose up -d启动镜像。

    TrnU6x.png

  • nmap扫描查看服务是否启动。输入:nmap -Pn -sS -sC -sV -T5 -n -p 1-65535 192.168.xx.xx

    TrMn1A.png

0x03 漏洞复现

  • 我们发现上述response_type参数后面的${233*233}被执行了。说明这里存在命令执行漏洞。其实redirect_uri参数也受此漏洞影响,如下图。

    TrQOG4.png

  • 既然知道漏洞点了,我们首先制作反弹shell,这里需要将反弹shell进行base64加密,因为

    有时命令执行有效载荷Runtime.getRuntime().exec()会失败。在 Base64 编码的帮助下可以帮助减少这些问题。点击此链接制作base64编码。

    TrlYyn.png

  • 制作完base64编码后我们可以将其作为参数,利用一个脚本生成java反弹shell的poc。首先我们来看看这个脚本。

    T6SzTI.png

    简单分析一下。

    ​ 我们首先分析一下java.lang.Runtime.getRuntime().exec()函数,我们在java中调用操作系统的程序时,可以使用T(java.lang.Runtime).getRuntime().exec()来实现。在exec()中,例如底层为linux系统,我们可以输入T(java.lang.Runtime).getRuntime().exec(‘id’)来查看当前用户的id。

    ​ 但是,在此漏洞情况下,在url中输入的时候,单引号和双引号等特殊字符会被url编码,这样是不符合命令格式,所以无法在exec中执行命令。这样的话我们可以利用一个函数:T(java.lang.Character).toString()来表示字符串(T表示java一个确定的java类型type)。这个函数的意思是将传入tostring的ascii码转换成字符串。例如:T(java.lang.Character).toString(97)就表示”a”。

    ​ 而且,我们可以使用concat函数来连接字符组成一个更长的字符串:T(java.lang.Character).toString(105).concat(T(java.lang.Character).toString(100))就表示字符串”id”。那么:${T(java.lang.Runtime).getRuntime().exec(T(java.lang.Character).toString(105).concat(T(java.lang.Character).toString(100)))}这行代码就可以在当前漏洞被执行。(由于无法回显系统输出,所以不在这里演示)

    ​ 由此可见,poc.py这个脚本就是为了将输入的shell等命令“翻译”成java可执行的代码,也就是类似上面那个加阴影红色代码。

  • 接下来,我们将base64编码后的bash的shell反弹命令作为入参,生成java代码如下。

    Trl5fe.png

  • 将生成的反弹码作为response_type或者redirect_uri的参数。

    Tr1SpQ.png

    这里是作为response_type的参数。

  • 最后在攻击机开启监听(nc -lvvp 4444)。浏览器点击发送,获得反弹shell。

    Tr1N1H.png

    复现结束。

    结语:参考链接中有对其原理的分析,需要的请查看。

0x04 参考链接