Vra

Onlangs is ons webwerf oorstroom met die herlewing van die Asprox botnet SQL-inspuiting aanval.Sonder om in besonderhede in te gaan, poog die aanval om SQL-kode uit te voer deur die T-SQL opdragte in 'n ASCII-gekodeerde BINÊRE string.Dit lyk so iets:

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

Ek kon dit in SQL dekodeer, maar ek was 'n bietjie versigtig om dit te doen, aangesien ek nie presies geweet het wat op daardie stadium gebeur het nie.

Ek het probeer om 'n eenvoudige dekodeerinstrument te skryf, sodat ek hierdie tipe teks kon dekodeer sonder om eers aan te raak SQL bediener.Die hoofdeel wat ek gedekodeer moet word, is:

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

Ek het al die volgende opdragte probeer sonder sukses:

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

Wat is die regte manier om hierdie enkodering te vertaal sonder om SQL Server te gebruik?Is dit moontlik?Ek sal VB.NET-kode neem aangesien ek ook daarmee vertroud is.


Goed, ek is seker ek mis iets hier, so hier is waar ek is.

Aangesien my invoer 'n basiese string is, het ek begin met net 'n stukkie van die geënkodeerde gedeelte - 4445434C41 (wat vertaal word na DECLA) - en die eerste poging was om dit te doen ...

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

...en al wat dit gedoen het, was om presies dieselfde ding terug te gee wat ek ingesit het, aangesien dit elke karakter in 'n greep omgeskakel het.

Ek het besef dat ek elke twee karakters handmatig in 'n greep moet ontleed, aangesien ek nog nie van enige metodes weet wat dit sal doen nie, so nou lyk my klein dekodeerder so:

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

Dinge lyk goed vir die eerste paar pare, maar dan wankel die lus wanneer dit by die "4C"-paar kom en sê dat die string in die verkeerde formaat is.

Interessant genoeg, wanneer ek deur die ontfouter stap en na die GetString-metode op die byte-skikking wat ek tot op daardie punt kon ontleed, kry ek ",-+" as die resultaat.

Hoe vind ek uit wat ek mis - moet ek 'n "direct cast" vir elke greep doen in plaas daarvan om dit te probeer ontleed?

Was dit nuttig?

Oplossing

Ek het teruggegaan na Michael se plasing, nog 'n bietjie gepik en besef dat ek 'n dubbele omskakeling moes doen, en uiteindelik hierdie klein nuggetjie uitgewerk:

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

Van daar af het ek eenvoudig 'n lus gemaak om al die karakters 2 by 2 deur te gaan en hulle "hexified" te kry en dan na 'n string vertaal.

Vir Nick, en enigiemand anders wat belangstel, het ek voortgegaan en het my klein aansoek geplaas oor in CodePlex.Voel vry om te gebruik / wysig soos jy nodig het.

Ander wenke

Probeer om die 0x eers en dan bel Encoding.UTF8.GetString.Ek dink dit kan werk.

In wese:0x44004500

Verwyder die 0x, en dan is altyd twee grepe een karakter:

44 00 = D

45 00 = E

6F 00 = o

72 00 = r

Dit is dus beslis 'n Unicode/UTF-formaat met twee grepe/karakter.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top