2008-08-01 30 views
44

Gần đây, trang web của chúng tôi đã bị xóa bỏ với sự hồi sinh của cuộc tấn công Asprox botnetSQL injection. Nếu không đi vào chi tiết, cuộc tấn công sẽ cố gắng thực thi mã SQL bằng cách mã hóa các lệnh T-SQL trong một chuỗi BINARY được mã hóa ASCII. Nó trông giống như thế này:Giải mã T-SQL CAST trong C#/VB.NET

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

Tôi có thể giải mã trong SQL, nhưng tôi hơi cảnh giác khi làm điều này vì tôi không biết chính xác những gì đang diễn ra vào thời điểm đó.

Tôi đã cố gắng viết một công cụ giải mã đơn giản, vì vậy tôi có thể giải mã loại văn bản này mà không cần chạm vào SQL Server. Phần chính tôi cần giải mã là:

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

Tôi đã thử tất cả các lệnh sau đây không có may mắn:

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

cách thích hợp để dịch mã hóa này mà không sử dụng SQL Server là gì? Có thể không? Tôi sẽ lấy mã VB.NET vì tôi cũng quen với nó.


OK, tôi chắc chắn tôi đang thiếu thứ gì đó ở đây, vì vậy, đây là nơi tôi đang ở.

Kể từ khi đầu vào của tôi là một chuỗi cơ bản, tôi bắt đầu chỉ với một đoạn của phần mã hóa - 4445434C41 (mà dịch để DECLA) - và các nỗ lực đầu tiên là để làm điều này ...

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

. ..và tất cả những gì nó đã làm là trả lại chính xác thứ mà tôi đưa vào, vì nó chuyển đổi từng ký tự thành byte.

Tôi nhận ra rằng tôi cần phải phân tích từng hai nhân vật thành một byte bằng tay vì tôi không biết về bất kỳ phương pháp được nêu ra rằng sẽ làm điều đó, vì vậy bây giờ giải mã nhỏ của tôi trông giống như sau:

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

Mọi thứ trông tốt cho cặp đầu tiên của cặp, nhưng sau đó vòng lặp balks khi nó được đến cặp "4C" và nói rằng chuỗi có định dạng không chính xác.

Điều thú vị là khi tôi duyệt qua trình gỡ lỗi và phương thức GetString trên mảng byte mà tôi có thể phân tích đến điểm đó, tôi nhận được ", - +" là kết quả.

Làm cách nào để tìm ra những gì tôi bị thiếu - tôi có cần thực hiện "truyền trực tiếp" cho mỗi byte thay vì cố gắng phân tích cú pháp không?

+0

Xem câu trả lời của tôi tại đây: [http://stackoverflow.com/questions/32412/whats-the-best-way-of-cleaning-up-after-a-sql-injection#32422](http:// stackoverflow.com/questions/32412/whats-the-best-way-of-cleaning-up-after-a-sql-injection#32422) – SQLMenace

+0

Vâng, tôi chắc chắn sẽ bắt đầu bằng cách sử dụng các tham số SQL, nếu bạn chưa . – EndangeredMassa

+0

Tôi đã cố hết sức để thử và sắp xếp một số câu trả lời, tuy nhiên hầu hết trong số đó không phải là câu trả lời. Do đó, việc chuyển đổi các câu trả lời khác cho các nhận xét về câu trả lời không phải là không thể, vì vậy những câu trả lời đó đã được chuyển đổi thành nhận xét. Nếu tôi có bất cứ điều gì không chính xác, xin vui lòng cho tôi biết. –

Trả lời

18

Hazzah !!!!

tôi quay trở lại với bài của Michael, đã làm một số poking hơn và nhận ra rằng tôi đã cần phải làm một chuyển đổi kép, và cuối cùng làm việc ra nugget ít này:

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

Từ đó tôi chỉ đơn giản là tạo ra một vòng lặp để đi qua tất cả các ký tự 2 của 2 và nhận được chúng "hexified" và sau đó dịch sang một chuỗi.

Để Nick và bất kỳ ai quan tâm, tôi đã tiếp tục và posted my little application qua số CodePlex. Hãy sử dụng/sửa đổi khi bạn cần.

6

Thử xóa 0x trước rồi gọi Encoding.UTF8.GetString. Tôi nghĩ rằng có thể làm việc.

Về cơ bản: 0x44004500

Tháo 0x, và sau đó luôn là hai byte là một trong những nhân vật:

44 00 = D 

45 00 = E 

6F 00 = o 

72 00 = r 

Vì vậy, nó chắc chắn là một định dạng/UTF Unicode với hai byte/nhân vật.