SQL注入攻击后更新所有SQL Server列

时间:2013-01-17 19:37:01

标签: sql sql-server sql-injection

我收到通知说我们公司网站遇到了问题,很快我就发现它有SQL注入攻击。我不管理网站,也无法访问这些文件(并知道将来如何防止这种情况),但我目前的任务是清理数据库。似乎在Microsoft SQL Server数据库中几乎所有varchar列都附加了HTML。

在简单查询或函数中是否有任何方法可以运行以检查违规HTML的所有列并更新所有表中的列?

例如,列为:

---------------------------
|Title
---------------------------
|product1

现在是

---------------------------
|Title
---------------------------
|product1</title><style>.atpd{position:absolute;clip:rect(400px,auto,auto,400px);}</style><div class=atpd>Apply here <a href=http://abbypaydayloansonline.com >online payday loans</a></div>

提前致谢。

2 个答案:

答案 0 :(得分:2)

这是一个选项,假设有问题的文字始终以</title>开头,</title>自然不会出现在数据中。

UPDATE dbo.table_name
  SET Title = LEFT(Title, CHARINDEX('</title>', Title)-1)
  WHERE Title LIKE '%</title>%'
  AND Title LIKE '%abbypaydayloansonline.com%';

如果您需要针对多个表中的多个列执行此操作(假设再次出现</title>并且</title>在事件发生前数据中自然不会出现DECLARE @sql NVARCHAR(MAX); SET @sql = N''; SELECT @sql = @sql + N'UPDATE ' + QUOTENAME(OBJECT_SCHEMA_NAME([object_id])) + '.' + QUOTENAME(OBJECT_NAME([object_id])) + ' SET ' + QUOTENAME(name) + ' = LEFT(' + QUOTENAME(name) + ', CHARINDEX(''</title>'', ' + QUOTENAME(name) + ')-1) WHERE ' + QUOTENAME(name) + ' LIKE ''%</title>%'' AND ' + QUOTENAME(name) + ' LIKE ''%abbypaydayloansonline.com%''' + ';' + CHAR(13) + CHAR(10) FROM sys.columns WHERE OBJECTPROPERTY([object_id], 'IsMsShipped') = 0 AND system_type_id IN (35,99,167,175,231,239,231); SELECT @sql; -- EXEC sp_executesql @sql; ,则不要#39; t需要一个显式游标:

SELECT [table] = QUOTENAME(OBJECT_SCHEMA_NAME([object_id]))
         + '.' + QUOTENAME(OBJECT_NAME([object_id])),
      [column] = name
FROM sys.columns
WHERE OBJECTPROPERTY([object_id], 'IsMsShipped') = 0
AND system_type_id IN (35,99,167,175,231,239,231)
ORDER BY [table], [column];

在运行之前绝对检查输出。请注意,Management Studio仅显示将要执行的实际命令的一小部分,因此您可能还希望运行此查询以查看将要检查的所有表和列:

{{1}}

答案 1 :(得分:0)

假设您不想手动输入所有查询,我建议创建CURSOR(尽管我讨厌游标)并循环遍历系统表,如下所示:

SELECT t.name AS table_name,
SCHEMA_NAME(schema_id) AS schema_name,
   c.name AS column_name
FROM sys.tables AS t
INNER JOIN sys.columns c ON t.OBJECT_ID = c.OBJECT_ID

然后,您可以运行动态SQL来执行类似@AaronBertrand建议的操作。

声明游标并将变量提取到@table_name和@column_name。然后运行类似(未经测试的):

DECLARE @updateSQL NVARCHAR(MAX)
SET @updateSQL = 'UPDATE ' + @table_name + ' SET ' + @column_name + ' = LEFT(' + @column_name + ', CHARINDEX(''</title>'', ' + @column_name + ')-1)'
EXECUTE (@updateSQL)
祝你好运。