Сведения о вопросе

FELL

16:03, 1st July, 2020

Теги

c#   sql   vb.net   ascii   hex    

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

Просмотров: 484   Ответов: 2

Недавно наш сайт был затоплен с возрождением asprox ботнет SQL инъекции атаки. Не вдаваясь в подробности, атака пытается выполнить код SQL, кодируя команды T-SQL в кодированной строке ASCII BINARY. Это выглядит примерно так:

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

Я смог расшифровать это в SQL, но я немного опасался делать это, так как я не знал точно, что происходило в то время.

Я попытался написать простой инструмент декодирования, чтобы я мог декодировать этот тип текста, даже не касаясь сервера SQL . Основная часть, которую мне нужно декодировать, - это:

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 на массиве байтов, который я смог разобрать до этого момента, я получаю", - + " в результате.

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



  Сведения об ответе

crush

18:03, 1st July, 2020

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

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

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

Для Ника и всех остальных заинтересованных лиц я пошел дальше и разместил свое маленькое заявление в CodePlex . Не стесняйтесь использовать / изменять по мере необходимости.


  Сведения об ответе

baggs

18:03, 1st July, 2020

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

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

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

44 00 = D

45 00 = E

6F 00 = o

72 00 = r

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться