CVE-2021-45456 Apache Kylin 命令注入
# 环境搭建
ubuntu docker 8g
|
|
5005是远程调试端口
Kylin 页面:http://127.0.0.1:7070/kylin/login admin KYLIN HDFS NameNode 页面:http://127.0.0.1:50070 YARN ResourceManager 页面:http://127.0.0.1:8088
具体看官方的docker安装文档 https://kylin.apache.org/cn/docs/install/kylin_docker.html
远程调试配置,修改 /home/admin/apache-kylin-4.0.0-bin-spark2/bin/kylin.sh
在retrieveStartCommand函数修改
|
|
# 分析
在 org.apache.kylin.rest.controller.DiagnosisController#dumpProjectDiagnosisInfo
中
跟进dumpProjectDiagnosisInfo
这里getProject()通过ValidateUtil.convertStringToBeAlphanumericUnderscore(project)
处理,但是runDiagnosisCLI(args)
中接受的cmd参数仍然是通过project传过来的,相当于命令行可控。
而且getProject(ValidateUtil.convertStringToBeAlphanumericUnderscore(project))
将传入的命令进行如下处理。将除数字字母下划线以外的东西替换为空。比如传入命令为 touch 123
,将被替换为touch123
|
|
刚好解决projectInstance==null
抛出异常的问题。
|
|
最后执行的命令如下
再来看创建项目的地方
org.apache.kylin.rest.controller.ProjectController#saveProject
项目名进行ValidateUtil.isAlphanumericUnderscore()
校验,不能有数字字母下划线以外的东西。
完整的利用方式如下,以执行命令touch 123
为例
先创建项目,项目名为touch123
接下来触发命令执行
执行成功
# 修复方式
传入cmd的参数改为projectName而非http传入的project,projectName经过了convertStringToBeAlphanumericUnderscore() 处理,所以无法输入非字母数字下划线的字符来触发命令执行。
# 总结
巧妙利用两个函数对于参数处理的特性来进行命令执行,值得一学。
# 参考
文笔垃圾,措辞轻浮,内容浅显,操作生疏。不足之处欢迎大师傅们指点和纠正,感激不尽。
如果你觉得这篇文章对你有所帮助,欢迎赞赏或关注微信公众号~