C # / VB.NET এ T-SQL CAST ডিকোডিং

সম্প্রতি আমাদের সাইটটি এপ্রেক্স বোটনেট এসকিউএল ইনজেকশন আক্রমণ। বিবরণে যাওয়া ছাড়া, এসএলকিউএল কোড এক্সিকিউট করে টি এসকিউএল কমান্ডগুলি এনকোড করার চেষ্টা করে একটি 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));

এসকিউএল সার্ভার ব্যবহার না করে এই এনকোডিং অনুবাদ সঠিক উপায় কি? এটা কি সম্ভব? আমি VB.NET কোড গ্রহণ করব যেহেতু আমি খুব পরিচিত।


ঠিক আছে, আমি নিশ্চিত যে আমি এখানে কিছু অনুপস্থিত, তাই এখানে যেখানে আমি এ করছি।

যেহেতু আমার ইনপুট একটি মৌলিক স্ট্রিং, তাই আমি এনকোডেড অংশের একটি স্নিপেট দিয়ে শুরু করেছি - 4445434C41 (যা ডিসিএলএতে অনুবাদ করে) - এবং এটির প্রথম প্রচেষ্টা ছিল ...

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

জিনিসগুলি জোড়াগুলির প্রথম দম্পতির জন্য ভাল দেখায়, কিন্তু তারপর "4C" জোড়া পায় এবং লুপটি বক্ররেখা দেয় যে স্ট্রিং ভুল বিন্যাসে থাকে।

স্পষ্টতই যথেষ্ট, যখন আমি ডিবাগার এবং GetString পদ্ধতিতে বাইট অ্যারের মাধ্যমে ধাপে ধাপে এগুতে পারি যে আমি সেই পয়েন্টে পার্স করতে সক্ষম হচ্ছি, ফলাফলটি ", - +" হিসাবে পেয়েছি।

আমি কিভাবে নিখুঁত করছি তা খুঁজে বের করতে পারি - কীভাবে প্রতিটি বাইটকে এটি বিশ্লেষণ করার পরিবর্তে "সরাসরি ডাস্ট" করতে হবে?

0
যোগ সম্পাদিত
মতামত: 1
হ্যাঁ, আমি স্পষ্টভাবে এসকিউএল পরামিতি ব্যবহার করে শুরু করব, যদি আপনি ইতিমধ্যে না।
যোগ লেখক EndangeredMassa, উৎস
যোগ লেখক SQLMenace, উৎস
আমি 'উত্তর' কিছু চেষ্টা এবং সাজানোর আমার ভাল করেনি, তবে তাদের অধিকাংশই কেবল উত্তর হয় না। অতএব, অ-উত্তরগুলিতে মন্তব্যের জন্য অন্যান্য অ-উত্তরগুলি পরিবর্তন করা সম্ভব ছিল না, তাই তাদের মন্তব্যগুলিতে রূপান্তরিত করা হয়। যদি আমার কোনও ভুল থাকে, তবে দয়া করে আমাকে জানান।
যোগ লেখক Tim Post, উৎস

2 উত্তর

Hazzah !!!!

আমি মাইকেল এর পোস্টে ফিরে গিয়েছিলাম, আরও কিছু পোকা এবং বুঝতে পেরেছি যে আমি একটি ডবল রূপান্তর করতে হবে, এবং অবশেষে এই সামান্য নলটি কাজ করেছেন:

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

সেখানে থেকে আমি কেবল একটি অক্ষর 2 দ্বারা 2 দ্বারা যান এবং তাদের "hexified" পেতে লুপ তৈরি এবং তারপর একটি স্ট্রিং মধ্যে অনুবাদ।

নিক এবং অন্য কেউ আগ্রহী, আমি এগিয়ে গিয়েছিলাম এবং আমার সামান্য আবেদন পোস্ট কোডপ্লেক্স । আপনার প্রয়োজন মত ব্যবহার / পরিবর্তন মুক্ত মনে।

0
যোগ

প্রথমে 0x মুছে ফেলার চেষ্টা করুন এবং তারপর এনকোডিং.UTF8.GetString এ কল করুন। আমি মনে করি এটি কাজ করতে পারে।

মূলত: 0x44004500

0x সরান, এবং তারপর সর্বদা দুটি বাইট এক অক্ষর হয়:

44 00 = D

45 00 = E

6F 00 = o

72 00 = r

তাই এটি অবশ্যই দুইটি বাইট / চরিত্রের সাথে একটি ইউনিকোড / ইউটিএফ ফরম্যাট।

0
যোগ