Недавно наш сайт был завален возобновлением атаки . Не вдаваясь в подробности, атака пытается выполнить код 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 в массиве байтов, который я смог разобрать до этого момента, в результате получается «, - +».
Как я могу понять, что мне не хватает - мне нужно сделать «прямой бросок» для каждого байта, а не пытаться его разобрать?
См. Мой ответ здесь: [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