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

Translate

Recentemente il nostro sito è stato sommerso dalla rinascita delBotnet Asprox SQL Injectionattacco. Senza entrare nei dettagli, l'attacco tenta di eseguire codice SQL codificando il fileT-SQLcomandi in una stringa BINARIA con codifica ASCII. Assomiglia a questo:

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

Sono stato in grado di decodificarlo in SQL, ma ero un po 'diffidente nel farlo poiché non sapevo esattamente cosa stesse succedendo in quel momento.

Ho provato a scrivere un semplice strumento di decodifica, in modo da poter decodificare questo tipo di testo senza nemmeno toccarloServer SQL. La parte principale di cui ho bisogno per essere 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 per tradurre questa codifica senza utilizzare SQL Server? È possibile? Prenderò il codice VB.NET poiché ho familiarità anche con quello.


Ok, sono sicuro che mi manchi qualcosa qui, quindi ecco dove mi trovo.

Poiché 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 di farlo ...

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

... e tutto ciò che ha fatto è stato restituire la stessa identica cosa che ho inserito poiché ha convertito ogni carattere in un byte.

Mi sono reso conto che devo analizzare manualmente ogni due caratteri in un byte poiché non conosco ancora alcun metodo che lo farà, quindi ora il mio piccolo decodificatore assomiglia a questo:

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 la prima coppia di coppie, ma poi il ciclo si ferma quando arriva alla coppia "4C" e dice che la stringa è nel formato errato.

È interessante notare che, quando passo attraverso il debugger e al metodo GetString sull'array di byte che sono stato in grado di analizzare fino a quel punto, ottengo ", - +" come risultato.

Come faccio a capire cosa mi manca? Devo fare un "cast diretto" per ogni byte invece di tentare di analizzarlo?

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

Tutte le risposte

Translate

Sono tornato al post di Michael, ho fatto un po 'di più e ho capito che avevo bisogno di fare una doppia conversione, e alla fine ho elaborato questa piccola pepita:

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

Da lì ho semplicemente fatto un ciclo per passare attraverso tutti i caratteri 2 per 2 e ottenerli "esadecimali" e poi tradotti in una stringa.

A Nick, ea chiunque altro interessato, sono andato avanti epubblicato la mia piccola domandaoltre dentroCodePlex. Sentiti libero di usare / modificare di cui hai bisogno.

fonte
Translate

Prova a rimuovere il file0xprima e poi chiamaEncoding.UTF8.GetString. Penso che possa funzionare.

Essenzialmente: 0x44004500

Rimuovi lo 0x, quindi sempre due byte sono un carattere:

44 00 = D

45 00 = E

6F 00 = o

72 00 = r

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

fonte