기업 보안이 중요시 되고 있는 지금 SQL 인젝션에 인한 피해 또한 급증하고 있는 추세이다. 권한 제거라는 간단한 방법이 있으나 자칫 한순간의 방심으로 기업 방화벽만을 믿고 이를 묵고한다면 엄청난 피해를 초래할 수 있기에 다음과 같은 내용을 서술하고자 한다. DB Owner Account로 생성된 어플리케이션들의 공통된 특징 중 하나가 바로 System Object 들에 대한 권한제어가 적절하게 이루어 지지 않는다는 점이다. DB Owner Account가 아닐지라도, System Object중에 불필요하게 public 계정에 대해 실행권한이 있는 것들이 있다. 따라서, SQL Server를 설치한 후에 해당 object들에 대해 권한 제거 작업을 진행하길 바란다.
서버 관리에 있어 가장 치명적인 문제로 꼽을 수 있는 서버 패스워드 유출이 단 한줄의 쿼리문으로 발생할 수 있다면 믿겠는가? 물론 패스워드 뿐만 아니라 시스템상의 파일 트리를 조회하거나 중요 파일들을 삭제할 수도 있다.
이를 가능하게 하는 대표적인 저장 프로시저가 바로 xp_cmdshell 이다. master db의 확장 프로시저 중 하나인 xp_cmdshell은 지정된 문자열을 Shell을 통해 실행할 수 있는 기능을 가지고 있다. 따라서, 이 확장프로시저에 대한 권한을 가지고 있다면 앞서 언급한 피해를 타겟이 되는 기업 서버에 줄 수 있다.
아래 3가지 항목을 토대로 한 SQL Injection 기법을 이용하여 해당 시스템을 공격할 수 있게 된다.
1 ) exec master..xp_cmdshell 'net user administrator password'
디폴트 유저인 administrator의 패스워드 변경 혹은 신규 Server Admin계정 추가
2 ) exec master..xp_cmdshell 'dir c:\'
C 드라이브에 대한 정보 및 디렉토리 정보 반환
3 ) exec master..xp_cmdshell 'del c:\ /q/s'
C 드라이브의 중요 파일 삭제
만약, 현재 서버에서 3389 포트를 사용하는 원격 지원 서비스가 실행중이라면 xp_cmdshell을 통한 비밀번호 변경 혹은 Server Admin 유저를 신규로 추가하는 등의 방법으로 원격지에서 서버 접속이 가능하게되며 이러한 경우 마치 서버 앞에서 서버를 조작하는것과 동일한 방식으로 해당 서버를 제한없이 컨트롤 할 수 있게 된다.
이러한 확장 프로시저의 노출로 야기될 최악의 사태를 방지하기 위해 사용이 불필요할 경우 아래 쿼리문을 실행하여 xp_cmdshell 프로시저를 임시로 Drop하기 바란다.
USE master
GO
IF OBJECT_ID('[dbo].[xp_cmdshell]') IS NOT NULL BEGIN
EXEC sp_dropextendedproc 'xp_cmdshell'
END
GO
여기에 덧붙여 System Admin계정의 ID를 administrator로 사용하는 사례가 많은데, 각 서버 사용사의 고유한 ID를 등록하여 사용 하는 것이 보다 나은 보안 효과를 기대할 수 있겠다.
그러나 앞서 다룬 xp_cmdshell을 통한 SQL Injection 이외에도 public 계정들에 대한 확장 프로시저로 권한을 획득하여 시스템을 공격할 수 있으니 아래 나열한 쿼리문의 실행을 통해 불필요한 프로시저를 Drop하도록 하자. (프로시저들을 Drop하더라도 필요에 따라 재등록할 수 있다.)
1) master database
· 확장 프로시저 퍼미션 삭제
· REVOKE EXECUTE ON xp_regread FROM public
· REVOKE EXECUTE ON xp_instance_regread FROM public GO
· sp_runwebtask 접근을 통한 web task 실행 권한 획득 방지
· REVOKE EXECUTE ON dbo.sp_runwebtask FROM public GO
2) msdb database
· Agent Job 접근을 통한 권한 확대 방지
· REVOKE EXECUTE ON sp_add_job FROM public
· REVOKE EXECUTE ON sp_add_jobstep FROM public
· REVOKE EXECUTE ON sp_add_jobserver FROM public
· REVOKE EXECUTE ON sp_start_job FROM public
· mswebtasks 테이블을 통한 web task 관리 권한 획득 방지
· REVOKE ALL ON dbo.mswebtasks FROM public
· DTS packages 를 통한 administrator 패스워드 유출 방지
· REVOKE EXECUTE ON sp_enum_dtspackages FROM public
· REVOKE EXECUTE ON sp_get_dtspackage FROM public
· SQL Agent Password 노출 방지
· REVOKE EXECUTE ON sp_get_sqlagent_properties FROM public
프로시저들의 Drop후에도 dll 파일은 남아 있으니 아래 쿼리를 실행하여 제거한다.
· dbcc xp_cmdshell(free)
· dbcc xp_dirtree(free)
· dbcc xp_regdeletekey(free)
· dbcc xp_regenumvalues(free)
· dbcc xp_regread(free)
· dbcc xp_regwrite(free)
· dbcc sp_makewebtask(free)
· dbcc sp_adduser(free)
다음으로 SQL Injection을 유발시킬 수 있는 시스템 DB상에 존재하는 프로시저들의 EXCUTE권한을 DENY하겠다. 해당 프로시저들을 통해 시스템의 정보를 조회하고 변경할 수 있으니 필수적으로 DENY해야 할 권한들이다.
· DENY EXECUTE ON [master].[dbo].[xp_subdirs] TO [guest] CASCADE
· DENY EXECUTE ON [master].[dbo].[xp_dirtree] TO [guest] CASCADE
· DENY EXECUTE ON [master].[dbo].[xp_availablemedia] TO [guest] CASCADE
· DENY EXECUTE ON [master].[dbo].[xp_regwrite] TO [guest] CASCADE
· DENY EXECUTE ON [master].[dbo].[xp_regread] TO [guest] CASCADE
· DENY EXECUTE ON [master].[dbo].[xp_regaddmultistring] TO [guest] CASCADE
· DENY EXECUTE ON [master].[dbo].[xp_regdeletekey] TO [guest] CASCADE
· DENY EXECUTE ON [master].[dbo].[xp_regdeletevalue] TO [guest] CASCADE
· DENY EXECUTE ON [master].[dbo].[xp_regremovemultistring] TO [guest] CASCADE
· DENY EXECUTE ON [master].[dbo].[xp_regaddmultistring] TO [guest] CASCADE
마지막으로 일반 User의 물리적 파일 접근을 제한하기 위해 아래 쿼리를 실행한다.
· DENY EXECUTE ON [master].[dbo].[xp_fileexist] TO [guest] CASCADE
· DENY EXECUTE ON [master].[dbo].[xp_fixeddrives] TO [guest] CASCADE
· DENY EXECUTE ON [master].[dbo].[xp_getfiledetails] TO [guest] CASCADE
SQL Injection은 본편에서 접했던 내용 이외에도 다양한 방법이 존재한다. 한순간의 방심으로인해 기업내 보안 취약점이 노출되기 쉽상이다. 조금만 더 관심을 가져본다면 완벽에 가까운 서버 보안을 기대할 수 있지 않을까?
'DataBase' 카테고리의 다른 글
SQL 소스 이력 관리 (0) | 2013.04.11 |
---|---|
SQL Server 설치 후 꼭 해줘야할 12가지 작업 DB_BI (0) | 2012.09.28 |
MS SQL 시작 명령어 (0) | 2011.08.29 |
MS SQL 명령어 모음 (0) | 2011.08.29 |
STUFF(Transact-SQL) (0) | 2010.10.20 |