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

Translate

Vor kurzem wurde unsere Website mit dem Wiederaufleben der überschwemmtAsprox Botnetz SQL-InjektionAttacke. Ohne auf Details einzugehen, versucht der Angriff, SQL-Code durch Codierung von auszuführenT-SQLBefehle in einer ASCII-codierten BINARY-Zeichenfolge. Es sieht ungefähr so aus:

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

Ich konnte dies in SQL dekodieren, war aber etwas vorsichtig, da ich nicht genau wusste, was zu diesem Zeitpunkt geschah.

Ich habe versucht, ein einfaches Dekodierungswerkzeug zu schreiben, damit ich diese Art von Text dekodieren kann, ohne ihn zu berührenSQL Server. Der Hauptteil, den ich entschlüsseln muss, ist:

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

Ich habe alle folgenden Befehle ohne Glück ausprobiert:

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

Was ist der richtige Weg, um diese Codierung ohne Verwendung von SQL Server zu übersetzen? Ist es möglich? Ich nehme VB.NET-Code, da ich damit auch vertraut bin.


Okay, ich bin mir sicher, dass mir hier etwas fehlt, also bin ich hier.

Da es sich bei meiner Eingabe um eine einfache Zeichenfolge handelt, habe ich nur mit einem Ausschnitt aus dem codierten Teil begonnen - 4445434C41 (übersetzt in DECLA) - und der erste Versuch bestand darin, dies zu tun ...

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

... und alles, was es getan hat, war genau das zurückzugeben, was ich eingegeben habe, da jedes Zeichen in ein Byte umgewandelt wurde.

Mir wurde klar, dass ich alle zwei Zeichen manuell in ein Byte analysieren muss, da ich noch keine Methoden kenne, die das tun. Deshalb sieht mein kleiner Decoder jetzt ungefähr so aus:

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

Für die ersten paar Paare sieht es gut aus, aber dann scheut sich die Schleife, wenn sie das "4C" -Paar erreicht und sagt, dass die Zeichenfolge das falsche Format hat.

Interessanterweise erhalte ich ", - +" als Ergebnis, wenn ich durch den Debugger und zur GetString-Methode auf dem Byte-Array gehe, das ich bis zu diesem Punkt analysieren konnte.

Wie finde ich heraus, was mir fehlt? Muss ich für jedes Byte eine "direkte Umwandlung" durchführen, anstatt zu versuchen, es zu analysieren?

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

Alle Antworten

Translate

Ich ging zurück zu Michaels Post, stocherte weiter und erkannte, dass ich eine doppelte Konvertierung durchführen musste, und arbeitete schließlich dieses kleine Nugget aus:

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

Von dort aus habe ich einfach eine Schleife erstellt, um alle Zeichen 2 mal 2 durchzugehen und sie "hexifiziert" zu bekommen und dann in eine Zeichenfolge zu übersetzen.

Zu Nick und allen anderen Interessierten ging ich weiter undhat meine kleine Bewerbung gepostetdrüben inCodePlex. Fühlen Sie sich frei, nach Bedarf zu verwenden / zu ändern.

Quelle
Translate

Versuchen Sie, das zu entfernen0xzuerst und dann anrufenEncoding.UTF8.GetString. Ich denke das könnte funktionieren.

Im Wesentlichen: 0x44004500

Entfernen Sie die 0x, und dann sind immer zwei Bytes ein Zeichen:

44 00 = D

45 00 = E

6F 00 = o

72 00 = r

Es ist also definitiv ein Unicode / UTF-Format mit zwei Bytes / Zeichen.

Quelle