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

voti
48

Recentemente il nostro sito è stato inondato con la rinascita del botnet Asprox SQL injection attacco. Senza entrare nei dettagli, l'attacco tenta di eseguire codice SQL codificando i T-SQL comandi in una stringa ASCII BINARIO codificata. E 'simile a questa:

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

Sono stato in grado di decodificare questo in SQL, ma ero un po 'diffidente di fare questo in quanto non sapevo esattamente cosa stava accadendo in quel momento.

Ho provato a scrivere un semplice strumento di decodifica, in modo da poter decodificare questo tipo di testo senza nemmeno toccare SQL Server . La parte principale ho bisogno decodificato è:

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

Ho provato tutti i seguenti comandi senza fortuna:

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

Qual è il modo corretto di tradurre questa codifica senza utilizzare SQL Server? È possibile? Prenderò codice VB.NET da quando ho familiarità con quello anche.


Va bene, sono sicuro che mi manca qualcosa qui, quindi ecco dove sono a.

Dal momento che il mio input è una stringa di base, ho iniziato con solo un frammento della parte codificata - 4445434C41 (che si traduce in Decla) - e il primo tentativo è stato quello di fare questo ...

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

... e tutto ciò che ha fatto è stato tornare la stessa identica cosa che ho messo in, dal momento che ogni carattere convertito in è di byte.

Mi sono reso conto che ho bisogno di analizzare ogni due personaggi in un byte manualmente dal momento che non conosco ancora tutti i metodi che lo farà, così ora il mio piccolo decoder simile a questa:

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

Le cose sembrano buone per il primo paio di coppie, ma poi il ciclo si tira indietro quando si arriva alla coppia 4C, e dice che la stringa è nel formato corretto.

È interessante notare che, quando faccio un passo attraverso il debugger e al metodo GetString sulla matrice di byte che sono stato in grado di analizzare fino a quel momento, ho capito - + come risultato.

Come faccio a capire che cosa mi manca - ho bisogno di fare un getto diretta per ogni byte invece di tentare di analizzarlo?

È pubblicato 01/08/2008 alle 16:23
fonte dall'utente
In altre lingue...                            


2 risposte

voti
20

Hazzah !!!!

Sono tornato a post di Michael, fatto un po 'Colpendo e ho capito che avevo bisogno di fare una doppia conversione, e alla fine ha lavorato questa piccola pepita:

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

Da lì ho semplicemente fatto un ciclo di passare attraverso tutti i personaggi a 2 a 2 e farli "hexified" e poi tradotto in una stringa.

Per Nick, e chiunque altro interessato, sono andato avanti e postato la mia piccola applicazione oltre a CodePlex . Sentitevi liberi di usare / modificare di cui hai bisogno.

Risposto il 05/08/2008 a 18:02
fonte dall'utente

voti
7

Provare a rimuovere la 0xprima e quindi chiamare Encoding.UTF8.GetString. Penso che può funzionare.

In sostanza: 0x44004500

Rimuovere il 0x, e quindi sempre due byte sono un personaggio:

44 00 = D

45 00 = E

6F 00 = o

72 00 = r

Quindi è sicuramente un formato / UTF Unicode con due byte / carattere.

Risposto il 02/08/2008 a 02:38
fonte dall'utente

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