Dekodowanie T-SQL CAST w C # / VB.NET

głosy
48

Ostatnio nasza witryna została zalewany odrodzenia do botnetu Asprox SQL Injection ataku. Bez wchodzenia w szczegóły, atak próbuje wykonać kodu SQL przez kodujący T-SQL poleceń w ASCII zakodowany ciąg binarny. Wygląda to mniej więcej tak:

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

Udało mi się rozszyfrować to w SQL, ale byłem trochę nieufny w ten sposób, ponieważ nie wiedziałem dokładnie, co się dzieje w danej chwili.

Starałem się napisać proste narzędzie do dekodowania, więc mogę rozszyfrować tego typu tekst nawet bez dotykania SQL Server . Główną część I muszą dekodowany jest:

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

Próbowałem wszystkich poniższych poleceń bez powodzenia:

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

Co to jest właściwy sposób przetłumaczyć tego kodowania bez używania SQL Server? Czy to możliwe? Wezmę kod VB.NET ponieważ jestem zaznajomiony z tym też.


Ok, jestem pewien, że jestem brakuje czegoś tutaj, więc tutaj gdzie jestem.

Ponieważ mój wkład jest podstawowy ciąg zacząłem tylko z fragmentu kodowanego części - 4445434C41 (co przekłada się na DECLA) - i pierwsza próba była to zrobić ...

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

... a wszystko to nie było powrócić dokładnie to samo, że mogę umieścić w, ponieważ każdy znak przekształcany jest na bajt.

Zdałem sobie sprawę, że muszę analizować każde dwa znaki na bajt ręcznie, ponieważ nie wiem jeszcze do żadnej metody, która będzie robić, więc teraz moja mała dekoder wygląda mniej więcej tak:

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

Wszystko wygląda dobrze przez pierwsze kilka par, ale wtedy pętla balks gdy dojdzie do „4C” pary i mówi, że ciąg jest w nieprawidłowym formacie.

Co ciekawe, kiedy przejść przez debugger i metody getString na tablicy bajtów, które udało mi się analizować aż do tego punktu, mam „- +” jako wynik.

Jak mogę dowiedzieć się, co mi brakuje - muszę zrobić „bezpośredni obsady” dla każdego bajta zamiast próbować je analizować?

Utwórz 01/08/2008 o 16:23
źródło użytkownik
W innych językach...                            


2 odpowiedzi

głosy
20

Hazzah !!!!

Wróciłem do wątku Michaela, zrobił kilka poking i uświadomiłem sobie, że musiał zrobić podwójną konwersję i ostatecznie wypracowane ten mały samorodek:

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

Stamtąd po prostu zrobił pętlę, aby przejść przez wszystkie znaki 2 przez 2 i uzyskać je „hexified”, a następnie przetłumaczone na sznurku.

Nick, a ktoś inny zainteresowany, poszedł do przodu i pisał moją małą aplikację w ciągu w CodePlex . Zapraszamy do korzystania z / modyfikować, jak trzeba.

Odpowiedział 05/08/2008 o 18:02
źródło użytkownik

głosy
7

Spróbuj usunąć 0x, a następnie zadzwonić Encoding.UTF8.GetString. Myślę, że może pracować.

Zasadniczo: 0x44004500

Wyjąć 0x, a następnie dwa bajty są zawsze o jeden znak:

44 00 = D

45 00 = E

6F 00 = o

72 00 = r

Więc to zdecydowanie Format / Unicode UTF dwa bajty / charakteru.

Odpowiedział 02/08/2008 o 02:38
źródło użytkownik

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