Недавно наш сайт наводнился со всплеском ботнет Asprox инъекция SQL нападение. Без того, чтобы сообщать подробности нападение пытается выполнить код SQL, кодируя команды T-SQL в закодированной ДВОЙНОЙ последовательности ASCII. Это выглядит примерно так:
DECLARE%20@S%20NVARCHAR(4000);SET%20@S=CAST(0x44004500...06F007200%20AS%20NVARCHAR(4000));EXEC(@S);--
Я смог расшифровать это в SQL, но я немного опасался делать это так как я didn' t знают точно, что происходило в то время.
Я пытался написать, что простое расшифровывает инструмент, таким образом, я мог расшифровать этот тип текста, даже не касаясь SQL& nbsp; Сервер. Главная первая часть должна быть расшифрована:
CAST(0x44004500...06F007200 AS
NVARCHAR(4000))
I' ve попробовал все следующие команды без удачи:
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-сервер? Действительно ли это возможно? I' ll берут кодекс VB.NET начиная с I' m знакомый с этим также.
Хорошо, I' m верный I' m пропавшие без вести чего-то здесь, таким образом, here' s, где I' m в.
Так как мой вход - основная последовательность, я начал только с отрывка закодированной части - 4445434C41 (который переводит к DECLA) - и первая попытка состояла в том, чтобы сделать это...
txtDecodedText.Text = Encoding.UTF8.GetString(Encoding.UTF8.GetBytes(txtURL.Text));
... и все, что это сделало, было возвратить ту же самую вещь, которую я вставил, так как это преобразовало каждый характер в, байт.
Я понял, что должен разобрать каждые два знака в байт вручную так как я don' t знают о любых методах все же, которые сделают это, поэтому теперь мой небольшой декодер выглядит примерно так:
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 на массиве байтов, который я смог разобрать до того пункта, я получаю " - + " как результат.
Как делают я выясняю что I' m отсутствующий - делают я должен сделать " прямой cast" для каждого байта вместо того, чтобы пытаться разобрать его?
Я вернулся к Michael' s почта, сделал еще некоторое тыкание и понял, что я действительно должен был сделать двойное преобразование, и в конечном счете разработал этот небольшой самородок:
Convert.ToString(Convert.ToChar(Int32.Parse(EncodedString.Substring(intParseIndex, 2), System.Globalization.NumberStyles.HexNumber)));
Оттуда я просто сделал петлю, чтобы пройти все знаки 2 2 и получить их " hexified" и затем переведенный к последовательности.
Нику, и кто-либо еще заинтересовал, я шел вперед, и отправил мое небольшое заявление в CodePlex. Не стесняйтесь использовать/изменять, как Вам нужно.
Попытайтесь удалить '0x' сначала и затем назовите 'Кодирование. UTF8. GetString'. Я думаю, что это может работать.
По существу: 0x44004500
Удалите 0x, и затем всегда два байта - один характер:
44 00 = D
45 00 = E
6F 00 = o
72 00 = r
Так it' s определенно Unicode/UTF форматируют с двумя байтами/характерами.