2008-08-01 17 views
44

Recientemente nuestro sitio ha sido inundado con el resurgimiento del ataque Asprox botnetSQL injection. Sin entrar en detalles, el ataque intenta ejecutar código SQL codificando los comandos T-SQL en una cadena BINARIA codificada en ASCII. Se ve algo como esto:Descifrando T-SQL CAST en C#/VB.NET

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

yo era capaz de decodificar esta en SQL, pero yo estaba un poco preocupado de hacer esto ya que no sabía exactamente lo que estaba ocurriendo en el momento.

Intenté escribir una herramienta de decodificación simple, así que pude decodificar este tipo de texto sin siquiera tocar SQL Server. La parte principal que necesito es decodificado:

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

He probado todos los siguientes comandos sin suerte:

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

¿Cuál es la forma correcta de traducir esta codificación sin utilizar SQL Server? ¿Es posible? Tomaré el código VB.NET ya que estoy familiarizado con eso también.


De acuerdo, estoy seguro de que me falta algo aquí, así que aquí es donde estoy.

Desde mi entrada es una cadena básica, empecé con sólo un fragmento de la parte codificada - 4445434C41 (que se traduce en DECLA) - y el primer intento no tuvo que hacer esto ...

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

. ... y todo lo que hizo fue devolver exactamente lo mismo que puse, ya que convirtió cada carácter en byte.

me di cuenta de que tengo que analizar cada dos caracteres en un byte manualmente ya que no conozco ningún método hasta ahora de que voy a hacer eso, por lo que ahora mi pequeño decodificador ve algo como esto:

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

Las cosas se ven bien para el primer par de pares, pero luego el bucle se detiene cuando llega al par "4C" y dice que la cadena está en el formato incorrecto.

Curiosamente, cuando paso por el depurador y el método GetString en la matriz de bytes que pude analizar hasta ese punto, obtengo ", - +" como resultado.

¿Cómo puedo averiguar lo que me falta? ¿Necesito hacer un "lanzamiento directo" para cada byte en lugar de intentar analizarlo?

+0

Véase mi respuesta aquí: [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

+0

Sí, definitivamente comenzaría usando parámetros de SQL, si aún no lo ha hecho . – EndangeredMassa

+0

Hice mi mejor esfuerzo para tratar de ordenar algunas de las 'respuestas', sin embargo, la mayoría de ellas simplemente no son respuestas. Por lo tanto, la conversión de otras no respuestas a los comentarios sobre las no respuestas no fue posible, por lo que se convirtieron en comentarios. Si tengo algo incorrecto, por favor avíseme. –

Respuesta

18

Hazzah !!!!

Fui de nuevo a cargo de Michael, hecho un poco más auscultar y se dieron cuenta de que yo tenía que hacer un doble conversión, y con el tiempo trabajado a cabo esta pequeña pepita:

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

A partir de ahí simplemente hice un bucle para revise todos los caracteres de 2 en 2 y hágalos "hexificados" y luego véndalos en una cadena.

Para Nick, y para cualquier otra persona interesada, seguí adelante y posted my little application en CodePlex. Siéntase libre de usar/modificar lo que necesite.

6

Intente eliminar primero el 0x y luego llame al Encoding.UTF8.GetString. Creo que eso puede funcionar

Esencialmente: 0x44004500

Retire el 0x, y luego siempre dos bytes son un personaje:

44 00 = D 

45 00 = E 

6F 00 = o 

72 00 = r 

lo que es definitivamente un formato/UTF Unicode con dos bytes/caracteres.