Vă mulțumim pentru susținere

Decodarea TAST-ului CAST în C # / VB.NET

Recent, site-ul nostru a fost acoperit cu reînvierea Asprox botnet atac de atac SQL . Fără a intra în detalii, atacul încearcă să execute codul SQL prin codarea comenzilor T-SQL într-un șir BINARY codificat ASCII. Arata cam asa:

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

Am reușit să decodific acest lucru în SQL, dar am fost puțin precauți să fac acest lucru, deoarece nu știam exact ce se întâmpla în acel moment.

I tried to write a simple decode tool, so I could decode this type of text without even touching SQL Server. The main part I need decoded is:

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 modalitatea corectă de a traduce această codificare fără a utiliza SQL Server? Este posibil? Voi lua codul VB.NET de când sunt familiarizat și cu asta.


Bine, sunt sigură că-mi lipsește ceva aici, deci iată-mă unde sunt.

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

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

... și tot ceea ce a făcut a fost să returneze exact același lucru pe care l-am pus, din moment ce convertit fiecare personaj în este octet.

Mi-am dat seama că trebuie să analizez fiecare două caractere într-un octet manual, din moment ce nu cunosc nici o metodă care să facă asta, deci micul meu decodor arată așa:

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 perechi de perechi, dar atunci bucla se opreste cand ajunge la perechea "4C" si spune ca sirul este in format incorect.

În mod interesant, când trec prin metoda de depanare și metoda GetString pe matricea de octeți pe care am reușit să o analizez până la acel moment, obțin rezultatul ", - +".

Cum îmi dau seama ce lipsesc - trebuie să fac o "distribuție directă" pentru fiecare octet, în loc să încerc să îl analizez?

0
adăugat editat
Da, aș începe cu siguranță folosind parametrii SQL, dacă nu sunteți deja.
adăugat autor EndangeredMassa
Am făcut tot posibilul pentru a încerca să sortez câteva din "răspunsurile", cu toate acestea majoritatea dintre ele nu sunt pur și simplu răspunsuri. Prin urmare, conversia altor non-răspunsuri la comentarii cu privire la non-răspunsuri nu a fost posibilă, astfel încât acestea au fost convertite în comentarii. Dacă am ceva incorect, anunțați-mă.
adăugat autor Tim Post

2 răspunsuri

Hazzah !!!!

M-am întors la postul lui Michael, am mai făcut ceva și mi-am dat seama că trebuie să fac o dublă conversie și, în cele din urmă, mi-am dat seama de acest mic nugget:

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

De acolo am făcut o buclă pentru a trece prin toate personajele 2 pe 2 și le-am "hexificat" și apoi am tradus într-un șir.

Pentru Nick și pentru oricine altcineva interesat, am mers mai departe și am postat aplicația mea în CodePlex . Simțiți-vă libertatea de a utiliza / modifica după cum doriți.

0
adăugat

Încercați mai întâi să ștergeți 0x și apoi să apelați Encoding.UTF8.GetString . Cred că poate funcționa.

În esență: 0x44004500

Eliminaț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 Unicode / UTF cu doi octeți / caracter.

0
adăugat