सी # / वीबी.नेट में टी-एसक्यूएल सीएएसटी डीकोडिंग

हाल ही में हमारी साइट Asprox botnet एसक्यूएल इंजेक्शन हमला। विवरण में जाकर, हमला टी-एसक्यूएल कमांड एन्कोड करके एसक्यूएल कोड निष्पादित करने का प्रयास करता है एक ASCII एन्कोडेड बिनरी स्ट्रिंग में। ऐसा कुछ ऐसा दिखता है:

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

मैं एसक्यूएल में इसे डीकोड करने में सक्षम था, लेकिन मैं ऐसा करने से थोड़ा सावधान था क्योंकि मुझे नहीं पता था कि उस समय क्या हो रहा था।

I tried to write a simple decode tool, so I could decode this type of text without even touching SQL Server. The main part I need decoded is:

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));

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


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

चूंकि मेरा इनपुट एक मूल स्ट्रिंग है, इसलिए मैंने एन्कोडेड हिस्से - 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
जोड़ा संपादित
विचारों: 1
हाँ, अगर आप पहले से नहीं हैं, तो मैं निश्चित रूप से एसक्यूएल पैरामीटर का उपयोग करके शुरू करूंगा।
जोड़ा लेखक EndangeredMassa, स्रोत
मैंने कुछ 'उत्तरों' को आज़माने और हल करने के लिए अपनी पूरी कोशिश की, हालांकि उनमें से अधिकतर उत्तर नहीं हैं। इसलिए, गैर-उत्तरों पर टिप्पणियों के लिए अन्य गैर-उत्तरों को परिवर्तित करना संभव नहीं था, इसलिए उन्हें टिप्पणियों में परिवर्तित कर दिया गया। अगर मुझे कुछ गलत मिला, तो कृपया मुझे बताएं।
जोड़ा लेखक Tim Post, स्रोत

2 उत्तर

Hazzah !!!!

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

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

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

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

0
जोड़ा

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

अनिवार्य रूप से: 0x44004500

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

44 00 = D

45 00 = E

6F 00 = o

72 00 = r

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

0
जोड़ा