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


Recientemente nuestro sitio ha sido inundado con el resurgimiento de la botnet Asprox Ataque de inyección 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 cauteloso de hacer esto ya que no sabía exactamente lo que estaba sucediendo en ese momento.

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

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 usar SQL Server? Es posible? Tomaré VB.NET código ya que estoy familiarizado con eso también.


Bien, estoy seguro de que me estoy perdiendo algo aquí, así que aquí es donde estoy.

Dado que mi entrada es una cadena básica, comenzó con solo un fragmento de la parte codificada-4445434C41 (que se traduce como 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 no conozco ningún método todavía que haga eso, así que ahora mi pequeño decodificador se 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 falla cuando llega al par " 4C " y dice que la cadena está en el formato incorrecto.

Curiosamente, cuando paso a través del depurador y al método getString en la matriz de bytes que pude analizar hasta ese punto, obtengo ",-+" como resultado.

¿Cómo puedo averiguar lo que me estoy perdiendo - necesito hacer un "cast directo" para cada byte en lugar de intentar analizarlo?

Author: Peter Mortensen, 2008-08-01

2 answers

Hazzah!!!!

Regresé al post de Michael, hice un poco más de hurgar y me di cuenta de que necesitaba 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 bucle para ir a través de todos los caracteres 2 por 2 y conseguir que "hexificado" y luego traducido a una cadena.

A Nick, y a cualquier otra persona interesada, seguí adelante y publiqué mi pequeña aplicación en CodePlex . Siéntase libre de usar / modificar como usted necesitar.

 20
Author: Dillie-O,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-08 17:02:44

Intenta eliminar el 0x primero y luego llama a Encoding.UTF8.GetString. Creo que puede funcionar.

Esencialmente: 0x44004500

Elimine el 0x, y luego siempre dos bytes son un carácter:

44 00 = D

45 00 = E

6F 00 = o

72 00 = r

Así que definitivamente es un formato Unicode/UTF con dos bytes/carácter.

 8
Author: Michael Stum,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-08 17:01:20