Dekoding T-SQL CAST i C # / VB.NET

stemmer
51

Nylig vår side har blitt oversvømt med oppblomstringen av Asprox botnet SQL-injeksjon angrep. Uten å gå i detaljer, forsøker angrep for å utføre SQL-kode ved å kode de T-SQL- kommandoer i en ASCII-kodet binær streng. Det ser omtrent slik ut:

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

Jeg var i stand til å dekode dette i SQL, men jeg var litt skeptisk til å gjøre dette siden jeg visste ikke nøyaktig hva som skjedde på den tiden.

Jeg prøvde å skrive en enkel dekode verktøy, slik at jeg kunne dekode denne type tekst uten engang å berøre SQL Server . Den viktigste delen jeg trenger dekodet er:

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

Jeg har prøvd alt av følgende kommandoer uten hell:

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

Hva er den riktige måten å oversette denne kodingen uten å bruke SQL Server? Er det mulig? Jeg tar VB.NET kode siden jeg er kjent med det også.


Ok, jeg er sikker på at jeg mangler noe her, så her er der jeg er på.

Siden min inngang er en grunnleggende streng, begynte jeg med bare en bit av den kodede del - 4445434C41 (som kan oversettes til DECLA) - og det første forsøket var å gjøre dette ...

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

... og alt det gjorde var tilbake akkurat det samme som jeg satt i, siden det omgjort hvert tegn til er byte.

Jeg innså at jeg trenger å analysere hver to tegn i en byte manuelt siden jeg ikke vet om noen metoder ennå som vil gjøre det, så nå er min lille dekoder ser omtrent slik ut:

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

Ting ser bra for de første par par, men da løkken balks når det kommer til 4C par og sier at strengen er i feil format.

Interessant nok, når jeg går gjennom debugger og til GetString metoden på byte array at jeg var i stand til å analysere opp til det punktet, får jeg - + som resultat.

Hvordan kan jeg finne ut hva jeg mangler - trenger jeg å gjøre en direkte cast for hver byte i stedet for å forsøke å analysere den?

Publisert på 01/08/2008 klokken 15:23
kilden bruker
På andre språk...                            


2 svar

stemmer
20

Hazzah !!!!

Jeg gikk tilbake til Michael innlegg, gjorde noen mer poking og innså at jeg trengte å gjøre en dobbel konvertering, og til slutt jobbet ut denne lille nugget:

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

Fra der jeg rett og slett gjort en sløyfe for å gå gjennom alle tegnene 2 av 2 og få dem "hexified" og deretter oversatt til en streng.

Til Nick, og noen andre er interessert, jeg gikk videre og lagt min lille programmet i løpet av i CodePlex . Føl deg fri til å bruke / endre som du trenger.

Svarte 05/08/2008 kl. 17:02
kilden bruker

stemmer
8

Prøv å fjerne den 0xførst og deretter ringe Encoding.UTF8.GetString. Jeg tror det kan fungere.

Hovedsak: 0x44004500

Fjern 0x, og da alltid to bytes er ett tegn:

44 00 = D

45 00 = E

6F 00 = o

72 00 = r

Så det er definitivt en Unicode / UTF-format med to bytes / karakter.

Svarte 02/08/2008 kl. 01:38
kilden bruker

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