Decoding T- CAST SQL dans C # / VB.NET

Translate

Récemment, notre site a été inondé de la résurgence de laBotnet Asprox Injection SQLattaque. Sans entrer dans les détails, l'attaque tente d'exécuter du code SQL en encodant leT-SQLcommandes dans une chaîne BINAIRE encodée en ASCII. Cela ressemble à quelque chose comme ceci:

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

J'ai pu décoder cela en SQL, mais je me méfiais un peu de le faire car je ne savais pas exactement ce qui se passait à l'époque.

J'ai essayé d'écrire un outil de décodage simple, pour pouvoir décoder ce type de texte sans même toucherServeur SQL. La partie principale dont j'ai besoin d'être décodé 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 ce codage sans utiliser SQL Server? C'est possible? Je vais prendre le code VB.NET puisque je suis familier avec cela aussi.


D'accord, 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 retourner exactement la même chose que j'ai mise car il a converti chaque caractère en un octet.

J'ai réalisé que je devais analyser manuellement tous les deux caractères dans un octet car je ne connais pas encore de méthode pour 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 ensuite la boucle hésite lorsqu'elle arrive à la paire "4C" et indique que la chaîne est dans le format incorrect.

Il est intéressant de noter que lorsque je passe par 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 "cast direct" pour chaque octet au lieu d'essayer de l'analyser?

This question and all comments follow the "Attribution Required."

Toutes les réponses

Translate

Je suis retourné au message de Michael, j'ai poussé un peu plus 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)));

À partir de là, j'ai simplement fait une boucle pour parcourir tous les caractères 2 par 2 et les obtenir «hexifiés» puis traduits en une chaîne.

À Nick, et à toute personne intéressée, je suis allé de l'avant etposté ma petite applicationplus dansCodePlex. N'hésitez pas à utiliser / modifier selon vos besoins.

La source
Translate

Essayez de supprimer le0xd'abord puis appelezEncoding.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.

La source