怎样进行Apache Druid远程代码执行漏洞CVE-2021-25646分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。environment本文讲述下,在没有漏洞详情的情况下怎么去寻找漏洞点。Apache Druid includes the ability to execute user-provided JavaScript code embedded in various types of requests. This functionality is intended for use in high-trust environments, and is disabled by default. However, in Druid 0.20.0 and earlier, it is possible for an authenticated user to send a specially-crafted request that forces Druid to run user-provided JavaScript code for that request, regardless of server configuration. This can be leveraged to execute code on the target machine with the privileges of the Druid server process.通过cve的信息,可以推测出Druid在0.20版本以及之前版本存在可以通过javascript来执行代码由于javascript来执行命令,那就要找到js解析的引擎。通过查询文档发现Apache Druid内置了Rhino。Rhino是一个可以将嵌入在JavaScript中的Java代码解析并执行的解析器。该功能是为了能够动态的扩展Druid的功能,默认禁用的。可以看到通过enabled来控制是否开启,那我们只要找到哪些地方可以控制,就可以利用。这里挑选一个利用流程讲,拿javaScriptDimFilter.java
为例现在就剩下怎么去修改config配置来达到开启javascript的功能,通过查看官方补丁https://github.com/apache/druid/pull/10818core/src/main/java/org/apache/druid/guice/GuiceAnnotationIntrospector.java可以从补丁文件GuiceAnnotationIntrospector.java的注释中了解到,即使某个键值对的key是空的,jackson仍然会在特定情况下将其解析,并将key为空的值传给没有被@JsonProperty修饰的属性。注释中也给出了jackson issues的链接,里面阐述了这个问题。@JsonCreator用于在json反序列化时指明调用特定构造方法。@JsonProperty用于属性上,作用是把该属性的名称序列化为另外一个名称,比如@JsonProperty(“before”) String after,会将json里key为before的内容解析到after变量上。当注解@JsonCreator修饰方法时(@JsonCreator用于在json反序列化时指明调用特定构造方法)
,方法的所有参数都会被解析成CreatorProperty类型,如果属性没有被@JsonProperty修饰,就会创建一个name为””的CreatorProperty,Jackson会将用户输入的key为””的value赋值给该属性。基于这个问题,我们可以在符合上述条件的情况下,通过传入json格式的数据,覆盖特定值。在上面的代码中,config是没有被@JsonProperty修饰的,因此当用户传入key为空的键值对时,形如{“”:”ParseToConfig”},ParseToConfig会被解析到config变量上。 (ParseToConfig不是JavaScriptConfig类型,此处仅作为简单演示)因此此处可以在开发者预期外控制config变量,继续看看JavaScriptConfig类中做了哪些事。我们需要构造"": { "enabled": true }
去开启javascript enabled完整的数据包可以根据代码来生成或直接README中搜索,存在很多示例。在测试旧版本0.15.0的时候发现poc不通用,提示[spec.ioConfig.firehose] is required
,查看对应代码文件历史上做了3次修改,旧版firehose是必传,这里注意一点,firehose在0.15.0版本type
还没有inline
,用其他类型替代。0.20.0 POC修改POC,inputSource
改成firehose
,inputFormat
新版才有,为了兼容老版本去除。使用parser
去解析文件作为扫描器的POC要兼容新老版本,还要做到精准检测,单单的命令执行没有回显肯定不行(要考虑不出网的情况)回显思路1.获取全局的request,response,来修改当前CurrentThread的resposne内容2.报错回显3.写入文件,读取文件4.linux socket的文件描述符(Druid不能在windows安装)5. …..通过命令执行,把结果使用jackson的包把json格式的结果写入到/tmp下通过写文件,然后在利用druid的任意文件读取来获取命令结果但是这里有个坑,因为想要编写通用新旧版本POC,导致不能使用inline
,我这里采用了local
方式,但是读取的文件如果是格式错误的,导致异常退出,流程没有走到命令执行的地方。
这里就有了前置条件找到合法的解析文件让他不报错(新版可以直接只用inline
不报错,无影响)这种方式肯定不是我们想要的,继续看代码分析,后来找到了parse
下也可以执行function
函数, 然后刚好是在解析时候执行的命令,在异常前执行完毕命令。在看parseSpec文档的时候,发现function
可以直接修改回显内容,return
的内容为{key:value}
改进POC,直接页面输出命令结果升级到Apache Druid 0.20.1。加强访问控制,禁止未授权用户访问web管理页面。官方代码修复:重写了Jackson的findPropertyIgnorals方法在这个方法里,返回了JsonIgnoreProperties.Value.empty()。这意味着Jackson允许一个name为空的属性。而修复后的代码判断逻辑为:当属性被@JsonProperty修饰,则允许为空,如果属性没有被@JsonProperty修饰,则不允许为空。看完上述内容,你们掌握怎样进行Apache Druid远程代码免费云主机域名执行漏洞CVE-2021-25646分析的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注云编程开发博客行业资讯频道,感谢各位的阅读!
Extract()函数引起的变量覆盖漏洞该函数使用数组键名作为变量名,使用数组键值作为变量值。但是当变量中有同名的元素时,该函数默认将原有的值给覆盖掉。这就造成了变量覆盖漏洞。一、我们来查看一串代码:1、文件将get方法传输进来的值通过extrace()函数处…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。