数据库被批量注入解决办法(SQL语句)
				
									
					
					
						 | 
						
							
							admin 
							
							
								2011年1月30日 21:47
								本文热度 5011
							
							 
						 | 
					
					
				 
				
针对最近老是出现的SQL注入,借鉴网上一些SQL语句,写了如下语句。希望对中招的朋友有所帮助。
使用方法:复制以下代码到SQL查询分析器,将‘<script src=http://cn.jxmmtv.com/cn.js></script>’修改成被注入的脚本。
declare @delStr nvarchar(500)
set @delStr='<script src=http://cn.jxmmtv.com/cn.js></script>'
set nocount on 
declare @tableName nvarchar(100),@columnName nvarchar(100),@tbID int,@iRow int,@iResult int
declare @sql nvarchar(4000)
set @iResult=0
declare cur cursor for
select name,id from sysobjects where xtype='U'
open cur
fetch next from cur into @tableName,@tbID
while @@fetch_status=0
begin
   declare cur1 cursor for
        --xtype in (231,167,239,175) 为char,varchar,nchar,nvarchar类型35为text,99为ntext
        select name from syscolumns where xtype in (35,99) and id=@tbID
   open cur1
   fetch next from cur1 into @columnName
   while @@fetch_status=0
   begin
   
              
      set @sql = 'update ['+ @tableName +']   set [' +  @columnName+ '] = replace(cast([' + @columnName + '] as varchar(8000)) ,''' + @delStr + ''','''') where ['+@columnName+'] like ''%'+@delStr+'%'''    
      --execute sp_executesql @sql  --第一次运行,先注释掉本句,查看数据库被破坏情况,根据情况选择是否启用该语句
      
      set @iRow=@@rowcount 
      set @iResult=@iResult+@iRow
      print @sql
      fetch next from cur1 into @columnName         
      set     @sql='declare @rowValue varchar(4000);
                  declare @indexofstr int;
                  --declare @badrowcount int;
                  --declare @normalrowcount int; 
                  set @badrowcount  = 0
                  set @normalrowcount = 0
                  declare cur2 cursor for select ['+ @columnName +'] from [' + @tableName + '];
                  open cur2;fetch next from cur2 into @rowValue; 
                  while @@fetch_status=0 
                  begin 
                      select @indexofstr = charindex('''+@delStr+''',@rowValue);
                          
                      if(@indexofstr>0)
                            set @badrowcount  = @badrowcount + 1;
                      else
                           set @normalrowcount  = @normalrowcount + 1;
                      fetch next from cur2 into @rowValue;
                  end;
                  close cur2;
                  deallocate cur2;
                  select @maxlength  = max(DATALENGTH( ['+ @columnName +']  )) from [' + @tableName + '] '
      declare @badrowcount int,@normalrowcount int,@maxlength int
      execute sp_executesql @sql,N'@badrowcount int output,@normalrowcount int output,@maxlength int output',@badrowcount output, @normalrowcount output,@maxlength output       
      print '表名:[' +  @tableName  + '] 列名:[' +  @columnName +']'
      print '包含字符串行数:'   + cast (@badrowcount as varchar(20)) 
      print '不包含字符串行数:' + cast (@normalrowcount as varchar(20)) 
      print '本列最长字符串长度:' + cast (@maxlength as varchar(20)) 
      print ''
      
   end
   close cur1
   deallocate cur1
   
   fetch next from cur into @tableName,@tbID
end
close cur
deallocate cur
print '数据库共有'+convert(varchar(10),@iResult)+'条记录被更新'
 
该文章在 2011/1/30 21:47:07 编辑过