Windows DB

SQL 인젝션 치료용 커서

2008.12.10 22:52

dhkim 조회 수:14846

안녕하세요 HOSTWAY입니다.

SQL Injection으로 인해 <Scrtip 구문이 삽입이 되어 피해를 입은 테이블에 대해서 자동으로 수정을 해주는 커서 입니다.

크게 자료형 vchar와 text로 나누어져 있습니다. 자료형 별로 나누어 2번씩 업데이트 해주시면 되겠습니다.

* 사용전 반드시 백업을 해주시기 바라며 DATABASE에 대해서 지식이 있는 개발자 분들이 사용해 주시면 되겠습니다.

감사합니다.
-----------------------------------
-- 적용하기 전 백업을 꼭 해주세요
-- EXEC 앞에 있는 주석 --를 제거해주시고 쓰시면 되겠습니다.
-- 참고사항으로 소유권 문제로 안될수 있으므로 쿼리 분석기의 바꾸기 기능으로
-- dbo를 사용자 계정으로 바꿔주시면 됩니다.
-- 감사합니다.
-----------------------------------
DECLARE @curr_sysobjid varchar(100), @curr_sysobj varchar(500),@curr_columns_id varchar(100), @curr_columns_name varchar(100),@curr_columns_xtype varchar(50)
DECLARE sysobjects_cursor CURSOR
FOR
    SELECT id,name FROM sysobjects WHERE xtype='U'
OPEN sysobjects_cursor

FETCH NEXT FROM sysobjects_cursor INTO @curr_sysobjid,@curr_sysobj
WHILE(@@FETCH_STATUS <> -1)
BEGIN
    IF(@@FETCH_STATUS <> -2)
     BEGIN
-- 컬럼명 출력용 커서----
      PRINT @curr_sysobjid +  ' ' + @curr_sysobj
 EXEC('DECLARE columns_cursor CURSOR FOR SELECT id,name,xtype FROM syscolumns WHERE id ='  + @curr_sysobjid)
 OPEN columns_cursor
 FETCH NEXT FROM columns_cursor INTO @curr_columns_id,@curr_columns_name,@curr_columns_xtype
 WHILE(@@FETCH_STATUS<> -1)
  BEGIN
     IF(@@FETCH_STATUS <> -2)
     BEGIN
       IF(type_name(@curr_columns_xtype) = 'varchar' or type_name(@curr_columns_xtype) =  'nvarchar')
       BEGIN
-- 자료형이 varchar거나 nvarchar일때
-- update할때
       --EXEC('UPDATE dbo.' + @curr_sysobj + ' SET '  + @curr_columns_name + ' = ' +  'replace(' +  @curr_columns_name + ',substring(' +  @curr_columns_name  + ',charindex(' + '''<script src=''' + ',' +  @curr_columns_name +'), len(' + @curr_columns_name + ')),' + ''''''  +')'  + ' FROM dbo.' + @curr_sysobj + ' WHERE ' + @curr_columns_name + ' LIKE ' + '''%<script src=%''')
----------------

-- SELECT할때
       --EXEC('SELECT ' + @curr_columns_name  + ',replace(' +  @curr_columns_name + ',substring(' +  @curr_columns_name  + ',charindex(' + '''<script src=''' + ',' +  @curr_columns_name +'), len(' + @curr_columns_name + ')),' + ''''''  +')'  + ' FROM dbo.' + @curr_sysobj + ' WHERE ' + @curr_columns_name + ' LIKE ' + '''%<script src=%''')
----------------

       PRINT @curr_columns_name
       END
      IF(type_name(@curr_columns_xtype) =  'ntext' or  type_name(@curr_columns_xtype) =  'text')
      BEGIN

-- 자료형이 text 나 ntext일때 CONVERT함수로 text,ntext 자료형을 varchar로 변경한다.
-- UPDATE할때
       --EXEC('UPDATE dbo.' + @curr_sysobj + ' SET '  + @curr_columns_name + ' = ' +  'replace(' +  'CONVERT(varchar(8000),' + @curr_columns_name + ')' + ',substring(' +  'CONVERT(varchar(8000),' + @curr_columns_name + ')'  + ',charindex(' + '''<script src=''' + ',' +  'CONVERT(varchar(8000),' + @curr_columns_name + ')' +'), len(' + 'CONVERT(varchar(8000),' + @curr_columns_name + ')' + ')),' + ''''''  +')'  + ' FROM dbo.' + @curr_sysobj + ' WHERE ' + @curr_columns_name + ' LIKE ' + '''%<script src=%''')
-------------

-- SELECT할때
       --EXEC('SELECT ' + 'CONVERT(varchar(8000),' + @curr_columns_name + ')' + ',replace(' + 'CONVERT(varchar(8000),' +  @curr_columns_name + ')' + ',substring(' +  'CONVERT(varchar(8000),' +  @curr_columns_name + ')'  + ',charindex(' + '''<script src=''' + ',' +  @curr_columns_name +'), len(' + 'CONVERT(varchar(8000),' +  @curr_columns_name + ')' + ')),' + ''''''  +')'  + ' FROM dbo.' + @curr_sysobj + ' WHERE ' + @curr_columns_name + ' LIKE ' + '''%<script src=%''')
-------------

       PRINT @curr_columns_name
      END
     END
 FETCH NEXT FROM columns_cursor INTO @curr_columns_id,@curr_columns_name,@curr_columns_xtype
                            END
 CLOSE columns_cursor
 DEALLOCATE columns_cursor
---------------------
--      PRINT 'SELECT id,name FROM ' + @curr_sysobj + ' WHERE id ='  + @curr_sysobjid
      FETCH NEXT FROM sysobjects_cursor INTO @curr_sysobjid,@curr_sysobj
    END
END
CLOSE sysobjects_cursor
DEALLOCATE sysobjects_cursor