Exploiting __VIEWSTATE without knowing the secrets
Bug bounty tip: sign up for Intigriti, a premium bug bounty platform created by hackers, for hackers! Join us at https://go.intigriti.com/hacktricks today, and start earning bounties up to $100,000!
What is ViewState
ViewState ASP.NET में वेब पृष्ठों के बीच पृष्ठ और नियंत्रण डेटा बनाए रखने के लिए डिफ़ॉल्ट तंत्र के रूप में कार्य करता है। एक पृष्ठ के HTML के रेंडरिंग के दौरान, पृष्ठ की वर्तमान स्थिति और पोस्टबैक के दौरान संरक्षित किए जाने वाले मानों को base64-encoded स्ट्रिंग्स में सीरियलाइज़ किया जाता है। ये स्ट्रिंग्स फिर छिपे हुए ViewState फ़ील्ड में रखी जाती हैं।
ViewState जानकारी को निम्नलिखित गुणों या उनके संयोजनों द्वारा वर्णित किया जा सकता है:
Base64:
यह प्रारूप तब उपयोग किया जाता है जब
EnableViewStateMac
औरViewStateEncryptionMode
गुण दोनों को false पर सेट किया गया हो।Base64 + MAC (Message Authentication Code) Enabled:
MAC को सक्रिय करने के लिए
EnableViewStateMac
गुण को true पर सेट किया जाता है। यह ViewState डेटा के लिए अखंडता सत्यापन प्रदान करता है।Base64 + Encrypted:
एन्क्रिप्शन तब लागू होता है जब
ViewStateEncryptionMode
गुण को true पर सेट किया जाता है, जिससे ViewState डेटा की गोपनीयता सुनिश्चित होती है।
Test Cases
छवि ASP.NET में ViewState के विभिन्न कॉन्फ़िगरेशन का एक तालिका है जो .NET फ्रेमवर्क संस्करण पर आधारित है। यहाँ सामग्री का सारांश है:
किसी भी संस्करण के लिए .NET, जब MAC और एन्क्रिप्शन दोनों अक्षम होते हैं, तो MachineKey की आवश्यकता नहीं होती है, और इसलिए इसे पहचानने के लिए कोई लागू विधि नहीं है।
4.5 से नीचे के संस्करणों के लिए, यदि MAC सक्षम है लेकिन एन्क्रिप्शन नहीं है, तो MachineKey की आवश्यकता होती है। MachineKey की पहचान करने की विधि को "Blacklist3r" कहा जाता है।
4.5 से नीचे के संस्करणों के लिए, चाहे MAC सक्षम हो या अक्षम, यदि एन्क्रिप्शन सक्षम है, तो MachineKey की आवश्यकता होती है। MachineKey की पहचान करना "Blacklist3r - Future Development" का कार्य है।
4.5 और उससे ऊपर के संस्करणों के लिए, MAC और एन्क्रिप्शन के सभी संयोजनों (चाहे दोनों सत्य हों, या एक सत्य हो और दूसरा असत्य) के लिए MachineKey की आवश्यकता होती है। MachineKey की पहचान "Blacklist3r" का उपयोग करके की जा सकती है।
Test Case: 1 – EnableViewStateMac=false and viewStateEncryptionMode=false
यह संभव है कि ViewStateMAC को पूरी तरह से अक्षम किया जाए, AspNetEnforceViewStateMac
रजिस्ट्री कुंजी को शून्य पर सेट करके:
ViewState विशेषताओं की पहचान करना
आप BurpSuite के साथ इस पैरामीटर को शामिल करने वाले अनुरोध को कैप्चर करके यह पहचानने की कोशिश कर सकते हैं कि क्या ViewState MAC से सुरक्षित है। यदि Mac का उपयोग पैरामीटर की सुरक्षा के लिए नहीं किया गया है, तो आप YSoSerial.Net का उपयोग करके इसका लाभ उठा सकते हैं।
Test case 1.5 – Like Test case 1 but the ViewState cookie isn't sent by the server
Developers can ViewState को HTTP Request का हिस्सा बनने से हटाएं (उपयोगकर्ता को यह कुकी प्राप्त नहीं होगी)। एक व्यक्ति यह मान सकता है कि यदि ViewState उपस्थित नहीं है, तो उनका कार्यान्वयन सुरक्षित है किसी भी संभावित कमजोरियों से जो ViewState deserialization के साथ उत्पन्न हो सकती हैं। हालांकि, ऐसा नहीं है। यदि हम ViewState parameter को अनुरोध शरीर में जोड़ते हैं और ysoserial का उपयोग करके बनाई गई अपनी सीरियलाइज्ड पेलोड भेजते हैं, तो हम अभी भी कोड निष्पादन प्राप्त करने में सक्षम होंगे जैसा कि Case 1 में दिखाया गया है।
Test Case: 2 – .Net < 4.5 and EnableViewStateMac=true & ViewStateEncryptionMode=false
विशिष्ट पृष्ठ के लिए ViewState MAC को सक्षम करने के लिए हमें एक विशिष्ट aspx फ़ाइल पर निम्नलिखित परिवर्तन करने की आवश्यकता है:
हम इसे web.config फ़ाइल में नीचे दिखाए अनुसार सेट करके कुल एप्लिकेशन के लिए भी कर सकते हैं:
चूंकि यह पैरामीटर MAC द्वारा सुरक्षित है, इस बार हमले को सफलतापूर्वक निष्पादित करने के लिए हमें पहले उपयोग किया गया कुंजी चाहिए।
आप उपयोग की गई कुंजी खोजने के लिए Blacklist3r(AspDotNetWrapper.exe) का प्रयास कर सकते हैं।
Badsecrets एक और उपकरण है जो ज्ञात machineKeys की पहचान कर सकता है। यह Python में लिखा गया है, इसलिए Blacklist3r के विपरीत, इसमें कोई Windows निर्भरता नहीं है। .NET viewstates के लिए, एक "python blacklist3r" उपयोगिता है, जो इसका उपयोग करने का सबसे तेज़ तरीका है।
इसे सीधे viewstate और generator के साथ प्रदान किया जा सकता है:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2Fuser-images.githubusercontent.com%2F24899338%2F227034640-662b6aad-f8b9-49e4-9a6b-62a5f6ae2d60.png&width=768&dpr=4&quality=100&sign=23cdf23f&sv=1)
या, यह सीधे लक्षित URL से कनेक्ट कर सकता है और HTML से viewstate को निकालने की कोशिश कर सकता है:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2Fuser-images.githubusercontent.com%2F24899338%2F227034654-e8ad9648-6c0e-47cb-a873-bf97623a0089.png&width=768&dpr=4&quality=100&sign=423fd6f6&sv=1)
कमजोर viewstates को बड़े पैमाने पर खोजने के लिए, उपडोमेन एन्यूमरेशन के साथ, badsecrets
BBOT मॉड्यूल का उपयोग किया जा सकता है:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2Fuser-images.githubusercontent.com%2F24899338%2F227028780-950d067a-4a01-481f-8e11-41fabed1943a.png&width=768&dpr=4&quality=100&sign=118463af&sv=1)
यदि आप भाग्यशाली हैं और कुंजी मिल जाती है, तो आप YSoSerial.Net: के साथ हमले को आगे बढ़ा सकते हैं।
In मामलों में जहाँ _VIEWSTATEGENERATOR
पैरामीटर सर्वर द्वारा नहीं भेजा गया है, आपको --generator
पैरामीटर प्रदान करने की आवश्यकता नहीं है बल्कि ये ones:
Test Case: 3 – .Net < 4.5 और EnableViewStateMac=true/false और ViewStateEncryptionMode=true
इसमें यह ज्ञात नहीं है कि क्या पैरामीटर MAC के साथ सुरक्षित है। तब, मान शायद एन्क्रिप्टेड है और आपको अपनी पेलोड को एन्क्रिप्ट करने के लिए मशीन की आवश्यकता होगी ताकि इस कमजोरियों का लाभ उठाया जा सके।
इस मामले में Blacklist3r मॉड्यूल विकासाधीन है...
.NET 4.5 से पहले, ASP.NET एक अनएन्क्रिप्टेड ___VIEWSTATE
_ पैरामीटर को उपयोगकर्ताओं से स्वीकृत कर सकता है यहां तक कि यदि ViewStateEncryptionMode
को हमेशा पर सेट किया गया है। ASP.NET केवल __VIEWSTATEENCRYPTED
पैरामीटर की उपस्थिति की जांच करता है। यदि कोई इस पैरामीटर को हटा देता है, और अनएन्क्रिप्टेड पेलोड भेजता है, तो इसे अभी भी संसाधित किया जाएगा।
इसलिए यदि हमलावर किसी अन्य कमजोरियों जैसे फ़ाइल ट्रैवर्सल के माध्यम से मशीन की प्राप्त करने का तरीका खोज लेते हैं, तो YSoSerial.Net कमांड का उपयोग केस 2 में किया गया, ViewState deserialization कमजोरियों का उपयोग करके RCE करने के लिए किया जा सकता है।
ViewState deserialization कमजोरियों का लाभ उठाने के लिए अनुरोध से
__VIEWSTATEENCRYPTED
पैरामीटर को हटा दें, अन्यथा यह एक Viewstate MAC सत्यापन त्रुटि लौटाएगा और हमला विफल हो जाएगा।
Test Case: 4 – .Net >= 4.5 और EnableViewStateMac=true/false और ViewStateEncryptionMode=true/false सिवाय दोनों गुणों के false होने के
हम नीचे दिए गए पैरामीटर को web.config फ़ाइल के अंदर निर्दिष्ट करके ASP.NET ढांचे के उपयोग को मजबूर कर सकते हैं जैसा कि नीचे दिखाया गया है।
वैकल्पिक रूप से, यह web.config
फ़ाइल के machineKey
पैरामीटर के अंदर नीचे दिए गए विकल्प को निर्दिष्ट करके किया जा सकता है।
जैसे कि पिछले में मान एन्क्रिप्टेड है। फिर, एक मान्य पेलोड भेजने के लिए हमलावर को कुंजी की आवश्यकता है।
आप कुंजी खोजने के लिए Blacklist3r(AspDotNetWrapper.exe) का उपयोग करने की कोशिश कर सकते हैं:
IISDirPath और TargetPagePath के लिए अधिक विस्तृत विवरण के लिए यहाँ देखें
या, Badsecrets (एक जनरेटर मान के साथ):
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2Fuser-images.githubusercontent.com%2F24899338%2F227043316-13f0488f-5326-46cc-9604-404b908ebd7b.png&width=768&dpr=4&quality=100&sign=af0ebfe0&sv=1)
एक मान्य मशीन कुंजी पहचानने के बाद, अगला कदम YSoSerial.Net का उपयोग करके एक अनुक्रमित पेलोड उत्पन्न करना है।
यदि आपके पास __VIEWSTATEGENERATOR
का मान है, तो आप उस मान के साथ --generator
पैरामीटर का उपयोग करने की कोशिश कर सकते हैं और --path
और --apppath
पैरामीटर को छोड़ सकते हैं।
ViewState deserialization भेद्यता का सफल शोषण एक हमलावर-नियंत्रित सर्वर पर एक आउट-ऑफ-बैंड अनुरोध की ओर ले जाएगा, जिसमें उपयोगकर्ता नाम शामिल होगा। इस प्रकार के शोषण को एक प्रमाणित अवधारणा (PoC) में प्रदर्शित किया गया है, जिसे "Exploiting ViewState Deserialization using Blacklist3r and YsoSerial.NET" शीर्षक वाले संसाधन के माध्यम से पाया जा सकता है। शोषण प्रक्रिया कैसे काम करती है और MachineKey की पहचान के लिए Blacklist3r जैसे उपकरणों का उपयोग कैसे करें, इसके बारे में अधिक जानकारी के लिए, आप प्रदान किए गए सफल शोषण का PoC की समीक्षा कर सकते हैं।
परीक्षण मामला 6 – ViewStateUserKeys का उपयोग किया जा रहा है
ViewStateUserKey प्रॉपर्टी का उपयोग CSRF हमले के खिलाफ रक्षा करने के लिए किया जा सकता है। यदि ऐसा एक कुंजी एप्लिकेशन में परिभाषित की गई है और हम अब तक चर्चा किए गए तरीकों से ViewState पेलोड उत्पन्न करने की कोशिश करते हैं, तो पेलोड को एप्लिकेशन द्वारा संसाधित नहीं किया जाएगा। आपको पेलोड को सही तरीके से बनाने के लिए एक और पैरामीटर का उपयोग करने की आवश्यकता है:
Result of a Successful Exploitation
सभी परीक्षण मामलों के लिए, यदि ViewState YSoSerial.Net पेलोड सफलता से काम करता है, तो सर्वर “500 Internal server error” के साथ प्रतिक्रिया करता है जिसमें प्रतिक्रिया सामग्री “इस पृष्ठ के लिए राज्य जानकारी अमान्य है और यह भ्रष्ट हो सकती है” होती है और हमें OOB अनुरोध मिलता है।
References
Bug bounty tip: साइन अप करें Intigriti के लिए, एक प्रीमियम बग बाउंटी प्लेटफॉर्म जो हैकर्स द्वारा, हैकर्स के लिए बनाया गया है! आज ही https://go.intigriti.com/hacktricks पर हमारे साथ जुड़ें, और $100,000 तक के बाउंटी कमाना शुरू करें!
Last updated