سؤال

مؤخرا موقعنا وقد تدفقت مع عودة Asprox الروبوتات حقن SQL الهجوم.دون الخوض في تفاصيل الهجوم المحاولات الرامية إلى تنفيذ التعليمات البرمجية SQL بواسطة ترميز T-SQL الأوامر في ASCII ترميز ثنائي السلسلة.يبدو شيئا من هذا القبيل:

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

كنت قادرا على فك هذا في SQL, ولكن كنت حذرا قليلا من فعل هذا منذ لم أكن أعرف بالضبط ما كان يحدث في ذلك الوقت.

حاولت أن أكتب بسيط فك أداة, حتى أتمكن من فك شفرة هذا النوع من النص حتى دون لمس 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));

ما هي الطريقة المناسبة لترجمة هذا الترميز دون استخدام SQL Server?هل من الممكن ؟ سآخذ VB.NET مدونة منذ أنا أعرف ذلك أيضا.


حسنا, أنا متأكد أنا في عداد المفقودين شيء هنا ، هنا حيث أنا في.

منذ المدخلات الأساسية السلسلة بدأت مع مقتطف من ترميز جزء - 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);

تبدو الأمور جيدة لأول زوجين من أزواج ، ولكن بعد حلقة يحجم عندما يحصل على "4C" زوج و يقول أن السلسلة هو في غير تنسيق.

ومن المثير للاهتمام بما فيه الكفاية عندما كنت خطوة من خلال المصحح إلى GetString الأسلوب على صفيف بايت أنني كنت قادرا على تحليل ما يصل إلى هذه النقطة ، أحصل على "، - + " نتيجة.

كيف يمكنني معرفة ما أنا في عداد المفقودين - هل أنا بحاجة إلى القيام "يلقي المباشر" لكل بايت بدلا من محاولة لتحليل هذا ؟

هل كانت مفيدة؟

المحلول

عدت إلى مايكل بعد, هل هناك المزيد من دس و أدركت أنني بحاجة إلى القيام تحويل مزدوجة ، وفي نهاية المطاف نجح نفهم هذا:

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

من هناك أنا ببساطة حلقة للذهاب من خلال جميع الشخصيات 2 2 والحصول عليها "hexified" ثم ترجم إلى سلسلة.

نيك و أي شخص آخر مهتم ذهبت إلى الأمام ، نشر بلدي قليلا تطبيق في CodePlex.لا تتردد في استخدام/تعديل ما تحتاج إليه.

نصائح أخرى

حاول إزالة 0x أولا ثم دعوة Encoding.UTF8.GetString.أعتقد أنه قد عمل.

أساسا:0x44004500

إزالة 0 x ثم دائما اثنين بايت هي حرف واحد:

44 00 = D

45 00 = E

6F 00 = o

72 00 = r

حتى انها بالتأكيد Unicode/UTF تنسيق مع اثنين بايت/حرف.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top