Question

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

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

J'ai pu décoder cela en SQL, mais j'étais un peu méfiant car je ne savais pas exactement ce qui se passait à ce moment-là.

J'ai essayé d'écrire un outil de décodage simple, pour pouvoir décoder ce type de texte sans même toucher Serveur SQL.La partie principale que j'ai besoin d'être décodée est :

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 cet encodage sans utiliser SQL Server ?Est-il possible?Je vais prendre le code VB.NET puisque je le connais aussi.


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

Étant donné que 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 renvoyer exactement la même chose que celle que j'ai mise puisqu'il a converti chaque caractère en un octet.

J'ai réalisé que je devais analyser manuellement tous les deux caractères en un octet, car je ne connais pas encore de méthodes permettant de le faire, 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 les deux premières paires, mais la boucle rechigne ensuite lorsqu'elle arrive à la paire "4C" et indique que la chaîne est dans un 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 effectuer une "diffusion directe" pour chaque octet au lieu d'essayer de l'analyser ?

Était-ce utile?

La solution

Je suis revenu au message de Michael, j'ai fait quelques recherches supplémentaires et j'ai réalisé que j'avais besoin de faire une double conversion, et j'ai finalement trouvé cette petite pépite :

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

À partir de là, j'ai simplement fait une boucle pour parcourir tous les caractères 2 par 2 et les "hexifier" puis les traduire en chaîne.

À Nick et à toute autre personne intéressée, je suis allé de l'avant et j'ai posté ma petite candidature dans CodePlex.N'hésitez pas à utiliser/modifier selon vos besoins.

Autres conseils

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

Essentiellement:0x44004500

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

44 00 = D

45 00 = E

6F 00 = o

72 00 = r

Il s'agit donc bien d'un format Unicode/UTF avec deux octets/caractère.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top