Decodificação T-SQL fundido em C # / VB.NET

votos
48

Recentemente nosso site foi inundado com o ressurgimento do botnet Asprox injeção SQL ataque. Sem entrar em detalhes, o ataque tenta executar o código SQL por codificação de T-SQL comandos em uma string BINARY ASCII codificado. Parece algo como isto:

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

Eu era capaz de decodificar isso em SQL, mas eu estava um pouco cuidadoso de fazer isso desde que eu não sabia exatamente o que estava acontecendo no momento.

Eu tentei escrever uma ferramenta de decodificação simples, para que eu pudesse decodificar este tipo de texto sem sequer tocar SQL Server . A parte principal eu preciso decodificado é:

CAST(0x44004500...06F007200 AS
NVARCHAR(4000))

Eu tentei todos os seguintes comandos sem sorte:

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));

O que é a maneira correta de traduzir essa codificação sem usar SQL Server? É possível? Vou levar código VB.NET desde que eu estou familiarizado com isso também.


Ok, eu tenho certeza que eu estou faltando alguma coisa aqui, então aqui é onde eu estou.

Desde a minha entrada é uma cadeia básica, eu comecei com apenas um trecho da porção codificada - 4445434C41 (que se traduz em DECLA) - ea primeira tentativa foi a de fazer isso ...

txtDecodedText.Text = Encoding.UTF8.GetString(Encoding.UTF8.GetBytes(txtURL.Text));

... e tudo o que fez foi retornar exatamente a mesma coisa que eu colocar, uma vez que convertido cada personagem em é byte.

Eu percebi que eu preciso analisar cada dois caracteres em um byte manualmente desde que eu não sei de ainda quaisquer métodos que vão fazer isso, então agora meu pequeno decodificador é algo como isto:

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);

As coisas parecem boas para o primeiro par de pares, mas, em seguida, o loop hesita quando chega ao par 4C e diz que a cadeia está no formato incorreto.

Curiosamente, quando eu passo através do depurador e ao método de GetString na matriz de bytes que eu era capaz de analisar até que ponto, eu recebo - + como o resultado.

Como faço para descobrir o que eu estou sentindo falta - eu preciso para fazer um elenco direta para cada byte em vez de tentar analisá-lo?

Publicado 01/08/2008 em 16:23
fonte usuário
Em outras línguas...                            


2 respostas

votos
20

Hazzah !!!!

Voltei para o post de Michael, fiz alguns mais picar e percebi que eu tinha necessidade de fazer uma conversão dupla, e, eventualmente, trabalhado esta pequena pepita:

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

De lá, eu simplesmente fez um loop para percorrer todos os caracteres 2 a 2 e levá-los "hexified" e, em seguida, traduzido para uma string.

Para Nick, e qualquer outra pessoa interessada, eu fui em frente e postou meu pequeno aplicativo mais no CodePlex . Sinta-se livre para usar / modificar como você precisa.

Respondeu 05/08/2008 em 18:02
fonte usuário

votos
7

Tente remover o 0xprimeiro e depois chamar Encoding.UTF8.GetString. Eu acho que pode funcionar.

Essencialmente: 0x44004500

Remova o 0x, e depois sempre dois bytes são um caractere:

44 00 = D

45 00 = E

6F 00 = o

72 00 = r

Por isso é definitivamente um formato / UTF Unicode com dois bytes / personagem.

Respondeu 02/08/2008 em 02:38
fonte usuário

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