2008-08-01 11 views
44

में टी-एसक्यूएल सीएएसटी डीकोडिंग हाल ही में हमारी साइट को Asprox botnetSQL injection हमले के पुनरुत्थान के साथ हटा दिया गया है। विवरण में जाकर, हमला ASCII एन्कोडेड बिनरी स्ट्रिंग में T-SQL कमांड को एन्कोड करके SQL कोड निष्पादित करने का प्रयास करता है। यह इस तरह दिखता है:सी #/वीबीएनईटी

DECLARE%[email protected]%20NVARCHAR(4000);SET%[email protected]=CAST(0x44004500...06F007200%20AS%20NVARCHAR(4000));EXEC(@S);-- 

मैं एसक्यूएल में इस डिकोड करने में सक्षम था, लेकिन मैं के बाद से मैं यह कर नहीं पता था कि वास्तव में क्या समय हो रहा था, का एक छोटा सावधान था।

मैंने एक साधारण डिकोड उपकरण लिखने की कोशिश की, इसलिए मैं SQL Server को छूए बिना इस प्रकार के टेक्स्ट को डीकोड कर सकता था। मुख्य हिस्सा रहा डीकोड करने की जरूरत है:

CAST(0x44004500...06F007200 AS 
NVARCHAR(4000)) 

मैं कोई भाग्य के साथ निम्न कमांड के सभी की कोशिश की है:

txtDecodedText.Text = 
    System.Web.HttpUtility.UrlDecode(txtURLText.Text); 
txtDecodedText.Text = 
    Encoding.ASCII.GetString(Encoding.ASCII.GetBytes(txtURLText.Text)); 
txtDecodedText.Text = 
    Encoding.Unicode.GetString(Encoding.Unicode.GetBytes(txtURLText.Text)); 
txtDecodedText.Text = 
    Encoding.ASCII.GetString(Encoding.Unicode.GetBytes(txtURLText.Text)); 
txtDecodedText.Text = 
    Encoding.Unicode.GetString(Convert.FromBase64String(txtURLText.Text)); 

एसक्यूएल सर्वर का उपयोग किए बिना इस एन्कोडिंग अनुवाद करने के लिए उचित तरीका क्या है? क्या यह संभव है? मैं वीबीएनईटी कोड लेगा क्योंकि मैं उससे भी परिचित हूं।


ठीक है, मुझे यकीन है कि मुझे यहां कुछ याद आ रहा है, इसलिए यहां मैं कहां हूं।

चूंकि मेरे इनपुट एक बुनियादी स्ट्रिंग है, मैं इनकोडिंग भाग का सिर्फ एक टुकड़ा के साथ शुरू किया - 4445434C41 (जो decla करने के लिए अनुवाद) - और पहले ही प्रयास यह करने के लिए था ...

txtDecodedText.Text = Encoding.UTF8.GetString(Encoding.UTF8.GetBytes(txtURL.Text)); 

। ..और यह सब ठीक उसी चीज को वापस कर दिया गया था जिसे मैंने रखा था, क्योंकि यह प्रत्येक चरित्र को बाइट में बदल देता है।

मैंने महसूस किया कि मैं स्वयं एक बाइट में प्रत्येक दो अक्षर पार्स करने के लिए की जरूरत है के बाद से मैं किसी भी विधियों में से किसी को पता नहीं है अभी तक कि कि, इसलिए अब मेरी छोटी डिकोडर कुछ इस तरह दिखता करना होगा:

while (!boolIsDone) 
{ 
    bytURLChar = byte.Parse(txtURLText.Text.Substring(intParseIndex, 2)); 
    bytURL[intURLIndex] = bytURLChar; 
    intParseIndex += 2; 
    intURLIndex++; 

    if (txtURLText.Text.Length - intParseIndex < 2) 
    { 
     boolIsDone = true; 
    } 
} 

txtDecodedText.Text = Encoding.UTF8.GetString(bytURL); 

चीजें जोड़े के पहले जोड़े के लिए अच्छी लगती हैं, लेकिन फिर लूप बाक "4 सी" जोड़ी में जाती है और कहती है कि स्ट्रिंग गलत प्रारूप में है।

दिलचस्प बात यह है कि जब मैं डीबगर से गुजरता हूं और बाइट सरणी पर गेटस्ट्रिंग विधि पर जाता हूं, तो मैं उस बिंदु पर पार्स करने में सक्षम था, मुझे परिणाम के रूप में ", - +" मिलता है।

मैं यह कैसे समझ सकता हूं कि मुझे क्या याद आ रहा है - क्या मुझे इसे बार्स करने के बजाय प्रत्येक बाइट के लिए "सीधी कास्ट" करने की ज़रूरत है?

+0

मेरा उत्तर यहां देखें: [http://stackoverflow.com/questions/32412/whats-the-best-way-of-cleaning-up-after-a-sql-injection#32422 ](http:// stackoverflow.com/questions/32412/whats-the-best-way-of-cleaning-up-after-a-sql-injection#32422) – SQLMenace

+0

हाँ, मैं निश्चित रूप से एसक्यूएल पैरामीटर का उपयोग करके शुरू करूंगा, अगर आप पहले से नहीं हैं । – EndangeredMassa

+0

मैंने कुछ 'उत्तरों' को आज़माने और हल करने के लिए अपनी पूरी कोशिश की, हालांकि उनमें से अधिकतर उत्तर नहीं हैं। इसलिए, गैर-उत्तरों पर टिप्पणियों के लिए अन्य गैर-उत्तरों को परिवर्तित करना संभव नहीं था, इसलिए उन्हें टिप्पणियों में परिवर्तित कर दिया गया। अगर मुझे कुछ गलत मिला, तो कृपया मुझे बताएं। –

उत्तर

18

हज़ाह !!!!

मैं वापस माइकल के पद के लिए गया था, कुछ और poking किया था और एहसास हुआ कि मैं एक डबल रूपांतरण करने की ज़रूरत थी, और अंततः इस छोटे डला बाहर काम किया:

Convert.ToString(Convert.ToChar(Int32.Parse(EncodedString.Substring(intParseIndex, 2), System.Globalization.NumberStyles.HexNumber))); 

वहां से मैं बस के लिए एक पाश बना सभी पात्रों के माध्यम से 2 से 2 तक जाएं और उन्हें "हेक्सिफाइड" प्राप्त करें और फिर एक स्ट्रिंग में अनुवाद करें।

निक और किसी और को दिलचस्पी रखने के लिए, मैं posted my little applicationCodePlex में आगे बढ़ गया। आपको आवश्यकता के अनुसार उपयोग/संशोधित करने के लिए स्वतंत्र महसूस करें।

6

पहले 0x को हटाने का प्रयास करें और फिर Encoding.UTF8.GetString पर कॉल करें। मुझे लगता है कि काम कर सकता है।

मूलतः: 0x44004500

0x निकालें, और फिर हमेशा दो बाइट्स एक चरित्र हैं:

44 00 = D 

45 00 = E 

6F 00 = o 

72 00 = r 

तो यह निश्चित रूप से दो बाइट्स/चरित्र के साथ एक यूनिकोड/UTF प्रारूप है।