Décodage CAST T-SQL en C # / VB.NET

voix
48

Récemment , notre site a été inondé avec la résurgence du botnet Asprox SQL injection attaque. Sans entrer dans les détails, l'attaque tente d'exécuter du code SQL en codant les T-SQL commandes dans une chaîne binaire encodé ASCII. Il ressemble à ceci:

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

J'ai pu décoder dans SQL, mais je suis un peu méfiant de le faire puisque je ne savais pas exactement ce qui se passait à l'époque.

J'ai essayé d'écrire un simple outil de décodage, donc je pouvais décoder ce type de texte sans même toucher SQL Server . La partie principale je besoin décodée est:

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

J'ai essayé toutes les commandes suivantes, mais sans succès:

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

Quelle est la bonne façon de traduire ce codage sans utiliser SQL Server? C'est possible? Je vais prendre le code VB.NET depuis que je suis au courant de cela aussi.


D'accord, je suis sûr que je manque quelque chose ici, donc est là où je suis.

Depuis mon entrée est une chaîne de base, j'ai commencé avec juste un extrait de la partie codée - 4445434C41 (qui se traduit par DECLA) - et la première tentative de le faire ...

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

... et tout ce qu'il a fait était de retour exactement la même chose que je mets, car il convertit chaque caractère en est octet.

J'ai réalisé que je dois analyser chacun deux caractères dans un octet manuellement depuis que je ne connais pas de méthodes encore qui va le faire, maintenant mon petit décodeur ressemble à ceci:

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

Les choses semblent bonnes pour les deux premières paires, mais la boucle renâcle quand il arrive à la paire « 4C » et dit que la chaîne est dans le format incorrect.

Il est intéressant, quand je fais un pas dans le débogueur et la méthode GetString sur le tableau d'octets que je suis capable d'analyser jusqu'à ce moment-là, je reçois «- + » à la suite.

Comment puis-je savoir ce que je suis absent - dois-je faire un « cast directe » pour chaque octet au lieu d'essayer de l'analyser?

Créé 01/08/2008 à 16:23
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
20

Hazzah !!!!

Je suis retourné au poste de Michael, fait un peu plus et poking réalisé que je ne dois faire une double conversion, et finalement travaillé cette petite pépite:

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

De là, je simplement fait une boucle pour parcourir tous les personnages 2 par 2 et obtenir les « hexified », puis traduit en une chaîne.

Pour Nick, et quelqu'un d' autre intéressé, je suis allé de l' avant et posté ma petite application sur dans CodePlex . Ne hésitez pas à utiliser / modifier comme vous avez besoin.

Créé 05/08/2008 à 18:02
source utilisateur

voix
7

Essayez de retirer le 0xpremier puis appeler Encoding.UTF8.GetString. Je pense que peut travailler.

Essentiellement: 0x44004500

Retirez le 0x, et toujours deux octets sont un caractère:

44 00 = D

45 00 = E

6F 00 = o

72 00 = r

Il est donc sans aucun doute un format Unicode / UTF avec deux octets / caractère.

Créé 02/08/2008 à 02:38
source utilisateur

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