【网络安全】远程命令执行漏洞分析
总结一下,传入payload为groovy执行命令语法,经过调用链,最终来到GroovyScriptEngine脚本引擎处scriptobject.run()执行命令。来到FlowExecutor.java的execute2Future,一直往下跟execute的函数,看左下角调用链,先是417行->372行->446行->512行。来到debugFlow方法,前面的代码是定义内容,序列化内容,不
漏洞描述
需任意用户权限
漏洞分析
请求路由地址/jeecgboot/airag/flow/debug,来到此处,就调用了debugFlow,那就往下跟。一直跟到看到命令执行的地方

来到debugFlow方法,前面的代码是定义内容,序列化内容,不重要,看到调用两个a,往下跟

跟链后发现,第一个a没有代码执行的地方,在第二个a中,在同class下284行的execute2Future

来到FlowExecutor.java的execute2Future,一直往下跟execute的函数,看左下角调用链,先是417行->372行->446行->512行

来到Chain.java -> Execute方法,继续往下

Condition -> execute()

ThenCondition.java -> executeCondition()

Node.java -> execute()

DefaultNodeExecutor.java -> execute()

NodeExecutor.java

NodeComponent.java -> execute()

跟进实现

继续跟进excute(wrap)

继续跟进ScriptExecutor.java -> execute()中的executeScript(wrap)

会循环到JSR223ScriptExecutor.java -> executeScript

跟进eval来到CompiledScript.java -> eval,

继续跟进93行的eval

这时候我们不知道会走哪里,断点来到这里时,点 “step into”步入,就能看到左下角的调用链走GroovyCompiledScript

继续跟eval(ctxt)


这里存在4处调用,根据payload的结构和语法:使用groovy就走GroovyCompiledScript

继续跟engine.eval()可以看到这是Groovy脚本引擎,。

Groovy脚本引擎相关知识需课外补充。来看个测试样例,调用engine.eval(payload)就能执行命令

到这就不用跟了,317行scriptobject.run()就是执行命令的地方。
总结一下,传入payload为groovy执行命令语法,经过调用链,最终来到GroovyScriptEngine脚本引擎处scriptobject.run()执行命令。


原payload执行命令部分是\"code\":\"def main(params) {\n new ProcessBuilder(\\\"calc\\\").start()\n return [\n result: \\\"${params.arg1}拼接${params.arg2}\\\"\\n ]\\n}\"。根据GroovyScriptEngine语法,直接传入\"code\":\"new ProcessBuilder(\\\"calc\\\").start()\"也可以执行命令。

完整调用链
eval:317, GroovyScriptEngineImpl (org.codehaus.groovy.jsr223)
eval:71, GroovyCompiledScript (org.codehaus.groovy.jsr223)
eval:93, CompiledScript (javax.script)
executeScript:84, JSR223ScriptExecutor (com.yomahub.liteflow.script.jsr223)
execute:48, ScriptExecutor (com.yomahub.liteflow.script)
process:25, ScriptCommonComponent (com.yomahub.liteflow.core)
execute:116, NodeComponent (com.yomahub.liteflow.core)
execute:34, NodeExecutor (com.yomahub.liteflow.flow.executor)
execute:15, DefaultNodeExecutor (com.yomahub.liteflow.flow.executor)
execute:206, Node (com.yomahub.liteflow.flow.element)
executeCondition:44, ThenCondition (com.yomahub.liteflow.flow.element.condition)
execute:58, Condition (com.yomahub.liteflow.flow.element)
execute:147, Chain (com.yomahub.liteflow.flow.element)
doExecute:512, FlowExecutor (com.yomahub.liteflow.core)
execute2Resp:446, FlowExecutor (com.yomahub.liteflow.core)
execute2Resp:372, FlowExecutor (com.yomahub.liteflow.core)
lambda$execute2Future$1:417, FlowExecutor (com.yomahub.liteflow.core)
call:-1, FlowExecutor$$Lambda$2633/0x0000029eb776d0b8 (com.yomahub.liteflow.core)
call:65, TtlCallable (com.alibaba.ttl)
run$$$capture:264, FutureTask (java.util.concurrent)
run:-1, FutureTask (java.util.concurrent)
- Async stack trace
<init>:132, FutureTask (java.util.concurrent)
newTaskFor:113, AbstractExecutorService (java.util.concurrent)
submit:144, AbstractExecutorService (java.util.concurrent)
submit:60, ExecutorServiceTtlWrapper (com.alibaba.ttl.threadpool)
execute2Future:417, FlowExecutor (com.yomahub.liteflow.core)
a:352, b (org.jeecg.modules.airag.flow.service.a)
debugFlow:170, b (org.jeecg.modules.airag.flow.service.a)
invoke0:-2, NativeMethodAccessorImpl (jdk.internal.reflect)
invoke:77, NativeMethodAccessorImpl (jdk.internal.reflect)
invoke:43, DelegatingMethodAccessorImpl (jdk.internal.reflect)
invoke:568, Method (java.lang.reflect)
invokeJoinpointUsingReflection:360, AopUtils (org.springframework.aop.support)
intercept:724, CglibAopProxy$DynamicAdvisedInterceptor (org.springframework.aop.framework)
debugFlow:-1, b$$SpringCGLIB$$0 (org.jeecg.modules.airag.flow.service.a)
a:238, a (org.jeecg.modules.airag.flow.c)
web界面流程
AI大模型--AI流程设计--添加流程。

添加完后点调试即可执行

经测试其他3种语法执行不了命令

漏洞修复
未修复前任意用户都能调用执行

3.9.1修复后增加了鉴权,只有管理员才能调用执行。

更多推荐
所有评论(0)