2008-08-01 7 views
44

Недавно наш сайт был завален возобновлением атаки . Не вдаваясь в подробности, атака пытается выполнить код SQL, закодировав команды T-SQL в кодированной в ASCII строке BINARY. Это выглядит примерно так:Расшифровка T-SQL CAST в C#/VB.NET

DECLARE%[email protected]%20NVARCHAR(4000);SET%[email protected]=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 в массиве байтов, который я смог разобрать до этого момента, в результате получается «, - +».

Как я могу понять, что мне не хватает - мне нужно сделать «прямой бросок» для каждого байта, а не пытаться его разобрать?

+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 2008-09-10 18:07:10

ответ

18

Hazzah !!!!

Я вернулся к посту Майкла, сделал несколько больше засовывать и понял, что мне нужно сделать двойное преобразование, и в конечном итоге разработал этот небольшой самородок:

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

Оттуда я просто сделал петлю на пройти все символы 2 на 2 и получить их «hexified», а затем перевести на строку.

Чтобы Ник и кто-то еще заинтересовался, я пошел дальше и posted my little application в CodePlex. Не стесняйтесь использовать/модифицировать по мере необходимости.

6

Сначала удалите 0x, а затем позвоните Encoding.UTF8.GetString. Я думаю, что это может сработать.

По существу: 0x44004500

Удалите 0x, а затем всегда два байта один символ:

44 00 = D 

45 00 = E 

6F 00 = o 

72 00 = r 

Так что это, безусловно, формат/UTF Unicode с двумя байт/символ.