【发布时间】:2015-09-02 17:45:47
【问题描述】:
我们的 SQL Server 遭受了某种入侵。
我试图在每个数据库、每个表、每个列中找到单词 abortion 和 cheat。
我可以用这个查询来做到这一点,但在一个数据库中。
-- Store results in a local temp table so that. I'm using a
-- local temp table so that I can access it in SP_EXECUTESQL.
create table #tmp
(
db varchar(max),
tbl nvarchar(max),
col nvarchar(max),
val nvarchar(max),
);
declare @db nvarchar(max);
declare @tbl nvarchar(max);
declare @col nvarchar(max);
declare @q nvarchar(max);
declare @search nvarchar(max) = 'abortion';
-- Create a cursor on all columns in the database
declare c cursor for
SELECT
DB_NAME(DB_ID()) as DBName, tbls.TABLE_NAME, cols.COLUMN_NAME
FROM INFORMATION_SCHEMA.TABLES AS tbls
JOIN INFORMATION_SCHEMA.COLUMNS AS cols ON tbls.TABLE_NAME = cols.TABLE_NAME
-- For each table and column pair, see if the search value exists.
open c
fetch next from c into @db, @tbl, @col
while @@FETCH_STATUS = 0
begin
-- Look for the search key in current table column and if found add it to the results.
SET @q = 'INSERT INTO #tmp SELECT ''' +@db+''',''' + @tbl + ''', ''' + @col + ''', ' + @col + ' FROM ' + @tbl + ' WHERE ' + @col + ' LIKE ''%' + @search + '%'''
EXEC SP_EXECUTESQL @q
fetch next from c into @db, @tbl, @col
end
close c
deallocate c
-- Get results
select distinct db,tbl,col from #tmp
-- Remove local temp table.
drop table #tmp
我怎样才能找到这些字符串?结果集应该是:
DATABASE | TABLE | COLUMN
我不需要结果(文本字段),我需要select distinct 用于表和列,因为在同一个表/列中会有很多abortion。
【问题讨论】:
-
你好,谢谢@lad2025,但这些查询都不能帮助我。最后一个搜索所有不工作的数据库。
-
既然这是一次性的事情,为什么不能只为每个数据库运行它呢?另外,在您费心修复数据之前,我希望您修复了 sql 注入漏洞。毫无疑问,事情就是这样发生的。
-
这就是我正在做的。我们有 300 个数据库。我是手动做的,直到找到更好的解决方案。
-
你修复了sql注入漏洞吗?如果你不解决这个问题,你将不止一次地与这个问题作斗争。老实说,您可能至少要为此战斗两次。一次是“哦,废话,现在需要修复我们的网站”,每次你再次被黑客入侵,直到你解决问题。
标签: sql-server database tsql sql-server-2008-r2