DISABILITARE ADBLOCK

ADBlock sta bloccando alcuni contenuti del sito

ADBlock errore
risultati trovati: 

DOMANDA

Di recente il nostro sito è stato sommerso dalla rinascita della Botnet Asprox attacco SQL . Senza entrare nei dettagli, l'attacco tenta di eseguire il codice SQL codificando il T-SQL comandi in una stringa BINARY codificata ASCII. Sembra qualcosa del genere:

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 nel farlo poiché non sapevo esattamente cosa stesse succedendo in quel momento.

Ho provato a scrivere un semplice strumento di decodifica, quindi ho potuto decodificare questo tipo di testo senza nemmeno toccare SQL & nbsp ; Server . 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 di tradurre questa codifica senza usare SQL Server? È possibile? Prenderò il codice VB.NET poiché lo conosco anch'io.


Okay, sono sicuro che mi manca qualcosa qui, quindi ecco dove sono.

Dato 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 restituire esattamente la stessa cosa che ho inserito poiché ha convertito ogni carattere in un byte.

Mi sono reso conto che ho bisogno di analizzare ogni due caratteri in un byte manualmente poiché non conosco ancora alcun metodo che lo farà, quindi ora il mio piccolo decodificatore è simile al seguente:

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 loop si interrompe quando arriva al "4C" coppia 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 stato in grado di analizzare fino a quel punto, ottengo ", - + + quot; di conseguenza.

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

SOLUZIONE

Sono tornato al post di Michael, ho fatto qualche altra ricerca e mi sono reso conto che avevo bisogno di fare una doppia conversione, e alla fine ho risolto questo piccolo pepita:

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

Da lì ho semplicemente fatto un ciclo per esaminare tutti i personaggi 2 per 2 e farli "esadecimare" e quindi tradotto in una stringa.

Per Nick, e chiunque altro interessato, sono andato avanti e ha pubblicato la mia piccola domanda sopra in < a href = "http://en.wikipedia.org/wiki/CodePlex" rel = "nofollow noreferrer"> CodePlex . Sentiti libero di usare / modificare di cui hai bisogno.

Se ti va lasciaci una tua opinione

L'articolo ti è stato utile ed è tradotto correttamente?

ALTRI SUGGERIMENTI

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

Essenzialmente: 0x44004500

Rimuovi lo 0x e 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.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow