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?
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
Sí, definitivamente comenzaría usando parámetros de SQL, si aún no lo ha hecho . – EndangeredMassa
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. –