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

Récemment, notre site a été submergé par la résurgence du botnet Asprox Injection SQL attaque. Sans entrer dans les détails, l'attaque tente d'exécuter du code SQL en codant les commandes T-SQL dans une chaîne BINARY codée ASCII. Cela ressemble à ceci:

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

J'ai été capable de décoder cela en SQL, mais j'étais un peu méfiant de le faire puisque je ne savais pas exactement ce qui se passait à l'époque.

I tried to write a simple decode tool, so I could decode this type of text without even touching SQL Server. The main part I need decoded is:

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

J'ai essayé toutes les commandes suivantes 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 puisque je le connais aussi.


Ok, je suis sûr qu'il me manque quelque chose ici, alors voici où j'en suis.

Puisque 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 a été de le faire ...

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

... et tout ce qu'il a fait, c'est de retourner exactement la même chose que j'ai mis, car il a converti chaque caractère en octet.

Je me suis rendu compte que je devais analyser chaque deux caractères dans un octet manuellement puisque je ne connais pas encore de méthodes qui le feront, alors 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 le premier couple de paires, mais la boucle rebondit quand elle arrive à la paire "4C" et dit que la chaîne est dans le format incorrect.

Chose intéressante, lorsque je parcours le débogueur et la méthode GetString sur le tableau d'octets que j'ai pu analyser jusqu'à ce point, j'obtiens ", - +" comme résultat.

Comment puis-je comprendre ce qui me manque? Dois-je faire un "casting direct" pour chaque octet au lieu de tenter de l'analyser?

0
ajouté édité
Vues: 2
Oui, je commencerais certainement par utiliser des paramètres SQL, si ce n'est déjà fait.
ajouté l'auteur EndangeredMassa, source
J'ai fait de mon mieux pour essayer de trier certaines des réponses, mais la plupart d'entre elles ne sont tout simplement pas des réponses. Par conséquent, la conversion d'autres non-réponses en commentaires sur les non-réponses n'était pas possible, de sorte que celles-ci ont été converties en commentaires. Si j'ai quelque chose d'incorrect, s'il vous plaît faites le moi savoir.
ajouté l'auteur Tim Post, source

2 Réponses

Hazzah !!!!

Je suis retourné au poste de Michael, j'ai fait un peu plus de piquer et j'ai réalisé que j'avais besoin de faire une double conversion, et j'ai finalement travaillé sur cette petite pépite:

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

De là, j'ai simplement fait une boucle pour parcourir tous les personnages 2 par 2 et les obtenir "hexifiés" puis traduits en une chaîne.

Pour Nick, et tout le monde intéressé, je suis allé de l'avant et posté ma petite application sur CodePlex . N'hésitez pas à utiliser / modifier selon vos besoins.

0
ajouté

Essayez de supprimer le 0x d'abord, puis appelez Encoding.UTF8.GetString . Je pense que cela peut fonctionner.

Essentiellement: 0x44004500

Supprimez le 0x, puis toujours deux octets sont un caractère:

44 00 = D

45 00 = E

6F 00 = o

72 00 = r

C'est donc définitivement un format Unicode / UTF avec deux octets / caractère.

0
ajouté