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?
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
Ja, ich würde definitiv mit SQL-Parametern beginnen, wenn Sie nicht bereits sind . – EndangeredMassa
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. –