Decodarea T-SQL CAST în C # / VB.NET

voturi
48

Recent , site - ul nostru a fost invadat de resurgența botnet Asprox injecție SQL atac. Fără a intra în detalii, atacul încearcă să execute cod SQL prin codificarea T-SQL comenzi într - un șir de caractere ASCII codificat binar. Se pare ceva de genul:

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

Am fost capabil să decodeze acest lucru în SQL, dar am fost un pic abtine de la a face acest lucru, deoarece nu știam exact ce se întâmpla la momentul respectiv.

Am încercat să scrie un instrument simplu decoda, așa că am putea decoda acest tip de text , fără a atinge chiar SQL Server . Cea mai mare parte am nevoie de decodat este:

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

Am încercat toate comenzile următoare fără noroc:

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

Care este modul corect de a traduce aceasta codificare fără a utiliza SQL Server? Este posibil? O să iau cod VB.NET, deoarece eu sunt prea familiarizat cu asta.


Bine, eu sunt sigur că lipsește ceva aici, așa că aici e în cazul în care eu sunt la.

Din moment ce intrarea mea este un șir de caractere de bază, am început cu doar un fragment al porțiunii codificate - 4445434C41 (care se traduce prin DECLA) - și prima încercare a fost de a face acest lucru ...

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

... și tot ce a făcut a fost reveni exact același lucru pe care am pus în, deoarece fiecare caracter convertit în octet este.

Am dat seama că am nevoie pentru a analiza fiecare două caractere într-un octet manual, din moment ce eu nu știu de orice metode încă, care va face acest lucru, așa că acum micul meu decodor arata ceva de genul:

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

Lucrurile arata bine pentru primele două perechi, dar apoi bucla balks atunci când se ajunge la „4C“ pereche și spune că șirul este în format incorect.

Destul de interesant, atunci când am pas prin debugger și la metoda getString pe matrice octet pe care am fost în măsură să analizeze până la acel moment, am obține „- +“, ca rezultat.

Cum dau seama ce îmi lipsește - am nevoie pentru a face o „distribuție directă“ pentru fiecare octet în loc de a încerca să-l analiza?

Întrebat 01/08/2008 la 16:23
sursa de către utilizator
În alte limbi...                            


2 răspunsuri

voturi
20

Hazzah !!!!

M-am întors la postul lui Michael, a făcut unele mai multe poking și a dat seama că am nevoie pentru a face o conversie dublă, și în cele din urmă a lucrat în acest mic pepită:

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

De acolo am făcut pur și simplu o buclă pentru a trece prin toate caracterele 2 de 2 și de a lua pe ei „hexified“ și apoi tradus într-un șir de caractere.

Pentru Nick, și oricine altcineva interesat, am mers mai departe și a postat cererea mea puțin peste în CodePlex . Simțiți - vă liber pentru a utiliza / modifica după cum aveți nevoie.

Publicat 05/08/2008 la 18:02
sursa de către utilizator

voturi
7

Încercați să eliminați 0xprima și apoi apel Encoding.UTF8.GetString. Cred că pot lucra.

În esență: 0x44004500

Scoateți 0x, și apoi întotdeauna doi octeți sunt un caracter:

44 00 = D

45 00 = E

6F 00 = o

72 00 = r

Deci, este cu siguranță un format / UTF Unicode cu doi octeți / caractere.

Publicat 02/08/2008 la 02:38
sursa de către utilizator

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