公司客户的系统被人注入,很惨,涉及到7个数据库,N个数据表,在字段里选择性的加入了脚本js代码,因为系统涉及周期非常长,好像是03年左右到现在的,查看被攻击记录,05年就有人来过,目前已经不能再忍受了,修改吧。
以前也做过类似的修改,用update语句批量replace注入的内容就OK了,这次情况很特殊,单个表内单个字段被注入的js代码都不一样,用replace不现实了,只以另行捷径。
经过分析,发现被注入的内容都是在原内容的最后加上的,而且有一定规律,都是以"开头、<开头、[开头,所以只要从以这些字符开头的位置开始截取就行了。
OK,原理知道了,写了个存储过程,免得日后又要重写:
--作者:老韩
--作用:批量清除某表某字段以某字符开头的字串
CREATE procedure f_filter_sql_zr
(
@tablename varchar(60), --表名
@zdname varchar(60), --字段名
@filterchar char --要过滤的字符串开始字符
)
as
begin
(
@tablename varchar(60), --表名
@zdname varchar(60), --字段名
@filterchar char --要过滤的字符串开始字符
)
as
begin
Declare @tmpPos as int --保存要过滤字符串开始字符
Declare @tmpFilterString as varchar(1000) --保存要过滤的字符串
Declare @tmpFilterString as varchar(1000) --保存要过滤的字符串
DECLARE @TmpCURSOR as NVARCHAR(4000)
declare @s as nvarchar(4000)
declare @s as nvarchar(4000)
set @s='select right(cast('+@zdname+' as NVARCHAR(4000) ),1000) from '+@tablename+ ' '
set @s='DECLARE curObject CURSOR for '+@s
exec sp_executesql @s
set @s='DECLARE curObject CURSOR for '+@s
exec sp_executesql @s
OPEN curObject
FETCH NEXT FROM curObject INTO @TmpCURSOR
WHILE(@@FETCH_STATUS=0)
BEGIN
set @TmpCURSOR=right(@TmpCURSOR,1000)--一般是在最后加的过滤
FETCH NEXT FROM curObject INTO @TmpCURSOR
WHILE(@@FETCH_STATUS=0)
BEGIN
set @TmpCURSOR=right(@TmpCURSOR,1000)--一般是在最后加的过滤
--取得要过滤的字符串
set @tmpPos=charindex(@filterchar,@TmpCURSOR)
if @tmpPos=0
begin
set @tmpFilterString=''
end
else
begin
set @tmpFilterString=substring(@TmpCURSOR,@tmpPos,len(@TmpCURSOR))
end
--取得要过滤的字符串完
set @tmpPos=charindex(@filterchar,@TmpCURSOR)
if @tmpPos=0
begin
set @tmpFilterString=''
end
else
begin
set @tmpFilterString=substring(@TmpCURSOR,@tmpPos,len(@TmpCURSOR))
end
--取得要过滤的字符串完
set @s='update '+@tablename+' set '+@zdname+'=replace('''+@TmpCURSOR+''','''+@tmpFilterString+''','''') where CURRENT OF curObject '
exec sp_executesql @s,N'@tablename varchar(50),@zdname varchar(50),@TmpCURSOR NVARCHAR(128) ,@tmpFilterString varchar(1000)',@tablename,@zdname,@TmpCURSOR,@tmpFilterString
FETCH NEXT FROM curObject INTO @TmpCURSOR
END
END
close curObject
deallocate curObject
deallocate curObject
end
GO
GO
调用:
我要清理gonggl表中gongname字段的注入内容,发现此字段被注入的内容是以<开头,则在查询分析器里执行:
exec f_filter_sql_zr 'gonggl','gongname','<'
exec f_filter_sql_zr 'gonggl','gongname','<'




网络技术知识





此内容无附件