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

Недавно наш сайт был наводнен всплеском атаки инъекций SQL ботнетом Asprox . Не вдаваясь в подробности, атака пытается выполнить код SQL путем кодирования команд T-SQL в виде строки BINARY в кодировке 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 в байтовом массиве, который мне удалось проанализировать до этого момента, я получаю «, - +» в результате.

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

1.08.2008 15:23:05
Да, я бы определенно начал с использования параметров SQL, если вы еще этого не сделали.
EndangeredMassa 2.08.2008 01:33:38
SQLMenace 10.09.2008 18:07:10
Я сделал все возможное, чтобы попытаться разобраться в некоторых «ответах», однако большинство из них просто не являются ответами. Следовательно, преобразование других не-ответов в комментарии к не-ответам было невозможно, поэтому они были преобразованы в комментарии. Если я ошибся, пожалуйста, дайте мне знать.
Tim Post♦ 10.08.2011 06:21:18
2 ОТВЕТА
РЕШЕНИЕ

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

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

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

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

22
10.02.2019 22:11:00

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

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

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

44 00 = D

45 00 = E

6F 00 = o

72 00 = r

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

7
8.01.2015 17:01:20