xp_cmdshell (T-SQL)

Berlaku untuk:SQL Server

Menelurkan shell perintah Windows dan meneruskan string untuk eksekusi. Output apa pun dikembalikan sebagai baris teks.

Konvensi sintaks transact-SQL

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%dkc93vcMt0Windows .

EXEC sp_xp_cmdshell_proxy_account 'SHIPPING\KobeR', 'sdfh%dkc93vcMt0';

Untuk informasi selengkapnya, lihat sp_xp_cmdshell_proxy_account (Transact-SQL).

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:

  1. Buat dan sesuaikan akun pengguna lokal Windows atau akun domain dengan hak istimewa paling sedikit yang diperlukan proses Anda.

  2. sp_xp_cmdshell_proxy_account Gunakan prosedur sistem untuk mengonfigurasi xp_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.

  3. Di Management Studio, menggunakan master database, jalankan pernyataan Transact-SQL berikut untuk memberi pengguna non-sysadmin tertentu kemampuan untuk menjalankan xp_cmdshell. Pengguna yang ditentukan harus ada di master 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;