Skywalking SQL注入漏洞

Stella981
• 阅读 859

0x01 概要

Apache Skywalking最近暴露了一个SQL注入漏洞:CVE-2020-9483。

Skywalking SQL注入漏洞

Apache SkyWalking是一个APM管理软件(应用性能监控),用于跟跑分析线上系统的性能,支持TCP、HTTP协议。这次出问题的Skywalking的软件版本号是6.0-6.6、7.0,升级官网版本8.0后,SQL注入漏洞问题被修复。

出问题的是Apache SkyWalking的Graph QL协议接口。GraphQL是Facebook开源的数据查询规范。一用于API的查询语言,是对REST API的一种封装描述。原本REST API的JSON协议下的接口,如果代码实现不注重安发规范也会存在安全隐患,Apache SkyWalking Graph QL这次就出现SQL注入安全问题。SQL注入发生在Skywalking使用 H2/MySQL/TiDB 这三种数据库做存储的场景条件下,特定版本软件中可复现这个安全漏洞。

ElasticSearch 也支持SQL查询,是通过插件实现支持的,ES不属于关系型数据库,如果Skywalking用的存储方案用是ES,这个SQL注入的问题可能会弱化一些。

0x02 应急解决方案

腾讯漏洞报告给出的应急对应方案:

第一种方案:升级到官网网本的8.0版本。

第二种方案:对Skywalking外网暴露的接口进行安全授权。

第三种方案:最通用的方案,上WEB防火墙防护。

如果用户系统部署了WAF系统,可以用SQL注入的临时拦截策略进行处理,在请求没有到达Skywalking时,让WAF系统拦截过滤掉含有SQL注入请求。

0x03 开源解决方案

这篇重点是用开源方案解决问题,加入一层API网关,在Skywalking还没升级到8.0之前,将线上的老版本Skywalking的SQL注入的安全问题解决掉。将上面提到的第二、三方案,通过同一种软件系统实现落地,在Skywaling升级的过程中,也能保证本地对外网开放的Skywalking接口的安全性。

APISIX网关和Skywalking同属于Apache的项目,APISIX本身支持Skywalking,有对应支持的插件,并且同时支持URL的鉴权(第二种方案)、URI的黑名单过滤(WAF的功能之一,SQL注入拦截)。

Skywalking SQL注入漏洞

APISIX是开源的系统,在Nginx、OpenResty构建的应用网关产品,可以方便的实现上游管理,支持各种插件。APISIX的Skywalking插件与Skywalking配合,可以可视化的度量经过APISIX的请求,APISIX的同类开源网关产品,比如:Kong。

Skywalking SQL注入漏洞

Skywalking SQL注入漏洞

这是APISIX在Skywalking上的跟踪图。

最近出现CVE-2020-9483的问题,不升级Skywalking8.0的解决方案问题如下:

以前表过,不升级的方案:一种方案是对外网接口加鉴权认证,一种用防火墙拦截SQL注入。在APISIX当中,我们通过几个功能插件的添加,调整一下插件的执行顺序,就可不用升级Skywalking,解决这个安全问题。

**1.接口认证。
**

为了避免外网可以直接访问接口Skywalking的接口,我们将Skywalking的请求,先转给APISIX网关, 由APISIX网关对请求进行认证,然后将通过认证请求转发给Skywalking。

选用两个APISIX插件:

Key-auth:通过加Key进行权限管理。

Basic-auth:通过用户名密码对接进行加密权限管理。

2.SQL注入拦截。

一般的SQL注入,WAF系统会根据请求中存在的SQL子句特征进行拦截,APISIX同样有URI的过滤插件:

URI-Blocker:URI拦截黑名单。

0x04 拦截SQL注入

local core = require("apisix.core")

 

上面是基本的黑名单过滤逻辑:用户准备若干SQL识别正则,可以识别正常的URI中存在可疑 的SQL文子句,对于这种URI直接进行拦截,或者将请求转发给蜜罐系统,这是另一个插件来实现的(动态上游)。

简单举例说明, 如何写SQL注入拦截正则,如下:

1.“select.+(from|limit)”

2.“(?:(union(.*?)select))”

3.“having”

启用APISIX的URI-Blocker插件的方法,如下:

curl -ihttp://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY:edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '

APISIX支持API调用的插件打开方式,我们将SQL注入识别的正则,通过这种方式在APISIX网关中注册生效各种插件。如果在Skywalking升级到8.0以后,可以快速的通过这种方式关闭插件。

curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '

0x05 总结

如果您在Skywalking的使用过程中,或是某些开源软件的使用过程中,恰巧遇见类似的安全问题,想用一种低成本的方案解决CVE-2020-9483这种突发安全问题,可以考虑以上所说的开源解决方案,系统开源,即插即用。这次是Skywalking问题,以后也许会是其他软件,是需要一种敏捷的系统,速度的对应解决安全问题的。

参考连接:

https://mp.weixin.qq.com/s/tVJQa4so8nm0RYiWiKUYww

https://github.com/apache/incubator-apisix

https://shengyang.xyz/apisix/URI-blocker/

本文分享自微信公众号 - 糖果的实验室(mycandylab)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Easter79 Easter79
3年前
sql注入
反引号是个比较特别的字符,下面记录下怎么利用0x00SQL注入反引号可利用在分隔符及注释作用,不过使用范围只于表名、数据库名、字段名、起别名这些场景,下面具体说下1)表名payload:select\from\users\whereuser\_id1limit0,1;!(https://o
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
9个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这