zoukankan      html  css  js  c++  java
  • Apache SkyWalking SQL注入漏洞复现分析 (CVE-2020-9483)

    转载自:https://anquan.baidu.com/article/1097

    1、前言

    Apache SkyWalking 是一款开源的应用性能监控系统,包括指标监控,分布式追踪,分布式系统性能诊断等。近日,百度云安全团队监测到国内某厂商发布了Apache SkyWalking SQL注入漏洞的风险通告,漏洞编号为CVE-2020-9483。当SkyWalking使用H2、MySQL或者TiDB作为存储方案时,攻击者可通过默认未授权的GraphQL接口构造恶意请求,从而获取敏感数据。本文主要由github上的漏洞补丁分析而来,若有不正确的地方还请及时指正。

    2、调试环境搭建

    漏洞影响6.0.0-6.6.0、7.0.0版本,根据github上项目文档,直接利用IDEA调试需要先进行编译。本文为了简单使用远程调试的方式,在官网下载编译好的6.5.0版本

    (https://www.apache.org/dyn/closer.cgi/skywalking/6.5.0/apache-skywalking-apm-6.5.0.tar.gz),

    编辑oapServ ice.sh加入如下调试命令并运行。

    1.png

    下载6.5.0源码

     (https://www.apache.org/dyn/closer.cgi/skywalking/6.5.0/apache-skywalking -apm-6.5.0-src.tgz)

    导入IDEA,添加Remote Configuration,并设置module classpath为oap-server。至此,远程调试环境搭建完成。

    2.png

    3、漏洞分析

    由于openwall上对该漏洞描述很简单,我们还是到github上寻找最近的issue。经过寻找我们发现了下面的pull request

    (https://github.com/apache/skywalking/pull/4639/commits /2b6aae3b733f9dbeae1d6eff4f1975c723e1e7d1),

    作者为wu-sheng和openwall上漏洞作者相印证,基本确定该处文件修改为漏洞成因。

    修改涉及getLinearIntValues、getMultipleLinearIntValues、getThermodynamic等多个方法但修复手法类似,本文以getLinearIntValues为例进行分析。

    3.png

    可以看到ids参数由原先的直接拼接sql改为利用”?”进行占位预编译,这是典型的SQL注入修复方法。我们向上搜索getLinearIntValues方法在哪里调用,

    找到了org/apache/skywalking/oap/server/core/query/MetricQueryService.java的getLinearIntValues方法。

    4.png

    继续向上追踪getLinearIntValues,在org/apache/skywalking/oap/query/graphql/resolver /MetricQuery.java有了发现,并且MetricQuery类实现了GraphQLQueryResolver接口。

    5.png

    查询文档可知,支持GraphQL的查询服务要实现GraphQLQueryResolver接口,该接口仅仅是一个声明接口,没有任何方法。同时,在schema配置文件metric.graphqls中,我们发现getLinearIntValues方法的查询配置。

    6.png

    对GraphQL语法不熟悉的师傅可以通过如下例子进行熟悉:

    7.png

    HeroNameAndFriends是操作名称,可用可不用,方便回溯查询记录。

    $episode声明一个变量,它的类型是Episode,默认值为JEDI。$withFriends同理。变量在后面通过JSON传递值。

    firsthero是别名。为了避免冲突,可以取别名。

    hero后面的(episode: $episode)表示参数,可以限定查询的条件,参数的值可以为常量。

    ...on Droid和...on Human在整个查询中,我们查询的主题是hero(主角),而根据Query定义,hero返回的值由getHero函数和传入参数episode决定,该函数返回一个对象,对象的type可能是Human或者Droid。这部分语法就是根据查询返回对象的不同类型而输出不同的结果。

    通过上述知识我们可以构造如下请求,通过Union注入获取当前用户。

    8.png

    通过Debug发现ids参数引入恶意语句直接拼接到SQL语句中。同样的,漏洞不仅仅只是存在getLinearIntValues方法,有多个方法可被利用,并且由于GraphQL接口默认是未授权的,漏洞危害较大建议用户及时修复。

    9.png

    4、安全产品解决方案

    百度安全智能一体化产品已支持CVE-2020-9483检测和拦截,有需要的用户可以访问anquan.baidu.com联系我们。

    参考链接:

    https://github.com/apache/skywalking/commit/4ce2e9e87398efcee4b646af1143f4dc2ae10dc7

    https://www.openwall.com/lists/oss-security/2020/06/15/1

  • 相关阅读:
    Typora Writings
    Xcode7.3 beta 新功能
    最美应用API接口分析
    'Project Name' was compiled with optimization
    web前端开发与iOS终端开发的异同[转]
    2015-12-19_16_30_15
    Xcode搭建Python编译环境
    jsPach.qq.com
    Q&AApple’s Craig Federighi talks open source Swift, Objective-C and the next 20 years of development
    .NET Core项目与传统vs项目的细微不同
  • 原文地址:https://www.cnblogs.com/kebibuluan/p/14103339.html
Copyright © 2011-2022 走看看