xp_cmdshell(Transact-SQL)
적용 대상: SQL Server
Windows 명령 셸을 생성하고 실행을 위해 문자열을 전달합니다. 모든 출력은 텍스트 행으로 반환됩니다.
구문
xp_cmdshell { 'command_string' } [ , NO_OUTPUT ]
인수
'command_string'
운영 체제에 전달할 명령이 포함된 문자열입니다. command_string varchar(8000) 또는 nvarchar(4000)이며 기본값은 없습니다. command_string 큰따옴표 집합을 둘 이상 포함할 수 없습니다. 파일 경로 또는 command_string 참조되는 프로그램 이름에 공백이 있는 경우 작은따옴표 쌍이 필요합니다. 포함 공백에 문제가 있으면 해결 방법으로 FAT 8.3 파일 이름을 사용하십시오.
출력 NO_
클라이언트에 출력을 반환하지 않음을 지정하는 선택적 매개 변수입니다.
반환 코드 값
0
(성공) 또는 1
(실패).
결과 집합
다음 xp_cmdshell
문을 실행하면 현재 디렉터리의 디렉터리 목록이 반환됩니다.
EXEC xp_cmdshell 'dir *.exe';
GO
행은 nvarchar(255) 열에 반환됩니다. NO_OUTPUT
옵션을 사용하는 경우 다음 출력만 반환됩니다.
The command(s) completed successfully.
설명
생성된 xp_cmdshell
Windows 프로세스는 SQL Server 서비스 계정과 동일한 보안 권한을 갖습니다.
주의
xp_cmdshell
는 강력한 기능이며 기본적으로 사용하지 않도록 설정됩니다. xp_cmdshell
은 정책 기반 관리를 사용하거나 실행하여 사용하도록 설정하고 사용하지 않도록 설정할 수 있습니다 sp_configure
. 자세한 내용은 Surface 영역 구성 및 xp_cmdshell(서버 구성 옵션)를 참조하세요. xp_cmdshell
을 사용하면 보안 감사 도구를 트리거할 수 있습니다.
xp_cmdshell
동기적으로 작동합니다. 명령 셸 명령이 완료될 때까지 컨트롤이 호출자에게 반환되지 않습니다. 일괄 처리 내에서 실행되고 오류를 반환하면 xp_cmdshell
일괄 처리가 실패합니다.
xp_cmdshell 프록시 계정
sysadmin 고정 서버 역할 xp_cmdshell
의 멤버가 아닌 사용자가 호출하는 경우 ##xp_cmdshell_proxy_account##이라는 자격 증명에 저장된 계정 이름 및 암호를 사용하여 Windows에 연결합니다. 이 프록시 자격 증명이 없 xp_cmdshell
으면 실패합니다.
를 실행하여 프록시 계정 자격 증명을 sp_xp_cmdshell_proxy_account
만들 수 있습니다. 인수로 이 저장 프로시저는 Windows 사용자 이름과 암호를 사용합니다. 예를 들어 다음 명령은 Windows 암호sdfh%dkc93vcMt0
가 있는 Windows 도메인 사용자 SHIPPING\KobeR
에 대한 프록시 자격 증명을 만듭니다.
EXEC sp_xp_cmdshell_proxy_account 'SHIPPING\KobeR', 'sdfh%dkc93vcMt0';
자세한 내용은 sp_xp_cmdshell_proxy_account 참조하세요.
사용 권한
악의적인 사용자가 사용 하 여 xp_cmdshell
권한을 높이려고 하는 경우가 있기 때문에 기본적으로 xp_cmdshell
사용 안 함으로 설정 됩니다. 정책 기반 관리를 사용 sp_configure
하거나 사용하도록 설정합니다. 자세한 내용은 xp_cmdshell 서버 구성 옵션을 참조하세요.
처음 사용하도록 설정 xp_cmdshell
하면 CONTROL SERVER를 실행할 수 있는 권한이 필요하며, 만든 xp_cmdshell
Windows 프로세스는 SQL Server 서비스 계정과 동일한 보안 컨텍스트를 가집니다. SQL Server 서비스 계정에는 사용자가 만든 xp_cmdshell
프로세스에서 수행하는 작업에 필요한 것보다 많은 권한이 있는 경우가 많습니다. 보안을 강화하려면 높은 권한의 사용자로 xp_cmdshell
액세스를 제한해야 합니다.
관리자가 아닌 사용자가 사용할 xp_cmdshell
수 있도록 허용하고 SQL Server가 권한이 낮은 계정의 보안 토큰으로 자식 프로세스를 만들 수 있도록 허용하려면 다음 단계를 수행합니다.
프로세스에 필요한 최소 권한으로 Windows 로컬 사용자 계정 또는 도메인 계정을 만들고 사용자 지정합니다.
시스템 프로시저를
sp_xp_cmdshell_proxy_account
사용하여 최소 권한 계정을 사용하도록 구성xp_cmdshell
합니다.참고 항목
개체 탐색기 서버 이름에서 속성을 마우스 오른쪽 단추로 클릭하고 서버 프록시 계정 섹션의 보안 탭을 확인하여 SQL Server Management Studio를 사용하여 이 프록시 계정을 구성할 수도 있습니다.
Management Studio에서 데이터베이스를
master
사용하여 다음 Transact-SQL 문을 실행하여 특정 비 sysadmin 사용자에게 실행할xp_cmdshell
수 있는 기능을 제공합니다. 지정된 사용자가 데이터베이스에master
있어야 합니다.GRANT exec ON xp_cmdshell TO N'<some_user>';
이제 비관리자는 사용자가 구성한 프록시 계정의 권한으로 xp_cmdshell
운영 체제 프로세스를 시작하고 해당 프로세스를 실행할 수 있습니다. CONTROL SERVER 권한이 있는 사용자(sysadmin 고정 서버 역할의 멤버)는 시작되는 자식 프로세스에 대한 SQL Server 서비스 계정의 권한을 계속 받습니다xp_cmdshell
.
운영 체제 프로세스를 시작할 때 사용되는 xp_cmdshell
Windows 계정을 확인하려면 다음 문을 실행합니다.
EXEC xp_cmdshell 'whoami.exe';
다른 로그인에 대한 보안 컨텍스트를 확인하려면 다음 Transact-SQL 코드를 실행합니다.
EXEC AS LOGIN = '<other_login>';
GO
xp_cmdshell 'whoami.exe';
REVERT;
예제
A. 실행 파일 목록 반환
다음 예제에서는 디렉터리 명령을 실행하는 확장 저장 프로시저를 보여줍니다 xp_cmdshell
.
EXEC master..xp_cmdshell 'dir *.exe'
B. 출력을 반환하지 않음
다음 예제에서는 클라이언트에 출력을 반환하지 않고 명령 문자열을 실행하는 데 사용합니다 xp_cmdshell
.
USE master;
EXEC xp_cmdshell 'copy c:\SQLbcks\AdvWorks.bck
\\server2\backups\SQLbcks', NO_OUTPUT;
GO
C. 반환 상태 사용
다음 예제 xp_cmdshell
에서는 확장 저장 프로시저도 반환 상태를 제안합니다. 반환 코드 값은 변수 @result
에 저장됩니다.
DECLARE @result INT;
EXEC @result = xp_cmdshell 'dir *.exe';
IF (@result = 0)
PRINT 'Success'
ELSE
PRINT 'Failure';
D. 파일에 변수 내용 쓰기
다음 예제에서는 현재 서버 디렉터리에 명명된 var_out.txt
파일에 변수의 @var
내용을 씁니다.
DECLARE @cmd SYSNAME,
@var SYSNAME;
SET @var = 'Hello world';
SET @cmd = 'echo ' + @var + ' > var_out.txt';
EXEC master..xp_cmdshell @cmd;
E. 명령에 대한 결과를 파일에 캡처
다음은 현재 디렉터리의 내용을 현재 서버 디렉터리에 있는 파일에 dir_out.txt
쓰는 예제입니다.
DECLARE @cmd SYSNAME,
@var SYSNAME;
SET @var = 'dir /p';
SET @cmd = @var + ' > dir_out.txt';
EXEC master..xp_cmdshell @cmd;