2016-05-22 11 views
1

Wie kann ich ein Regex-DOS unter Verwendung der preg_match() Funktion mit einem bösen regulären Ausdruck auslösen (z. B. (a +) +)?Wie Regex Denial-of-Service in PHP auslösen?

Zum Beispiel habe ich die folgende Situation:

preg_match('/(a+)+/',$input); 

Wenn ich die Kontrolle über $input habe, wie kann ich löse eine DoS-Attacke oder erreicht die Grenze Zurückverfolgungs der preg_* Funktionen in php?

Wie könnte ich dies mit den folgenden Ausdrücken tun?

([a-zA-Z]+)* 
(a|aa)+ 
(a|a?)+ 
(.*a){x} | for x > 10 
+1

Wenn Sie die Beispiele direkt von OWASP kopiert haben, warum nicht den Rest dieser Seite lesen? Was ist der praktische Anwendungsfall für diese Frage? Warum nicht weniger dumme Regexps verwenden? – mario

+0

Povoke Sie sagten? 'ini_set ('pcre.backtrack_limit', 1);' Um das Standardlimit zu erreichen, benötigt man einen großen '$ Eingang', einen, der eine Grenze von 100000 Bytes überschreitet. Und trotzdem ist dies kein DoS-Angriff, da die Funktion einfach nichts zurückgibt und eine Benachrichtigung ausgelöst wird. – Xorifelse

+0

Ich tat dies, aber es hat nicht funktioniert @ Xorifelse – user126623

Antwort

3

Es gibt keine Möglichkeit REDOS auszulösen auf (a+)+, ([a-zA-Z]+)*, (a|aa)+, (a|a?)+, da gibt es nichts, das Spiel Scheitern und Auslöser Rückzieher nach dem problematischen Teil der Regex verursachen kann.

Wenn Sie die Regex etwas ändern, zum Beispiel adding b$ after each of the regex above, dann können Sie katastrophal Rückzieher auslösen mit einem Eingang wie aaa ... aabaa ... aa.

Abhängig von der Implementierung und Optimierung der Engine gibt es Fälle, in denen wir ein katastrophales Backtracking erwarten, aber der Motor zeigt kein Anzeichen für ein solches Verhalten.

Zum Beispiel gegeben (a+)+b und den Eingang aaa ... aac, PCRE fails the match outright, da sie eine Optimierung hat, dass das Spiel der richtigen vor dem Start für gewünschte Zeichen in der Eingabezeichenfolge überprüft.

Wissen, was der Motor tut, können wir throw off its early detection mit dem Eingang aaa ... aacb und bekommen den Motor zu katastrophalen Backtracking zeigen.

Was (.*a){x} ist es möglich, REDOS auszulösen, da es eine fehlerhafte Bedingung weniger als x Iterationen hat. Wenn die Eingabezeichenfolge aaa ... a (mit x oder mehr des Zeichens a) eingegeben wird, versucht die Regex alle Permutationen von a am Ende der Zeichenfolge, wenn sie vom Ende der Zeichenfolge zurückverfolgt. Daher ist die Komplexität der Regex O (2 x). Wenn wir das wissen, können wir sagen, dass der Effekt besser sichtbar ist, wenn x eine größere Nummer ist, let's say 20. Übrigens ist dies ein seltener Fall, bei dem eine übereinstimmende Zeichenfolge die Worst-Case-Komplexität aufweist.