Domanda

Recentemente il nostro sito è stato inondato dalla rinascita del Botnet Asprox SQL Injection attacco.Senza entrare nei dettagli, l'attacco tenta di eseguire codice SQL codificando il file T-SQL comandi in una stringa BINARIA codificata ASCII.Sembra qualcosa del genere:

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

Sono riuscito a decodificarlo in SQL, ma ero un po' cauto 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 toccarlo Server SQL.La parte principale che devo decodificare è:

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 manca qualcosa qui, quindi ecco dove mi trovo.

Dato che il mio input è una stringa di base, ho iniziato con solo un frammento della porzione codificata - 4445434C41 (che si traduce in DECLA) - e il primo tentativo è stato quello...

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

...e tutto ciò che ha fatto è stato restituire esattamente la stessa 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 faccia, 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 le prime coppie di coppie, ma poi il ciclo si blocca quando arriva alla coppia "4C" e dice che la stringa è nel formato errato.

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

Come faccio a capire cosa mi manca: devo eseguire un "cast diretto" per ogni byte invece di tentare di analizzarlo?

È stato utile?

Soluzione

Sono tornato al post di Michael, ho fatto qualche ulteriore ricerca e ho capito che avevo bisogno di fare una doppia conversione, e alla fine ho risolto questo piccolo dettaglio:

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

Da lì ho semplicemente creato un ciclo per esaminare tutti i caratteri 2 per 2 e ottenerli "esacificati" e quindi tradotti in una stringa.

A Nick, e a chiunque altro fosse interessato, sono andato avanti e ho pubblicato la mia piccola domanda dentro CodePlex.Sentiti libero di utilizzare/modificare secondo le tue necessità.

Altri suggerimenti

Prova a rimuovere il 0x prima e poi chiama Encoding.UTF8.GetString.Penso che potrebbe funzionare.

Essenzialmente:0x44004500

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

44 00 = D

45 00 = E

6F 00 = o

72 00 = r

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top