Pergunta

Recentemente nosso site foi inundado com o ressurgimento do Botnet Asprox injeção SQL ataque.Sem entrar em detalhes, o ataque tenta executar código SQL codificando o T-SQL comandos em uma string BINARY codificada em ASCII.Parece algo assim:

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

Consegui decodificar isso em SQL, mas fiquei um pouco cauteloso ao fazer isso, pois não sabia exatamente o que estava acontecendo no momento.

Tentei escrever uma ferramenta de decodificação simples, para poder decodificar esse tipo de texto sem nem tocar Servidor SQL.A parte principal que preciso ser decodificada é:

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

Qual é a maneira correta de traduzir essa codificação sem usar o SQL Server?É possível?Usarei o código VB.NET, pois também estou familiarizado com isso.


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

Como minha entrada é uma string básica, comecei com apenas um trecho da parte codificada - 4445434C41 (que se traduz em DECLA) - e a primeira tentativa foi 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 coloquei, já que converteu cada caractere em um byte.

Percebi que preciso analisar cada dois caracteres em um byte manualmente, pois ainda não conheço nenhum método que faça isso, então agora meu pequeno decodificador se parece com 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 os primeiros pares, mas o loop hesita quando chega ao par "4C" e diz que a string está no formato incorreto.

Curiosamente, quando passo pelo depurador e pelo método GetString na matriz de bytes que consegui analisar até aquele ponto, obtenho ",-+" como resultado.

Como faço para descobrir o que estou perdendo - preciso fazer uma "conversão direta" para cada byte em vez de tentar analisá-lo?

Foi útil?

Solução

Voltei ao post de Michael, fiz mais algumas pesquisas e percebi que precisava fazer uma conversão dupla e, eventualmente, descobri esta pequena pepita:

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

A partir daí, simplesmente fiz um loop para percorrer todos os caracteres 2 por 2 e "hexificá-los" e depois traduzi-los para uma string.

Para Nick e qualquer outra pessoa interessada, fui em frente e postei meu pequeno aplicativo lá em CodePlex.Sinta-se à vontade para usar/modificar conforme necessário.

Outras dicas

Tente remover o 0x primeiro e depois ligue Encoding.UTF8.GetString.Eu acho que isso pode funcionar.

Essencialmente:0x44004500

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

44 00 = D

45 00 = E

6F 00 = o

72 00 = r

Portanto, é definitivamente um formato Unicode/UTF com dois bytes/caractere.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top