C Kod Çözme T-SQL CAST # / VB.NET

oy
48

Son zamanlarda sitemiz yeniden canlanışı ile deluged edilmiştir Asprox botnet SQL enjeksiyon saldırısı. Fazla ayrıntıya girmeden, saldırı kodlayarak SQL kod çalıştırmasına dener T-SQL bir ASCII kodlanmış İKİLİ dizede komutları. Bu şuna benzer:

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

SQL'de bunudeşifre başardı, ama o anda olup bittiğini tam olarak bilmiyordum I beri bu işi biraz ihtiyatlı oldu.

Ben basit bir kod çözme aracı yazmaya çalıştım, bu yüzden bile dokunmadan metnin bu tür deşifre olabilir SQL Server . Ben deşifre gerek ana parçasıdır:

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

Hayır şans ile aşağıdaki komutları tüm denedim:

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

SQL Server kullanmadan bu kodlamayı çevirmek için uygun yolu nedir? Mümkün mü? Ben de o aşina olduğum beri VB.NET kodu alacağım.


Tamam, Nerede olduğumu yüzden burada, ben burada bir şey eksik eminim.

(DECLA anlamına gelir) 4445434C41 - - benim giriş temel bir dize olduğundan, kodlanmış kısmının sadece pasajı ile başladı ve ilk girişim bunu idi ...

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

... ve bayt yaptım o içine her bir karakteri dönüştürülmüş beri, ben koymak aynı şeyi iade oldu hepsi bu.

Ben şimdi benim küçük dekoder şuna benzer, yani yapacak henüz yöntemlerden bilmiyorum elle beri bayt içine her iki karakter ayrıştırmak gerektiğini fark etti:

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

Yapılacaklar çiftlerinin ilk çift için iyi görünüyorsun, ama o 4C çiftine alır ve dize yanlış formatta olduğunu söylediğinde sonra döngü ana kirişler.

Ben ayıklayıcıya içinden ve ben o noktaya kadar ayrıştırmak başardı bayt dizisinde GetString yöntemine adım zaman İlginçtir ki, ben olsun - + sonuç olarak.

Nasıl özlüyorum anlamaya do - Onun yerine bunu ayrıştırmak için çalışmakla her byte için bir doğrudan döküm yapmama gerek var mı?

Oluştur 01/08/2008 saat 16:23
kaynak kullanıcı
Diğer dillerde...                            


2 cevaplar

oy
20

Hazzah !!!!

Ben, Michael mesaja geri döndü biraz daha dürtme yaptım ve bir çift çevrim yapmak gerekir fark etti ve sonunda bu küçük külçe çalıştı:

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

Oradan sadece 2 2 oranında tüm karakterlere geçmesi ve onları "hexified" ve ardından bir dizeye tercüme almak için bir döngü yaptı.

Nick ve herkesten ilgi için, ben devam ettim ve benim küçük uygulamayı yayınlanmıştır içinde üzerinde Codeplex . İhtiyacınız olarak değiştirme / kullanmak için çekinmeyin.

Cevap 05/08/2008 saat 18:02
kaynak kullanıcı

oy
7

Kaldırmayı deneyin 0xbirinci ve sonra diyoruz Encoding.UTF8.GetString. Ben bu işe düşünüyorum.

Esasen: 0x44004500

0x çıkarın ve sonra her zaman iki bayt bir karakter şunlardır:

44 00 = D

45 00 = E

6F 00 = o

72 00 = r

Yani kesinlikle iki bayt / karakteri ile Unicode / UTF biçimdir.

Cevap 02/08/2008 saat 02:38
kaynak kullanıcı

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