CVE-2020-9483 Apache SkyWalking 存在的SQL注入漏洞复现
1. 环境
使用的工具
- VMWare中的Ubuntu虚拟机:20.04
- IDEA:2021.2.1
- Burp Suite Community Edition:2022.3.9
环境搭建
虚拟机中运行SkyWalking服务
漏洞影响的版本有6.0.0-6.6.0、7.0.0
此处选择6.5.0版本
首先在官网上下载压缩包:https://www.apache.org/dyn/closer.cgi/skywalking/6.5.0/apache-skywalking-apm-6.5.0.tar.gz,并解压到Ubuntu虚拟机中
运行SkyWalking需要java环境,所以需要安装JDK
sudo apt-get install openjdk-8-jdk
在/webapp/webapp.yml文件中修改服务端口,不修改也可,默认是8080
在/bin/oapService.sh文件中加入远程调试命令,其中需要注意的是address=5001是开放给远程调试的端口
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5001
执行startup.sh,开启SkyWalking服务
./bin/startup.sh
检查是否服务运行成功
查看5001端口是否处于监听状态
查看/logs/webapp.log中的日志打印信息,有服务启动成功的日志信息
浏览器中访问8081端口
IDEA中调试SkyWalking
下载源码
在github上下载6.5.0版本的源码:https://github.com/apache/skywalking/tree/v6.5.0
导入IDEA
使用IDEA打开,IDEA解析源码时间比较长,大概要四五十分钟
配置远程调试
添加Remote配置
- 设置module classpath为oap-server
- 指定IP地址为Ubuntu虚拟机的地址
- 指定端口号为5001,需要与SkyWalking开放的远程调试端口一致
点击调试,控制台输出如下信息,至此环境搭建成功
2. 原理
查询资料可以SQL注入的位置如下
在IDEA中直接全局搜索getLinearIntValues可直接定位
alt+F7快捷键查找所有调用getLinearIntValues方法的地方可以定位到MetricQueryService的getLinearIntValues方法
继续向上追溯,定位到MetricQuery的getLinearIntValues方法
再往上就没有调用了,而MetricQuery类实现了GraphQLQueryResolver接口,说明这是一个支持GraphQL的查询服务的类
至此,可以分析出想要执行getLinearIntValues方法是使用GraphQL语法查询H2数据库(H2数据库是纯Java编写的内置数据库),所以需要构造GraphQL请求
3. SQL注入
配置代理转发
想要构造GraphQL查询请求,需要使用Burp Suite拦截一下包,分析格式。
将浏览器的请求转发到8080端口
同时在Burp Suite设置监听8080端口
刷新SkyWalking,拦截到POST请求,且是GraphQL
IDEA调试
在执行SQL查询处下断点
构造正常的GraphQL请求如下
发送post请求,在断点处停下,分析可以输入的id:123被拼接到ids里面用于查询
进入executeQuery,可以查看SQL查询的语句
由此可以构造SQL注入语句
- 首先构造括号,使上一个select语句直接结束
- 然后用UNION联合查询,后面使用user()函数查询用户名
- 最后加上“–”,表示注释掉后面的内容
id: \"') UNION SELECT 1,CONCAT('-----', user(), '-----')--\"
执行的SQL查询语句
最终SQL注入成功,返回数据中带有用户名SA
参考网址
http://www.360doc.com/content/21/1112/17/67871819_1003878299.shtml
https://mp.weixin.qq.com/s/91MWSDYkom2Z8EVYSY37Qw
https://blog.csdn.net/caiqiiqi/article/details/107857173