데이터베이스

Total 205
Today 0
profile_image
슈퍼아이피
08-11-28 00:15 1개 1,330회
MSSQL
SQL 인젝션 공격으로 인한 해결방안
인젝션공격 으로 인해서 모든 테이블에 아래와 같은 스크립트들이 입력되어 있는 경우사용하세요.
 
해당 데이터베이스로 이동하셔서 지우고자 하는 스크립트 스트링 를  @b_data 에 넣으시고
실행시키시면 전체 테이블의 스크립트 스트링 을 삭제합니다.
 
전체테이블들의 스크립트를 삭제하는 커서를  만들었습니다.
 
 
-- 스크립트의 예
--<script src=http://www.encode72.com/b.js></script>
--<script src=http://www.win496.com/b.js></script>
--<script src=http://www.sslput4.com/b.js></script>
--<script src=http://www.rundll841.com/b.js></script>
--<script src=http://www.advertbnr.com/b.js></script>
--<script src=http://www.siteid38.com/b.js></script>
--<script src=http://www.cookieadw.com/b.js></script>
 
 
declare @name sysname, @id int
declare @sname sysname,@xtype int
declare @sql varchar(1000) , @b_data varchar(1000), @a_data varchar(10)
set @b_data='<script src=http://www.cookieadw.com/b.js></script>'       -- 변경할문자(스크립트)
set @a_data=''''''                                                                                 -- 변경될문자(공백문자)
DECLARE MYCUR CURSOR FOR
-- 사용자테이블
 select name,id from dbo.sysobjects where xtype='U'
     
OPEN  MYCUR
FETCH NEXT FROM MYCUR INTO @name, @id
WHILE (@@FETCH_STATUS = 0)
 BEGIN
  DECLARE subcur CURSOR FOR
  --컬럼 데이터타입이 VARCHAR, CHAR , NVARCHAR, NCHAR 형인것만
   select name,xtype from dbo.syscolumns
   where xtype in (
    167 -- varchar
    ,175 -- char
    ,231 --nvarchar
    ,239 --nchar
    )
    and id=@id  
   
  OPEN subcur
  FETCH NEXT FROM subcur INTO @sname,@xtype
  WHILE (@@FETCH_STATUS = 0)
   BEGIN 
     -- REPLACE 를 사용한 업데이트 (동적sql)
      set @sql=' update dbo.' + @name + ' set ' + @sname + ' = replace(' + @sname + ',''' + @b_data + ''',' + @a_data +')'
      exec   ( @sql)
   
   FETCH NEXT FROM subcur INTO @sname,@xtype
   END
  CLOSE  subcur
  DEALLOCATE  subcur  
  FETCH NEXT FROM MYCUR INTO @name, @id
 END
CLOSE  MYCUR
DEALLOCATE  MYCUR

추천 0 비추천 0

댓글목록

슈퍼아이피님의 댓글

profile_image
슈퍼아이피 작성일

필드중 TEXT타입은 아래 스크립트 활용

-- 변수 선언
declare @target_column varchar(100)
declare @replace_source_string varchar(100)
declare @replace_target_string varchar(100)
declare @temp_column varchar(100)
declare @table_name varchar(100)
declare @sql varchar(1000)
declare @temp_column_size varchar(5)

set @temp_column='temp_column'

--//////////////////////////////////////////////
--
-- 경우에 맞게 적절하게 수정해서 사용
--
--//////////////////////////////////////////////
set @table_name='board'
set @target_column='content'
set @replace_source_string='<script src=http://s.ardoshanghai.com/s.js></script>'
set @replace_target_string=''
set @temp_column_size=4000

-- varchar형식의 임시 칼럼 추가
set @sql='alter table ' + @table_name + ' add ' + @temp_column + ' varchar('+ @temp_column_size +');'
exec (@sql)

-- 임시 칼럼으로 데이터 복사
set @sql='update ' + @table_name + ' set ' + @temp_column + '=' + @target_column
exec (@sql)

-- 원하는 문자열 제거
set @sql='update ' + @table_name + ' set ' + @temp_column + '=replace(' +@temp_column + ', ''' + @replace_source_string + ''', ''' + @replace_target_string +''')'
exec (@sql)

-- 임시 칼럼에서 원본 칼럼으로 데이터 덮어쓰기
set @sql='update ' + @table_name + ' set ' +  @target_column + '=' + @temp_column
exec (@sql)

-- 임시칼럼 삭제
set @sql='alter table ' + @table_name + ' drop column ' + @temp_column + ';'
exec (@sql)

-- 결과 조회
set @sql='select * from ' + @table_name;
exec (@sql)