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

Posted

技术标签:

【中文标题】SQL 注入后清理的最佳方法是啥?【英文标题】:What's the best way of cleaning up after a SQL Injection?SQL 注入后清理的最佳方法是什么? 【发布时间】:2010-09-07 03:21:49 【问题描述】:

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

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

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

显然还有更多工作要做(加强网站以防止 SQL 注入,使用 markdown 之类的东西而不是存储 HTML 等),我正在努力解决这些问题,但目前我真正需要的是一个好方法进入并以编程方式删除注入的文本。我知道确切的文本是什么,每次都是一样的,而且它总是附加到任何文本字段的末尾。我现在无法删除数据库中的所有 HTML,而且我不知道这到底是什么时候发生的,所以我不能只是回滚到备份。此外,该站点位于共享主机上,我无法使用 SQL Server 工具直接连接到数据库。不过,我可以对它执行查询,所以如果有任何方法可以构建一个 SQL 更新语句,以达到“嘿,找到整个数据库中所有表中的所有文本字段并这样做来清理它们”的效果,那将是最好的。

【问题讨论】:

【参考方案1】:

从最近的备份中恢复数据。

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

假设你和其他人一样成为同样攻击的受害者,那么 SQLMenace 的代码就很接近了。但是,该攻击使用了许多不同的脚本 url,因此您必须对其进行自定义以确保它与您在数据库中看到的 url 匹配。

I wrote about it as well,我的解决方案代码包括更通用的清理。

重要的一点是,您需要做的第一件事就是关闭网站。现在,您正在积极地向您的用户提供恶意软件,这可能会让您在以后进行法律修复。放置一个占位符页面,这样您的用户就不会被蒙在鼓里,但也不要继续提供恶意软件。然后,您可以修复该站点以确保它不再容易受到注入攻击。 对于这种特定攻击,最简单的方法是为您的 Web 用户禁用 sysobjects/syscolumns 权限,但您还需要通过清理来进行更多操作,否则这只是时间问题直到你再次被破解。然后,您可以使用提供的代码来清理网站并将其重新上线。

【讨论】:

“我也写过”链接(jcoehoorn.vox.com/library/post/sql-injection-part-2.html) 被重定向到显示“Vox 现已关闭。感谢您多年来对 Vox 的喜爱和支持”的网页【参考方案4】:

这将扭转这种情况,明智的做法是从您的站点运行的用户名中获取 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 Has Released Tools To Address SQL Injection Attacks

【讨论】:

以上是关于SQL 注入后清理的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

PHP中内存清理的最佳方法是啥? (5.2)

使用 Wordpress,有人可以告诉我清理输入的最佳方法吗?

为 Power BI 分页报表清理数据的最佳方法是啥?

PHP PDO 清理用户输入

清理请求以防止 SQL 注入攻击

使用存储过程可以防止 SQL 注入/XSXX 攻击吗?