Regular expression Denial of Service - ReDoS
Déni de service par expression régulière - ReDoS
Déni de service par expression régulière (ReDoS)
Un Déni de service par expression régulière (ReDoS) se produit lorsqu'une personne exploite les faiblesses de fonctionnement des expressions régulières (une méthode de recherche et de correspondance de motifs dans du texte). Parfois, lors de l'utilisation d'expressions régulières, elles peuvent devenir très lentes, surtout si le morceau de texte avec lequel elles travaillent devient plus grand. Cette lenteur peut devenir si importante qu'elle augmente très rapidement même avec de petites augmentations de la taille du texte. Les attaquants peuvent utiliser ce problème pour faire en sorte qu'un programme utilisant des expressions régulières cesse de fonctionner correctement pendant longtemps.
L'algorithme naïf de regex problématique
Consultez les détails sur https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS
Regex malveillantes
Un motif d'expression régulière malveillant est celui qui peut rester bloqué sur une entrée fabriquée provoquant un DoS. Les motifs de regex malveillants contiennent généralement des regroupements avec répétition et répétition ou alternance avec chevauchement à l'intérieur du groupe répété. Quelques exemples de motifs malveillants incluent :
(a+)+
([a-zA-Z]+)*
(a|aa)+
(a|a?)+
(.*a){x} pour x > 10
Tous ceux-ci sont vulnérables à l'entrée aaaaaaaaaaaaaaaaaaaaaaaa!
.
Charges utiles ReDoS
Exfiltration de chaîne via ReDoS
Dans un CTF (ou une prime de bug), peut-être que vous contrôlez l'expression régulière avec laquelle une information sensible (le drapeau) est mise en correspondance. Ensuite, il peut être utile de faire geler la page (délai d'attente ou temps de traitement plus long) si une Regex correspond et pas si elle ne le fait pas. De cette façon, vous pourrez exfiltrer la chaîne caractère par caractère :
Dans ce post vous pouvez trouver cette règle ReDoS :
^(?=<flag>)((.*)*)*salt$
Exemple :
^(?=HTB{sOmE_fl§N§)((.*)*)*salt$
Dans ce writeup vous pouvez trouver celle-ci :
<flag>(((((((.*)*)*)*)*)*)*)!
Dans ce writeup il a utilisé :
^(?=${flag_prefix}).*.*.*.*.*.*.*.*!!!!$
Contrôle de l'entrée et de l'expression régulière ReDoS
Les exemples suivants sont des exemples de ReDoS où vous contrôlez à la fois l'entrée et la regex :
Outils
Références
Last updated