नमस्कार, हेब्र! आज मैं आपको बताऊंगा कि वाल्व ने भेद्यता के लिए अपने इनाम कार्यक्रम के इतिहास में सबसे बड़ा इनाम क्यों दिया। बिल्ली के लिए आपका स्वागत है!

1. एसक्यूएल इंजेक्शन
Partner.steampowered.com सेवा स्टीम भागीदारों से वित्तीय जानकारी प्राप्त करने के लिए डिज़ाइन की गई है। बिक्री रिपोर्ट पृष्ठ पर, एक ग्राफ बटन के साथ खींचा जाता है जो आँकड़ों को प्रदर्शित करने की अवधि को बदलते हैं। यहाँ वे हरे रंग की आयत में हैं:

आँकड़े डाउनलोड अनुरोध इस तरह दिखता है:
जहां "UA" देश कोड है।तो फिर, यह उद्धरण के लिए समय है!
आइए "UA" की कोशिश करें:

आँकड़े वापस नहीं आए, जिसकी उम्मीद की जा रही है।
अब "UA ''":

आँकड़े फिर से वापस आ गए हैं और यह एक इंजेक्शन की तरह लग रहा है!
क्यों?मान लीजिए कि डेटाबेस निर्देश इस तरह दिखता है:
SELECT * FROM countries WHERE country_code = `UA`;
यदि आप UA 'भेजते हैं, तो डेटाबेस निर्देश होगा:
SELECT * FROM countries WHERE country_code = `UA``;
एक अतिरिक्त उद्धरण नहीं देखा? और इसका मतलब है कि निर्देश अमान्य है।
SQL सिंटैक्स के अनुसार, नीचे दिया गया क्वेरी पूरी तरह से मान्य है (अतिरिक्त उद्धरण नहीं हैं):
SELECT * FROM countries WHERE country_code = `UA```;
कृपया ध्यान दें कि हम
देशफ़िल्टर [] की एक सरणी के साथ काम कर रहे हैं। मैंने मान लिया कि यदि हम क्वेरी में
देसीफिल्टर [] पैरामीटर को कई बार डुप्लिकेट करते हैं, तो हमारे द्वारा भेजे जाने वाले सभी मान इस तरह से SQL क्वेरी में जोड़ दिए जाएंगे:
'value1', 'value2', 'value3'
हम जाँच करते हैं और सुनिश्चित करते हैं:

वास्तव में, हमने डेटाबेस से तीन देशों के आंकड़े मांगे:
`UA`, `,` ,`RU`
वाक्यविन्यास सही है - आंकड़े वापस हैं :)
वेब अनुप्रयोग फ़ायरवॉल बायपासस्टीम सर्वर अकामाई WAF के पीछे छिपे हुए हैं। यह अपमान सम्मिलित करता है अच्छे (और ऐसा नहीं) हैकर्स के पहियों में चिपक जाता है। हालाँकि, मैं सरणी के मूल्यों को एक क्वेरी (जो मैंने ऊपर समझाया है) और टिप्पणी करके इसे दूर करने में सक्षम था। पहले, सुनिश्चित करें कि उत्तरार्द्ध उपलब्ध है:
?countryFilter[]=UA`/*&countryFilter[]=*/,`RU
अनुरोध मान्य है, इसलिए हमारे वर्गीकरण में टिप्पणियां हैं।
हमारे पास कई सिंटैक्स विकल्प थे, पेलोड के परीक्षण के लिए स्थानीय डेटाबेस, टिप्पणी वर्ण और सभी एन्कोडिंग के लिए अनंत संख्या में उद्धरण, साथ ही अजगर पर स्व-लिखित स्क्रिप्ट, सभी डेटाबेस के लिए प्रलेखन, फ़ायरवॉल, विकिपीडिया और एंटीकैस्ट को बायपास करने के निर्देश। ऐसा नहीं है कि यह इंजेक्शन संवर्धन के लिए एक आवश्यक रिजर्व था, लेकिन जब से यह डेटाबेस को तोड़ने के लिए शुरू हुआ, इसे रोकना मुश्किल है ...
WAF एक अनुरोध को अवरुद्ध करता है जब वह इसमें एक फ़ंक्शन का सामना करता है। क्या आप जानते हैं कि
DB_NAME / ** /
() एक वैध फ़ंक्शन कॉल है? फ़ायरवॉल भी जानता है और ब्लॉक करता है। लेकिन, इस सुविधा के लिए, हम फ़ंक्शन कॉल को दो मापदंडों में विभाजित कर सकते हैं!
?countryFilter[]=UA',DB_NAME(),'RU
हमने
DB_NAME / *
किसी भी तरह से अनुरोध भेजा * /
() - WAF को कुछ भी समझ नहीं आया, लेकिन डेटाबेस ने सफलतापूर्वक इस तरह के निर्देश को संसाधित किया।
डेटाबेस से मान प्राप्त करनातो, DB_NAME की लंबाई पाने का एक उदाहरण () मान:
https://partner.steampowered.com/report_xml.php?query=QuerySteamHistory&countryFilter[]=',(SELECTCASEWHEN(len(DB_NAME())=1)THEN'UA'ELSE'qwerty'END),'
SQL में:
SELECT CASE WHEN (len(DB_NAME())= 1) THEN 'UA' ELSE 'qwerty' END
अच्छी तरह से, मानवीय रूप से:
DB_NAME() "1", “UA”, “qwerty”.
इसका मतलब है कि यदि तुलना सही है, तो बदले में हमें देश के लिए "यूए" के आंकड़े मिलते हैं। यह अनुमान लगाना कठिन नहीं है कि 1 से अनंत तक मूल्यों पर जा रहे हैं, हम जल्द ही या बाद में सही पाएंगे।
उसी तरह, आप पाठ मूल्यों पर पुनरावृति कर सकते हैं:
DB_NAME() “a”, "UA", "qwerty".
आमतौर पर, "प्रतिस्थापन" फ़ंक्शन का उपयोग Nth वर्ण प्राप्त करने के लिए किया जाता है, लेकिन WAF ने इसे हठपूर्वक अवरुद्ध कर दिया। यहाँ संयोजन बचाव में आया:
right(left(system_user,N),1)
यह कैसे काम करता है? हमें system_user के मान के N अक्षर मिलते हैं जिसमें से हम अंतिम एक लेते हैं।
कल्पना कीजिए कि system_user = "भाप"। इस तरह से तीसरा किरदार मिलेगा:
left(system_user,3) = ste right(“ste”,1) = e
एक साधारण स्क्रिप्ट के साथ, यह प्रक्रिया स्वचालित थी और मुझे hostname, system_user, संस्करण और सभी डेटाबेस के नाम मिले। यह जानकारी पर्याप्त से अधिक है (उत्तरार्द्ध भी शानदार है, लेकिन महत्वपूर्णता प्रदर्शित करने के लिए) यह दिलचस्प था।
5 घंटे के बाद, भेद्यता तय हो गई थी, लेकिन 8 घंटे के बाद इस पर स्थिति को निर्धारित किया गया था और, इसे धिक्कार है, मेरे लिए यह 3 घंटे बहुत मुश्किल था, जिसके लिए मेरा मस्तिष्क इनकार से स्वीकृति तक के चरणों से बचने में कामयाब रहा।
व्यामोह की व्याख्याचूँकि भेद्यता को निर्दिष्ट नहीं किया गया था, मेरा मानना था कि लाइन अभी तक मेरी रिपोर्ट तक नहीं पहुँची है। लेकिन उन्होंने बग तय किया, जिसका अर्थ है कि वे मेरे सामने इसे पंजीकृत कर सकते थे।
2. किसी भी खेल के लिए सभी कुंजी प्राप्त करना
स्टीम पार्टनर इंटरफ़ेस में, गेम कीज़ बनाने के लिए एक कार्यक्षमता है।
आप अनुरोध का उपयोग करके कुंजी के उत्पन्न सेट को डाउनलोड कर सकते हैं:
https://partner.steamgames.com/partnercdkeys/assignkeys/ &sessionid=xxxxxxxxxxxxx&keyid=123456&sourceAccount=xxxxxxxxx&appid=xxxxxx&keycount=1&generateButton=Download
इस अनुरोध में,
कुंजी पैरामीटर पैरामीटर कुंजी सेट की आईडी है, और
कीकाउंट कुंजी की संख्या है जिसे इस सेट से प्राप्त किया जाना चाहिए।
बेशक, मेरे हाथ तुरंत अलग-अलग
कीड में ड्राइव करने के लिए पहुंच गए, लेकिन एक त्रुटि का मुझे इंतजार था: "
सीडी कुंजी उत्पन्न नहीं कर सका: उपयोगकर्ता के लिए कोई असाइनमेंट नहीं। "। यह पता चला कि सब कुछ इतना सरल नहीं था, और स्टीम ने जांच की कि क्या मैं चाबियों के अनुरोधित सेट का मालिक हूं। मुझे इस परीक्षण के आसपास कैसे मिला? ध्यान दें ...
keycount=0
गेम पोर्टल 2 के लिए 36,000 कुंजियों के साथ एक फ़ाइल तैयार की गई थी। वाह।
केवल एक सेट में इस संख्या की कुंजी थी। और पल में सभी सेट 430,000 से अधिक। इस प्रकार,
मुख्य मूल्यों के माध्यम से
छंटनी, मैं एक संभावित हमलावर था जो स्टीम गेम डेवलपर्स द्वारा कभी भी उत्पन्न सभी कुंजी डाउनलोड कर सकता था।
निष्कर्ष
- शीर्ष कंपनियों के महंगे WAF सिस्टम आपके वेब एप्लिकेशन की सुरक्षा की गारंटी देने से दूर हैं।
- यदि आप एक बग शिकारी हैं, तो जितना संभव हो उतना गहरा घुसना करने का प्रयास करें। जितने कम उपयोगकर्ताओं के पास किसी इंटरफ़ेस तक पहुंच होती है, उतनी ही उस इंटरफ़ेस में भेद्यता को खोजने की संभावना अधिक होती है।
- डेवलपर्स और व्यवसाय के मालिक, कोई बिल्कुल सुरक्षित अनुप्रयोग नहीं हैं! लेकिन तुम पकड़ो। अच्छा मूड है!
लेकिन गंभीरता सेपंचोपचार करें, कमजोरियों का भुगतान करें, रणनीतिक रूप से सोचें।