사이트 내 전체검색
PHP
[MS-SQL] SQL 인젝션 삽입된 악성코드 일괄 삭제
로빈아빠
https://cmd.kr/php/724 URL이 복사되었습니다.

본문


최근 쿠키 취약점을 토대로 들어오는 Mass SQL 인젝션의 경우, 기존 DB 내용을 변조하지 않고, 악성코드가 덧붙여 삽입되는 형식이기 때문에 악성코드 일괄 삭제 쿼리로 손쉽게 정상 상태로 복원이 가능하다. 하지만 SQL 인젝션 특성 상 언제 또 코드가 바뀔지 모르는 일이기 때문에 현재에 안주해서는 안 된다. 반드시 웹 취약점을 보완해야 한다는 것을 명심하시길…

SQL 인젝션으로 인해 DB 내용이 변조되었을 때 SQL 인젝션 코드를 역으로 이용하여 악성코드만 삭제하는 쿼리다. 참고로 DB 내용의 일부분이 손상 및 변조되고, 악성코드가 그 자리에 치환되는 수법이라면 정상 상태로 복원되지 않는다.

당시 이 쿼리를 만들기 위해 여러 웹사이트들을 참조했었는데 죄송스럽게도 지금은 정확하게 기억이 나지 않아서… (만일, 본인이 만들었던 스크립트라면 댓글 부탁 드립니다. 출처 명시해 드리겠습니다.)

이하 주의 사항 입니다.

이 스크립트의 단점이라 하면 로그인 아이디가 해당 DB에 DBO 권한을 가지고 있어야 하며 테이블의 소유자가 DBO로 설정되어 있어야 합니다. 물론 그 부분를 보안하기 위해 추가 처리가 되어있긴 합니다만, 필히 참고해 주셔야 하는 부분이므로 미리 공지합니다. 또한 SA 계정이나 윈도우즈 로그인 등을 통해 DB 서버의 최상위 권한으로 쿼리를 실행시켜 주어야 합니다. 그 외 중요한 부분들은 주석으로 설명이 되어 있으니 필히 주석을 참고해 주십시오. 궁금하신 사항들은 댓글로 부탁 드립니다.

이미 로그인 아이디가 DBO 권한을 가지고 있고, 테이블의 소유자가 DBO로 설정되어 있는 경우와 그렇지 않을 경우로 나누어 SQL 파일을 공개합니다. 다운로드에 유념해 주시기 바라며 실제 스크립트를 돌리시기 전에는 미리 원본 DB를 반드시 백업 받아 두세요.


[다운로드1 : delete_bad_scripts_dbo.sql ]   [다운로드1]
로그인 아이디가 해당 DB의 DBO 권한을 가지고 있고, 테이블의 소유자가 DBO로 설정되어 있는 경우.

--/// 악성코드 일괄 삭제 스크립트 시작 ///--
--/// 수정 및 확인은 6번, 51번째 줄을 참고해 주시면 됩니다. ///--

-- DB 선택 시작 --
use 디비명 -- 적용하려는 DB명을 선언해 주세요. (ex: use test_db) --
-- DB 선택 끝 --

-- 변수 선언 시작 --
declare @org_user varchar(50)
-- 변수 선언 끝 --

--/// 테이블 소유자를 DBO로 설정하는 전 과정 시작 ///--
set @org_user = 'dbo'
--/// 테이블 소유자를 DBO로 설정하는 전 과정 끝 ///--

--/// 테이블 소유자를 DBO로 일괄 변경하는 부분 시작 ///--
DECLARE @TABLE_NAME VARCHAR (50)
DECLARE @TABLE_OWNER VARCHAR (50)
DECLARE TCURSOR CURSOR

FOR SELECT TABLE_NAME, TABLE_SCHEMA FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME <> 'dtproperties'
FOR READ ONLY

OPEN TCURSOR FETCH NEXT FROM TCURSOR INTO @TABLE_NAME, @TABLE_OWNER
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC ('SP_CHANGEOBJECTOWNER ''[' + @TABLE_OWNER + '].[' + @TABLE_NAME + ']'', ''dbo''')
FETCH NEXT FROM TCURSOR INTO @TABLE_NAME, @TABLE_OWNER
END
CLOSE TCURSOR
DEALLOCATE TCURSOR
--/// 테이블 소유자를 DBO로 일괄 변경하는 부분 끝 ///--

--/// 삽입된 스크립트 공백으로 치환하는 부분 시작 ///--
declare @t varchar(255),@c varchar(255) declare table_cursor cursor for
select a.name, b.name
from sysobjects a, syscoluMns b
where a.id=b.id and a.xtype='u' and (b.xtype=99 or b.xtype=35 or b.xtype=231 or b.xtype=167)

open table_cursor fetch next from table_cursor into @t,@c

while(@@fetch_status=0)

begIn
--/// 수정해 주어야 하는 부분 두번째 입니다. 시작 ///--
--/// 악성코드 부분을 실제 삭제하려는 악성코드로 수정해 주세요. (ex: ) ///--
exec('update [' +@t+ '] set [' +@c+ '] = replace(convert(varchar(8000), [' +@c+ ']), ''악성코드'','''')')
--/// 수정해 주어야 하는 부분 두번째 입니다. 끝 ///--
fetch next from table_cursor into @t,@c

end

close table_cursor
deallocate table_cursor
--/// 삽입된 스크립트 공백으로 치환하는 부분 끝 ///--

--/// 악성코드 일괄 삭제 스크립트 끝 ///--



[ 다운로드2 : delete_bad_scripts_not_dbo.sql ]   [다운로드2]
로그인 아이디가 해당 DB의 DBO 권한을 가지고 있지 않고, 테이블의 소유자 역시 해당 로그인 아이디로 설정되어 있는 경우.

--/// 악성코드 일괄 삭제 스크립트 시작 ///--
--/// 수정 및 확인은 6번, 14번, 51번째 줄을 참고해 주시면 됩니다. ///--

-- DB 선택 시작 --
use 디비명 -- 적용하려는 DB명을 선언해 주세요. (ex: use test_db) --
-- DB 선택 끝 --

-- 변수 선언 시작 --
declare @org_user varchar(50)
-- 변수 선언 끝 --

--/// 수정해 주어야 하는 부분 첫번째 입니다. ///--
set @org_user = '로그인아이디' -- 해당 DB의 로그인 아이디로 수정해 주세요. (ex: set @org_user = 'test_user') --
--/// 수정해 주어야 하는 부분 첫번째 입니다. 끝 ///--

--/// 테이블 소유자를 DBO로 일괄 변경하는 부분 시작 ///--
DECLARE @TABLE_NAME VARCHAR (50)
DECLARE @TABLE_OWNER VARCHAR (50)
DECLARE TCURSOR CURSOR

FOR SELECT TABLE_NAME, TABLE_SCHEMA FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME <> 'dtproperties'
FOR READ ONLY

OPEN TCURSOR FETCH NEXT FROM TCURSOR INTO @TABLE_NAME, @TABLE_OWNER
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC ('SP_CHANGEOBJECTOWNER ''[' + @TABLE_OWNER + '].[' + @TABLE_NAME + ']'', ''dbo''')
FETCH NEXT FROM TCURSOR INTO @TABLE_NAME, @TABLE_OWNER
END
CLOSE TCURSOR
DEALLOCATE TCURSOR
--/// 테이블 소유자를 DBO로 일괄 변경하는 부분 끝 ///--

--/// 삽입된 스크립트 공백으로 치환하는 부분 시작 ///--
declare @t varchar(255),@c varchar(255) declare table_cursor cursor for
select a.name, b.name
from sysobjects a, syscoluMns b
where a.id=b.id and a.xtype='u' and (b.xtype=99 or b.xtype=35 or b.xtype=231 or b.xtype=167)

open table_cursor fetch next from table_cursor into @t,@c

while(@@fetch_status=0)

begIn
--/// 수정해 주어야 하는 부분 두번째 입니다. 시작 ///--
--/// 악성코드 부분을 실제 삭제하려는 악성코드로 수정해 주세요. (ex: ) ///--
exec('update [' +@t+ '] set [' +@c+ '] = replace(convert(varchar(8000), [' +@c+ ']), ''악성코드'','''')')
--/// 수정해 주어야 하는 부분 두번째 입니다. 끝 ///--
fetch next from table_cursor into @t,@c

end

close table_cursor
deallocate table_cursor
--/// 삽입된 스크립트 공백으로 치환하는 부분 끝 ///--

--/// 테이블 소유자 원래대로 롤백 하는 부분 시작 ///--
DECLARE @TABLE_NAME_Back VARCHAR (50)
DECLARE @TABLE_OWNER_Back VARCHAR (50)
DECLARE TCURSOR CURSOR

FOR SELECT TABLE_NAME, TABLE_SCHEMA FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME <> 'dtproperties'
FOR READ ONLY

OPEN TCURSOR FETCH NEXT FROM TCURSOR INTO @TABLE_NAME_Back, @TABLE_OWNER_Back
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC ('SP_CHANGEOBJECTOWNER ''[' + @TABLE_OWNER_Back + '].[' + @TABLE_NAME_Back + ']'', ' + @org_user + '')
FETCH NEXT FROM TCURSOR INTO @TABLE_NAME_Back, @TABLE_OWNER_Back
END
CLOSE TCURSOR
DEALLOCATE TCURSOR
--/// 테이블 소유자 원래대로 롤백 하는 부분 끝 ///--

--/// 악성코드 일괄 삭제 스크립트 끝 ///--



자료출처
http://nice19.net/blog/index.php/archives/362

댓글목록

등록된 댓글이 없습니다.

PHP
871 (5/18P)

Search

Copyright © Cmd 명령어 3.22.250.138