Regular expression Denial of Service - ReDoS
Regular Expression Denial of Service - ReDoS
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:
Werkzeuge
Referenzen
Last updated