Pregunta

Recientemente nuestro sitio se ha visto inundado por el resurgimiento de la Red de bots Asprox inyección SQL ataque.Sin entrar en detalles, el ataque intenta ejecutar código SQL codificando el T-SQL comandos en una cadena BINARIA codificada en ASCII.Se parece a esto:

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

Pude decodificar esto en SQL, pero tenía un poco de cautela al hacerlo porque no sabía exactamente qué estaba sucediendo en ese momento.

Intenté escribir una herramienta de decodificación simple para poder decodificar este tipo de texto sin siquiera tocarlo. Servidor SQL.La parte principal que necesito decodificar es:

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

Probé 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 también estoy familiarizado con él.


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, comencé con solo un fragmento de la porción 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 un byte.

Me di cuenta de que necesito analizar cada dos caracteres en un byte manualmente ya que todavía no conozco ningún método que pueda hacerlo, 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 los primeros pares, pero luego el bucle se resiste cuando llega al par "4C" y dice que la cadena tiene el formato incorrecto.

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

¿Cómo puedo saber lo que me falta? ¿Necesito hacer una "transmisión directa" para cada byte en lugar de intentar analizarlo?

¿Fue útil?

Solución

Volví a la publicación de Michael, hurgué un poco más 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 revisar todos los caracteres de 2 en 2 y "hexificarlos" y luego traducirlos a una cadena.

Para Nick y para cualquier otra persona interesada, seguí adelante y publiqué mi pequeña aplicación en CódigoPlex.Siéntase libre de usarlo/modificarlo según lo necesite.

Otros consejos

Intente quitar el 0x primero y luego llamar Encoding.UTF8.GetString.Creo que eso 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

Entonces definitivamente es un formato Unicode/UTF con dos bytes/carácter.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top