Decodificación de T-SQL CAST en C # / VB.NET

votos
48

Recientemente, nuestro sitio ha sido inundado con el resurgimiento del ataque de inyección Asprex botnet SQL . 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:

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

Pude decodificar esto en SQL, pero estaba un poco receloso de hacer esto ya que no sabía exactamente qué estaba sucediendo en ese momento.

Traté de escribir una herramienta de decodificación simple, para poder decodificar este tipo de texto sin siquiera tocar SQL Server . La parte principal que necesito decodificar es:

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

He intentado 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 usar 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 estoy perdiendo algo aquí, así que aquí es donde estoy.

Como mi entrada es una cadena básica, comencé con solo un fragmento de la parte codificada, 4445434C41 (que se traduce en DECLA), y el primer intento fue 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 necesito analizar cada dos caracteres en un byte manualmente, ya que aún no conozco ningún método que lo haga, así que ahora mi pequeño decodificador se ve así:

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 averiguo lo que me estoy perdiendo? ¿Necesito hacer un lanzamiento directo para cada byte en lugar de intentar analizarlo?

Publicado el 01/08/2008 a las 16:23
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
7

Intenta eliminar el 0xprimero y luego llama Encoding.UTF8.GetString. Creo que eso puede funcionar

Básicamente: 0x44004500

Quite el 0x, y luego siempre dos bytes son un caracter:

44 00 = D

45 00 = E

6F 00 = o

72 00 = r

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

Respondida el 02/08/2008 a las 02:38
fuente por usuario

votos
20

Hazzah !!!!

Volví a la publicación de Michael, hice algunos retoques más y me di cuenta de que tenía que hacer una doble conversión, y finalmente resolví 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 ciclo para recorrer todos los caracteres de 2 en 2 y obtenerlos "hexificados" y luego traducirlos a una cadena.

Para Nick, y para cualquier otra persona interesada, seguí adelante y publiqué mi pequeña solicitud en CodePlex . Siéntase libre de usar / modificar lo que necesite.

Respondida el 05/08/2008 a las 18:02
fuente por usuario

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