xp_cmdshell (T-SQL)
Berlaku untuk: SQL Server
Menelurkan shell perintah Windows dan meneruskan string untuk eksekusi. Output apa pun dikembalikan sebagai baris teks.
Sintaks
xp_cmdshell { 'command_string' } [ , NO_OUTPUT ]
Argumen
'command_string'
String yang berisi perintah yang akan diteruskan ke sistem operasi. command_string adalah varchar(8000) atau nvarchar(4000), tanpa default. command_string tidak boleh berisi lebih dari satu set tanda kutip ganda. Sepasang tanda kutip tunggal diperlukan jika ada spasi di jalur file atau nama program yang dirujuk dalam command_string. Jika Anda mengalami masalah dengan spasi yang disematkan, pertimbangkan untuk menggunakan nama file FAT 8.3 sebagai solusinya.
NO_ OUTPUT
Parameter opsional, yang menentukan bahwa tidak ada output yang harus dikembalikan ke klien.
Mengembalikan nilai kode
0
(berhasil) atau 1
(kegagalan).
Tataan hasil
Menjalankan pernyataan berikut xp_cmdshell
mengembalikan daftar direktori direktori saat ini.
EXEC xp_cmdshell 'dir *.exe';
GO
Baris dikembalikan dalam kolom nvarchar(255). NO_OUTPUT
Jika opsi digunakan, hanya output berikut yang dikembalikan:
The command(s) completed successfully.
Keterangan
Proses Windows yang dihasilkan oleh memiliki hak keamanan yang sama dengan xp_cmdshell
akun layanan SQL Server.
Perhatian
xp_cmdshell
adalah fitur yang kuat dan dinonaktifkan secara default. xp_cmdshell
dapat diaktifkan dan dinonaktifkan dengan menggunakan Manajemen Berbasis Kebijakan atau dengan menjalankan sp_configure
. Untuk informasi selengkapnya, lihat Konfigurasi area permukaan dan xp_cmdshell (opsi konfigurasi server). Menggunakan xp_cmdshell
dapat memicu alat audit keamanan.
xp_cmdshell
beroperasi secara sinkron. Kontrol tidak dikembalikan ke pemanggil hingga perintah command-shell selesai. Jika xp_cmdshell
dijalankan dalam batch dan mengembalikan kesalahan, batch akan gagal.
xp_cmdshell akun proksi
Ketika dipanggil oleh pengguna yang bukan anggota peran server tetap sysadmin , xp_cmdshell
terhubung ke Windows dengan menggunakan nama akun dan kata sandi yang disimpan dalam kredensial bernama ##xp_cmdshell_proxy_account##. Jika kredensial proksi ini tidak ada, xp_cmdshell
gagal.
Kredensial akun proksi dapat dibuat dengan menjalankan sp_xp_cmdshell_proxy_account
. Sebagai argumen, prosedur tersimpan ini mengambil nama pengguna dan kata sandi Windows. Misalnya, perintah berikut membuat kredensial proksi untuk pengguna SHIPPING\KobeR
domain Windows yang memiliki kata sandi sdfh%dkc93vcMt0
Windows .
EXEC sp_xp_cmdshell_proxy_account 'SHIPPING\KobeR', 'sdfh%dkc93vcMt0';
Untuk informasi selengkapnya, lihat sp_xp_cmdshell_proxy_account.
Izin
Karena pengguna berbahaya terkadang mencoba meningkatkan hak istimewa mereka dengan menggunakan xp_cmdshell
, xp_cmdshell
dinonaktifkan secara default. Gunakan sp_configure
atau Manajemen Berbasis Kebijakan untuk mengaktifkannya. Untuk informasi selengkapnya, lihat Opsi Konfigurasi Server xp_cmdshell.
Ketika pertama kali diaktifkan, xp_cmdshell
memerlukan izin CONTROL SERVER untuk dijalankan dan proses Windows yang dibuat oleh memiliki konteks keamanan yang sama dengan xp_cmdshell
akun layanan SQL Server. Akun layanan SQL Server sering memiliki lebih banyak izin daripada yang diperlukan untuk pekerjaan yang dilakukan oleh proses yang dibuat oleh xp_cmdshell
. Untuk meningkatkan keamanan, akses ke xp_cmdshell
harus dibatasi untuk pengguna yang sangat istimewa.
Untuk mengizinkan non-administrator menggunakan xp_cmdshell
, dan mengizinkan SQL Server membuat proses turunan dengan token keamanan akun yang kurang istimewa, ikuti langkah-langkah berikut:
Buat dan sesuaikan akun pengguna lokal Windows atau akun domain dengan hak istimewa paling sedikit yang diperlukan proses Anda.
sp_xp_cmdshell_proxy_account
Gunakan prosedur sistem untuk mengonfigurasixp_cmdshell
untuk menggunakan akun dengan hak istimewa terkecil tersebut.Catatan
Anda juga dapat mengonfigurasi akun proksi ini menggunakan SQL Server Management Studio dengan mengklik kanan Properti pada nama server Anda di Object Explorer, dan mencari pada tab Keamanan untuk bagian Akun proksi server.
Di Management Studio, menggunakan
master
database, jalankan pernyataan Transact-SQL berikut untuk memberi pengguna non-sysadmin tertentu kemampuan untuk menjalankanxp_cmdshell
. Pengguna yang ditentukan harus ada dimaster
database.GRANT exec ON xp_cmdshell TO N'<some_user>';
Sekarang non-administrator dapat meluncurkan proses sistem operasi dengan xp_cmdshell
dan proses tersebut berjalan dengan izin akun proksi yang Anda konfigurasikan. Pengguna dengan izin SERVER KONTROL (anggota peran server tetap sysadmin ) terus menerima izin akun layanan SQL Server untuk proses anak yang diluncurkan oleh xp_cmdshell
.
Untuk menentukan akun Windows yang digunakan saat xp_cmdshell
meluncurkan proses sistem operasi, jalankan pernyataan berikut:
EXEC xp_cmdshell 'whoami.exe';
Untuk menentukan konteks keamanan untuk login lain, jalankan kode Transact-SQL berikut:
EXEC AS LOGIN = '<other_login>';
GO
xp_cmdshell 'whoami.exe';
REVERT;
Contoh
J. Mengembalikan daftar file yang dapat dieksekusi
Contoh berikut menunjukkan xp_cmdshell
prosedur tersimpan yang diperluas yang menjalankan perintah direktori.
EXEC master..xp_cmdshell 'dir *.exe'
B. Tidak mengembalikan output
Contoh berikut menggunakan xp_cmdshell
untuk menjalankan string perintah tanpa mengembalikan output ke klien.
USE master;
EXEC xp_cmdshell 'copy c:\SQLbcks\AdvWorks.bck
\\server2\backups\SQLbcks', NO_OUTPUT;
GO
C. Gunakan status pengembalian
Dalam contoh berikut, prosedur tersimpan xp_cmdshell
yang diperluas juga menyarankan status pengembalian. Nilai kode yang dikembalikan disimpan dalam variabel @result
.
DECLARE @result INT;
EXEC @result = xp_cmdshell 'dir *.exe';
IF (@result = 0)
PRINT 'Success'
ELSE
PRINT 'Failure';
D. Menulis konten variabel ke file
Contoh berikut menulis konten variabel ke @var
file bernama var_out.txt
di direktori server saat ini.
DECLARE @cmd SYSNAME,
@var SYSNAME;
SET @var = 'Hello world';
SET @cmd = 'echo ' + @var + ' > var_out.txt';
EXEC master..xp_cmdshell @cmd;
E. Mengambil hasil perintah ke file
Contoh berikut menulis konten direktori saat ini ke file bernama dir_out.txt
di direktori server saat ini.
DECLARE @cmd SYSNAME,
@var SYSNAME;
SET @var = 'dir /p';
SET @cmd = @var + ' > dir_out.txt';
EXEC master..xp_cmdshell @cmd;