基礎知識
1. 全文檢索:掃描文章中的每一個詞,給每一個詞建立一個索引指明該詞在文章中出現的位置和次數。當進行查詢操作時直接根據索引進行查找。
2. 倒排索引:索引表中的每一項都包括一個屬性值和具有該屬性值的各記錄的地址。由於不是由記錄來確定屬性值,而是由屬性值來確定記錄的位置,因而稱為倒排索引(inverted index)。
舉個栗子:文檔A和C里面都有一個詞B,我們查找B的時候,是先找到關鍵詞B,再根據B存儲的索引找到A和C;而不是先找到A,在A里面檢索B,再找到C,在C里面檢索B。
3. ElasticSearch:基於開源的全文檢索引擎Lucene,是一個實時分布式搜索和分析引擎,支持全文檢索,結構化檢索(就是咱們平時用的sql語句的形式)和數據分析等。
4. ES的一些核心概念:
- Index:索引,就是我們平時理解的數據庫(database)
- type:類型,就是表(table)
- document:文檔,es的最小數據單元。就是表中的一行數據(row)
- field:字段,就是列(column)
- mapping:映射,就是約束(schema)
漏洞原理
ElasticSearch 1.2版本之前支持動態腳本。漏洞是通過_search方法的參數傳入惡意代碼,遠程執行任意MVEL表達式和Java代碼。
復現環境
在ubuntu 16.04虛擬機中用vulhub靶場提供的docker容器來復現
jdk版本1.7
ElasticSearch版本1.1.1
影響版本
ElasticSearch 1.2之前的版本
復現過程
1. 啟動docker容器,先創建一條數據:

2. 按照vulhub給出的例子來傳參數:

3. 既然能執行任意代碼,應該也能讀取文件:

3. 執行操作系統命令(還可以同時執行多行惡意代碼:)

防御方法
1. 升級版本
2. 在elasticsearch.yml里配置script.disable_dynamic: true
本文僅用於技術學習和交流,嚴禁用於非法用途,否則產生的一切后果自行承擔。
如需轉載,請注明出處,這是對他人勞動成果的尊重。
