Dekódolás T-SQL CAST C # / VB.NET

szavazat
48

Legutóbb a honlapunkon már elárasztotta a újjáéledése a Asprox botnet SQL injekciós támadás. Anélkül, hogy részletesen, a támadás megkísérli végrehajtani SQL kódot kódoló T-SQL parancsokat ASCII kódolású bináris sztring. Ez valahogy így néz ki:

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

Voltam képes dekódolni ezt az SQL, de én egy kicsit óvatos ezt, mert én nem tudom, hogy mi történik abban az időben.

Próbáltam írni egy egyszerű dekódolni eszköz, így tudtam dekódolni az ilyen típusú szöveg nélkül is megható SQL Server . A fő rész Szükségem van dekódolva:

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

Megpróbáltam az összes alábbi parancsok nem szerencse:

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

Mi a helyes módja annak, hogy lefordítani ezt kódoló használata nélkül SQL Server? Lehetséges? Elviszem VB.NET kód óta vagyok tisztában, hogy túl.


Oké, biztos vagyok benne, én valami hiányzik itt, így itt, ahol vagyok.

Mivel a bemenet egy alap szöveg, elkezdtem csak egy részlet a kódolt rész - 4445434C41 (mely a DECLA) - és az első kísérlet az volt, hogy ezt ...

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

... és minden tette volt visszaút pontosan ugyanaz a dolog, hogy tettem, hiszen konvertált karaktert byte.

Rájöttem, hogy kell elemezni minden két karakter egy byte kézzel, mert én nem tudom, olyan módszereket, ugyanakkor, hogy meg fog tenni, hogy így most az én kis dekóder valahogy így néz ki:

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

A dolgok jól néz ki az első néhány pár, de aztán a hurok féken amikor megkapja a „4C” párt, és azt mondja, hogy a húr nem megfelelő formátumú.

Érdekes módon, amikor lépek át a hibakereső és a getString módszer a byte tömb, hogy képes voltam feldolgozni addig a pontig, kapok „- +”, mint az eredmény.

Hogyan kitalálni, hogy mi vagyok, hiányzik - kell tenni a „közvetlen öntött” az egyes byte helyett megpróbálja feldolgozni ez?

A kérdést 01/08/2008 16:23
a forrás felhasználó
Más nyelveken...                            


2 válasz

szavazat
20

Hazzah !!!!

Visszamentem Michael bejegyzést tett néhány dugta, és rájöttem, hogy nem kell tennie kettős konverziós, végül dolgozott ki ezt a kis aranyrög:

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

Onnan csak tett egy hurkot, hogy menjen végig a karaktereket 2 x 2 és kérni őket, „hexified”, majd lefordítva egy string.

Nick, és bárki mást érdekel, mentem előre, és írt a kis alkalmazás át CodePlex . Nyugodtan használja / módosítani, ahogy kell.

Válaszolt 05/08/2008 18:02
a forrás felhasználó

szavazat
7

Próbálja meg eltávolítani az 0xelső, majd hívja Encoding.UTF8.GetString. Úgy gondolom, hogy működhet.

Lényegében: 0x44004500

Távolítsuk el a 0x, majd mindig két bájt egy karaktert:

44 00 = D

45 00 = E

6F 00 = o

72 00 = r

Tehát ez mindenképpen egy Unicode / UTF formátumban két bájt / karakter.

Válaszolt 02/08/2008 02:38
a forrás felhasználó

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