2008-08-01 12 views
44

Vor kurzem wurde unsere Website mit dem Wiederaufleben der Asprox botnetSQL injection Angriff überschwemmt. Ohne ins Detail zu gehen, versucht der Angriff, SQL-Code auszuführen, indem er die T-SQL-Befehle in einer ASCII-codierten BINARY-Zeichenfolge codiert. Es sieht etwa so aus:Decoding T-SQL CAST in C#/VB.NET

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

Ich konnte dies in SQL entschlüsseln, aber ich war ein wenig vorsichtig, dies zu tun, da ich nicht genau wusste, was zu der Zeit geschieht.

Ich habe versucht, ein einfaches Dekodierwerkzeug zu schreiben, damit ich diese Art von Text decodieren konnte, ohne auch nur SQL Server zu berühren. Der Hauptteil I decodiert müssen, ist:

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

Ich habe alle der folgenden Befehle ohne Glück versucht:

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 zu übersetzen, ohne SQL Server zu verwenden? Ist es möglich? Ich werde VB.NET-Code nehmen, da ich damit auch vertraut bin.


Okay, ich bin sicher, dass ich hier etwas vermisse, also hier ist, wo ich bin.

Da meine Eingabe eine grundlegende Zeichenfolge ist, begann ich mit nur einen Ausschnitt aus der codierten Teil - 4445434C41 (was Decla übersetzt) ​​- und der erste Versuch war, dies zu tun ...

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

. ..und alles, was es getan hat, war genau die gleiche Sache, die ich eingegeben habe, da es jedes Zeichen in ein Byte umwandelte.

Ich erkannte, dass ich jeweils zwei Zeichen in ein Byte manuell analysieren müssen, da ich von irgendwelchen Methoden weiß es noch nicht, dass dies tun wird, so dass nun mein kleiner Decoder etwas wie folgt aussieht:

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 wird die Schleife beim Erreichen des "4C" -Paares unterbrochen und es wird gesagt, dass die Zeichenfolge im falschen Format ist.

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

Wie finde ich heraus, was ich vermisse - muss ich für jedes Byte einen "Direktwurf" machen, anstatt zu versuchen, es zu parsen?

+0

Siehe meine Antwort hier: [http://stackoverflow.com/questions/32412/whats-the-best-way-of-cleaning-up-after-a-sql-injection#32422](http:// stackoverflow.com/questions/32412/whats-the-best-way-of-cleaning-up-after-a-sql-injection#32422) – SQLMenace

+0

Ja, ich würde definitiv mit SQL-Parametern beginnen, wenn Sie nicht bereits sind . – EndangeredMassa

+0

Ich habe mein Bestes getan, um einige der "Antworten" heraus zu sortieren, aber die meisten von ihnen sind einfach keine Antworten. Daher war die Konvertierung anderer Nicht-Antworten in Kommentare zu Nicht-Antworten nicht möglich, sodass diese in Kommentare umgewandelt wurden. Wenn ich etwas falsch verstanden habe, lass es mich wissen. –

Antwort

18

Hazzah !!!!

Ich ging zurück zu Michael Post, haben einige Stoßend und erkannte, dass ich brauchte eine doppelte Umwandlung zu tun, und schließlich arbeitete dieses kleine Nugget aus:

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

Von dort habe ich einfach eine Schleife gemacht gehe durch alle Zeichen 2 mal 2 und lasse sie "hexifizieren" und dann in eine Zeichenkette übersetzen.

Um Nick, und alle anderen interessierten, ging ich weiter und posted my little application über in CodePlex. Fühlen Sie sich frei zu benutzen/ändern, wie Sie brauchen.

6

Versuchen Sie zuerst, die 0x zu entfernen und rufen Sie dann Encoding.UTF8.GetString an. Ich denke, das könnte funktionieren.

Im Wesentlichen: 0x44004500

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

44 00 = D 

45 00 = E 

6F 00 = o 

72 00 = r 

So ein Unicode/UTF-Format mit es ist definitiv zwei Bytes/Zeichen.