SQL注入后清理的最佳方法是什么?

时间:2020-03-05 18:44:25  来源:igfitidea点击:

我的任务是维护一个非营利性网站,该网站最近遭受了SQL注入攻击。有人利用站点上的表单将文本添加到数据库中每个可用的类似文本的字段(varchar,nvarchar等)中,当将其呈现为HTML时,该字段将包含并执行JavaScript文件。

Google对URL的搜索表明它来自罗马尼亚或者中国以外的垃圾邮件发送者,但是现在这并不重要。

我仔细检查并手动从显示在网站上最可见和最受欢迎的页面上的文本字段中删除了信息,但我很好奇从站点上其他文本字段中删除文本的最佳编程方式是什么。

显然,还有更多的工作要做(针对SQL注入强化站点,使用markdown代替存储HTML等),我正在努力解决这些问题,但是暂时我真正需要的是一种很好的方法并以编程方式删除注入的文本。我知道确切的文本是什么,每次都是相同的,并且总是添加到任何文本字段的末尾。目前,我无法删除数据库中的所有HTML,而且我不知道何时确切发生这种情况,因此我无法回滚到备份。另外,该站点位于共享主机上,我无法使用SQL Server工具直接连接到数据库。我可以对它执行查询,因此,如果有任何一种构造SQL更新语句的方式来达到"嘿,找到整个数据库中所有表中的所有文本字段并执行此操作以清除它们"的效果,最好。

解决方案

回答

从最近的备份中还原数据。

回答

这将扭转这种情况,明智的做法是将sysobject权限从网站运行时使用的用户名中夺走,当然还要清理输入内容

DECLARE @T VARCHAR(255),@C VARCHAR(4000) 
DECLARE Table_Cursor CURSOR FOR 
SELECT  a.name,b.name FROM sysobjects a,syscolumns b WHERE a.id=b.id and a.xtype='u' and
(b.xtype=99 or b.xtype=35 or b.xtype=231 or b.xtype=167) 
OPEN Table_Cursor 
FETCH NEXT FROM  Table_Cursor INTO @T,@C 
WHILE(@@FETCH_STATUS=0) 
BEGIN 
EXEC('if exists (select 1 from ['+@T+'] where ['+@C+']  like ''%"></title><script src="http://1.verynx.cn/w.js"></script><!--'') begin print ''update ['+@T+'] set ['+@C+']=replace(['+@C+'],''''"></title><script src="http://1.verynx.cn/w.js"></script><!--'''','''''''') where ['+@C+']  like ''''%"></title><script src="http://1.verynx.cn/w.js"></script><!--'''''' end')
FETCH NEXT FROM Table_Cursor INTO @T,@C 
END 
CLOSE Table_Cursor 
DEALLOCATE Table_Cursor

我之前在这里写过:Microsoft已经发布了解决SQL注入攻击的工具

回答

假设我们已成为与其他所有人一样的攻击的受害者,那么SQLMenace的代码已经结束。但是,该攻击使用了许多不同的脚本URL,因此我们必须对其进行自定义,以确保它与我们在数据库中看到的URL匹配。

我也撰写了有关它的文章,而我的解决方案代码包括了更通用的清理工作。

重要的一点是,我们要做的第一件事就是关闭该站点。目前,我们正在向用户积极提供恶意软件,这可能会使我们日后受到法律制裁。放置一个占位符页面,以使用户不会陷入黑暗,但不要继续提供恶意软件。然后,我们可以修复该站点,以确保它不再容易受到注入攻击。对这种特定攻击执行此操作的最简单方法是,仅对Web用户禁用sysobjects / syscolumns权限,但是我们也希望通过清理进行更多操作,否则直到再次遭到破解只是时间问题。然后,我们可以使用提供的代码来清理站点并将其恢复活动。

回答

我是受害者,你可以用它来清理

UPDATE Table 
SET TextField = SUBSTRING(TextField, 1, CHARINDEX('</title', TextField) - 1)
WHERE (ID IN (SELECT ID FROM Table WHERE (CHARINDEX('</title', Textfield, 1) > 0)))