Decoding T-SQL CAST in C # / VB.NET

stemmen
48

Onlangs is onze site is overspoeld met de heropleving van de ASPROX botnet SQL-injectie aanval. Zonder in detail, de aanval probeert SQL code uit te voeren door het coderen van de T-SQL commando's in een ASCII-gecodeerde binaire string. Het ziet er ongeveer zo uit:

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

Ik was in staat om deze te decoderen in SQL, maar ik was een beetje huiverig om dit te doen, omdat ik wist niet precies wat er gebeurde op het moment.

Ik heb geprobeerd om een eenvoudige decoderen hulpmiddel te schrijven, dus ik kon dit soort tekst decoderen zonder zelfs maar aan te raken SQL Server . Het grootste deel Ik hoef gedecodeerd is:

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

Ik heb al van de volgende opdrachten zonder geluk geprobeerd:

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 de juiste manier om dit te coderen zonder gebruik van SQL Server vertalen? Is dit mogelijk? Ik zal VB.NET code te nemen, omdat ik ben bekend met dat ook.


Oke, ik weet zeker dat ik hier iets ontbreekt, dus hier is waar ik ben op.

Aangezien mijn inbreng is een fundamentele snaar, ik begon met slechts een fragment van het gecodeerde deel - 4445434C41 (wat neerkomt op Decla) - en de eerste poging was om dit te doen ...

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

... en al was het wel weer precies hetzelfde als wat ik in, omdat het elk karakter omgezet in is byte.

Ik realiseerde me dat ik moet elke twee karakters te ontleden in een byte met de hand, omdat ik niet weet van nog geen methoden die doet dat, dus nu mijn kleine decoder ziet er als volgt uit:

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

Het ziet er goed voor de eerste paar paren, maar dan is de lus verhindert wanneer het aan de 4C pair en zegt dat de string is in het verkeerde formaat.

Interessant genoeg, toen ik stap door de debugger en de GetString methode op de bytearray dat ik was in staat om te ontleden op dat punt, krijg ik - + als resultaat.

Hoe kan ik erachter te komen wat ik mis - heb ik nodig om een ​​direct cast te doen voor elke byte in plaats van een poging om het te ontleden?

De vraag is gesteld op 01/08/2008 om 16:23
bron van user
In andere talen...                            


2 antwoorden

stemmen
20

Hazzah !!!!

Ik ging terug naar Michael's post, deed wat meer prikken en besefte dat ik nodig had om een ​​dubbele conversie te doen, en uiteindelijk werkte deze mooie uitsmijter:

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

Van daaruit maakte ik gewoon een lus te gaan door alle tekens 2 bij 2 en krijgen ze "hexified" en vervolgens vertaald naar een string.

Nick, en iemand anders geïnteresseerd, ging ik door en postte mijn kleine applicatie dan in CodePlex . Voel je vrij om te gebruiken / wijzigen als u wilt.

antwoordde op 05/08/2008 om 18:02
bron van user

stemmen
7

Probeer het verwijderen van de 0xeerste en dan bellen Encoding.UTF8.GetString. Ik denk dat kan werken.

In wezen: 0x44004500

Verwijder de 0x, en dan altijd twee bytes zijn één teken:

44 00 = D

45 00 = E

6F 00 = o

72 00 = r

Dus het is zeker een Unicode / UTF-formaat met twee bytes / karakter.

antwoordde op 02/08/2008 om 02:38
bron van user

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