Декодирование T-SQL CAST в C # / VB.NET

голоса
48

Недавно наш сайт был затоплен с возрождением ботнет 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);

Вещи хорошо выглядеть для первых двух пар, но затем цикл уклоняется, когда он попадает в паре «4С» и говорит, что строка в неверном формате.

Интересно, что когда я шагаю через отладчик и метода GetString на массив байтов, который я смог разобрать до этого момента, я получаю «- +» в качестве результата.

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

Задан 01/08/2008 в 16:23
источник пользователем
На других языках...                            


2 ответов

голоса
20

Hazzah !!!!

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

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

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

Нику, и кто -то еще интересно, я пошел вперед и отправил свое маленькое приложение над в CodePlex . Не стесняйтесь использовать / изменять как вам нужно.

Ответил 05/08/2008 в 18:02
источник пользователем

голоса
7

Попробуйте удалить 0xпервый , а затем вызвать Encoding.UTF8.GetString. Я думаю , что может работать.

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

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

44 00 = D

45 00 = E

6F 00 = o

72 00 = r

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

Ответил 02/08/2008 в 02:38
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more