Dekódování T-SQL CAST v C # / VB.NET

hlasů
48

V poslední době náš web byl zaplaven s obrodě Asprox botnet SQL injection útoku. Aniž bychom se pouštěli do podrobností, že útok se pokusí spustit kód SQL zakódováním T-SQL příkazy v ASCII zakódovaný binární řetězec. Vypadá to nějak takto:

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

Byl jsem schopen dekódovat to v SQL, ale byl jsem trochu opatrný, jak to udělat, protože jsem nevěděl, co se děje v té době.

Snažil jsem se napsat jednoduchý dekódování nástroje, takže jsem mohl dekódovat tento typ textu, aniž byste se dotkli SQL Server . Hlavní část I potřebovat dekódují je:

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

Vyzkoušel jsem všechny tyto příkazy bez úspěchu:

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

Jaký je správný způsob, jak převést toto kódování bez použití SQL Server? Je to možné? Vezmu VB.NET kód, protože jsem obeznámen s tím taky.


Dobře, jsem si jistý, že mi chybí něco tady, tak tady je místo, kde jsem na.

Vzhledem k tomu, můj vstup je základní řetězec, začal jsem se jen úryvek kódovaného části - 4445434C41 (což znamená DECLA) - a první pokus byl, jak to udělat ...

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

... a vše, co udělal, bylo vrátit se přesně to samé, že jsem dal, protože se převede každý znak do je byte.

Uvědomil jsem si, že musím rozebrat každé dva znaky do bajtu ručně, protože nevím, přesto jakýmkoliv způsobem, který bude dělat to, takže teď můj malý dekodér vypadá asi takto:

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

Věci vypadat dobře pro první pár párů, ale pak se smyčka hranoly, když se dostane do „4C“ páru a říká, že řetězec je v nesprávném formátu.

Je zajímavé, že když jsem krok přes ladicí a způsobu GetString o bytového pole, které jsem byl schopen analyzovat až do tohoto bodu, mám, „- +“ jako výsledek.

Jak mohu zjistit, co mi chybí - musím udělat, „přímé obsazení“ pro každý bajt namísto pokusu o analyzovat?

Položena 01/08/2008 v 16:23
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
20

Hazzah !!!!

Vrátil jsem se do sloupku Michaelova, dělal něco víc rýpání a uvědomil si, že jsem si je třeba udělat dvojité konverze, a nakonec se vypracoval tuto malou valoun:

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

Odtamtud jsem prostě udělal smyčku projít všemi znaky 2 o 2 a dostat je „hexified“ a pak převedena na řetězec.

Nickovi, a někdo jiný zájem, jsem šel dopředu a zaslali svou malou aplikaci přes v CodePlex . Užívejte / upravit podle potřeby.

Odpovězeno 05/08/2008 v 18:02
zdroj uživatelem

hlasů
7

Zkuste odstranění 0xprvní a pak zavolat Encoding.UTF8.GetString. Myslím, že to může fungovat.

V podstatě: 0x44004500

Odstraňte 0x, a pak se vždy dva bajty jsou jeden znak:

44 00 = D

45 00 = E

6F 00 = o

72 00 = r

Takže je to určitě Unicode / UTF formát se dvěma bajty / znak.

Odpovězeno 02/08/2008 v 02:38
zdroj uživatelem

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