Αποκωδικοποίηση T-SQL CAST σε C # / VB.NET

ψήφοι
48

Πρόσφατα το site μας έχει κατακλυστεί με την αναβίωση του botnet Asprox SQL ένεση επίθεση. Χωρίς να υπεισέλθουμε σε λεπτομέρειες, η επίθεση προσπαθεί να εκτελέσει κώδικα SQL με την κωδικοποίηση των Τ-SQL εντολές σε ένα ASCII κωδικοποιημένη δυαδική συμβολοσειρά. Μοιάζει κάπως έτσι:

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

Ήμουν σε θέση να αποκωδικοποιήσει αυτό το SQL, αλλά ήμουν λίγο επιφυλακτικοί για να γίνει αυτό αφού δεν ήξερα ακριβώς τι συνέβαινε εκείνη την εποχή.

Προσπάθησα να γράψω ένα απλό εργαλείο αποκωδικοποίησης, έτσι θα μπορούσα να αποκωδικοποιήσει αυτό το είδος του κειμένου, χωρίς καν να αγγίζει τον SQL Server . Το κύριο μέρος θα πρέπει αποκωδικοποιηθεί είναι:

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

Έχω δοκιμάσει όλες τις ακόλουθες εντολές χωρίς τύχη:

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

Ποιος είναι ο σωστός τρόπος να μεταφραστεί αυτή η κωδικοποίηση χωρίς τη χρήση του SQL Server; Είναι δυνατόν? Θα πάρω τον κωδικό VB.NET δεδομένου ότι είμαι εξοικειωμένος με αυτό επίσης.


Εντάξει, είμαι βέβαιος ότι είμαι λείπει κάτι εδώ, τόσο εδώ είναι όπου είμαι στο.

Από εισόδου μου είναι ένα βασικό εγχόρδων, άρχισα με ένα μόνο απόσπασμα του κωδικοποιημένου τμήματος - 4445434C41 (το οποίο μεταφράζεται σε δηλώσεων που περιέχονται) - και η πρώτη προσπάθεια ήταν να το κάνει αυτό ...

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

... και το μόνο που έκανε ήταν να επιστρέψει ακριβώς το ίδιο πράγμα που έβαλα μέσα, αφού μετατρέπεται κάθε χαρακτήρα σε byte είναι.

Συνειδητοποίησα ότι πρέπει να αναλύσει το καθένα δύο χαρακτήρες σε ένα byte με το χέρι αφού δεν ξέρω από οποιεσδήποτε ακόμα μεθόδων που θα το κάνει αυτό, έτσι και τώρα λίγο αποκωδικοποιητή μου μοιάζει κάπως έτσι:

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

Τα πράγματα δείχνουν καλά για το πρώτο ζευγάρι των ζευγαριών, αλλά στη συνέχεια ο βρόχος καδρονιών όταν παίρνει την «4C» ζευγάρι και λέει ότι η σειρά είναι σε λάθος μορφή.

Το ενδιαφέρον είναι ότι όταν περπατώ μέσα από το πρόγραμμα εντοπισμού σφαλμάτων και με τη μέθοδο GetString στο πίνακα byte που ήμουν σε θέση να αναλύσει μέχρι εκείνο το σημείο, παίρνω «- +» ως αποτέλεσμα.

Πώς μπορώ να καταλάβω τι χάνω - χρειάζομαι για να κάνω μια «άμεση καστ» για κάθε byte, αντί να προσπαθούν να το αναλύσει;

Δημοσιεύθηκε 01/08/2008 στις 16:23
πηγή χρήστη
Σε άλλες γλώσσες...                            


2 απαντήσεις

ψήφοι
20

Hazzah !!!!

Πήγα πίσω στη θέση του Μιχαήλ, έκανε κάποιες πιο σπρώχνει και συνειδητοποίησα ότι είχα ανάγκη να κάνω μια διπλής μετατροπής, και τελικά να επεξεργαστεί αυτό το μικρό ψήγμα:

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

Από εκεί απλά έκανε μια θηλιά για να περάσει από όλους τους χαρακτήρες 2 από 2 και να τους πάρει «hexified» και στη συνέχεια μεταφράστηκε σε μια σειρά.

Για Nick, και οποιοσδήποτε άλλος ενδιαφέρεται, πήγα μπροστά και δημοσιεύτηκε λίγο αίτησή μου πάνω στο CodePlex . Μη διστάσετε να χρησιμοποιήσετε / τροποποίηση που χρειάζεστε.

Απαντήθηκε 05/08/2008 στις 18:02
πηγή χρήστη

ψήφοι
7

Δοκιμάστε να αφαιρέσετε το 0xπρώτο και στη συνέχεια να καλέσετε Encoding.UTF8.GetString. Νομίζω ότι μπορεί να λειτουργήσει.

Ουσιαστικά: 0x44004500

Αφαιρέστε το 0x, και στη συνέχεια, πάντα δύο bytes είναι ένας χαρακτήρας:

44 00 = D

45 00 = E

6F 00 = o

72 00 = r

Γι 'αυτό είναι σίγουρα μια μορφή / UTF Unicode με δύο bytes / χαρακτήρα.

Απαντήθηκε 02/08/2008 στις 02:38
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more