Aktifkan SQL Server 'xp_cmdshell'

177

Saya ingin mengeksekusi EXEC master..xp_cmdshell @bcpquery

Tapi saya mendapatkan kesalahan berikut:

SQL Server memblokir akses ke prosedur 'sys.xp_cmdshell' dari komponen 'xp_cmdshell' karena komponen ini dimatikan sebagai bagian dari konfigurasi keamanan untuk server ini. Administrator sistem dapat mengaktifkan penggunaan 'xp_cmdshell' dengan menggunakan sp_configure. Untuk informasi lebih lanjut tentang mengaktifkan 'xp_cmdshell', lihat "Konfigurasi Area Permukaan" di SQL Server Books Online.

Apakah ada cara untuk mengaktifkan ini, atau menjalankan sesuatu sebelum mengaktifkan fitur?

Bagaimana cara mengatasinya?

edgarmtze
sumber

Jawaban:

370

Anda harus mengaktifkannya. Lihatlah bagian Izin dari dokumen MSDN xp_cmdshell :

http://msdn.microsoft.com/en-us/library/ms190693.aspx :

-- To allow advanced options to be changed.
EXEC sp_configure 'show advanced options', 1
GO
-- To update the currently configured value for advanced options.
RECONFIGURE
GO
-- To enable the feature.
EXEC sp_configure 'xp_cmdshell', 1
GO
-- To update the currently configured value for this feature.
RECONFIGURE
GO
Pero P.
sumber
2
Bekerja dengan sangat baik, sederhana, dan efektif!
indofraiser
2
Pastikan Anda menjalankan SQL Management Studio sebagai administrator
Haim Raman
Terima kasih atas bantuannya. Mencari solusi selama berhari-hari.
Mohan Rajput
2
keamanan - Aktifkan tetapi hati-hati! perlu diingat: ini
sawyer
39

Anda juga dapat menyembunyikan lagi opsi lanjutan setelah mengkonfigurasi ulang:

-- show advanced options
EXEC sp_configure 'show advanced options', 1
GO
RECONFIGURE
GO
-- enable xp_cmdshell
EXEC sp_configure 'xp_cmdshell', 1
GO
RECONFIGURE
GO
-- hide advanced options
EXEC sp_configure 'show advanced options', 0
GO
RECONFIGURE
GO
hoggar
sumber
19

Klik kanan server -> Aspek -> Konfigurasi Area Permukaan -> XPCmshellEnbled -> true masukkan deskripsi gambar di sini

arnav
sumber
9

Seperti yang tercantum dalam jawaban lain, triknya (dalam SQL 2005 atau yang lebih baru) adalah mengubah pengaturan konfigurasi global untuk show advanced optionsdan xp_cmdshellke 1, dalam urutan itu.

Menambah ini, jika Anda ingin mempertahankan nilai-nilai sebelumnya, Anda dapat membacanya dari sys.configurationspertama, kemudian menerapkannya dalam urutan terbalik di akhir. Kami juga dapat menghindari reconfigurepanggilan yang tidak perlu :

declare @prevAdvancedOptions int
declare @prevXpCmdshell int

select @prevAdvancedOptions = cast(value_in_use as int) from sys.configurations where name = 'show advanced options'
select @prevXpCmdshell = cast(value_in_use as int) from sys.configurations where name = 'xp_cmdshell'

if (@prevAdvancedOptions = 0)
begin
    exec sp_configure 'show advanced options', 1
    reconfigure
end

if (@prevXpCmdshell = 0)
begin
    exec sp_configure 'xp_cmdshell', 1
    reconfigure
end

/* do work */

if (@prevXpCmdshell = 0)
begin
    exec sp_configure 'xp_cmdshell', 0
    reconfigure
end

if (@prevAdvancedOptions = 0)
begin
    exec sp_configure 'show advanced options', 0
    reconfigure
end

Perhatikan bahwa ini bergantung pada SQL Server versi 2005 atau yang lebih baru (pertanyaan awal adalah untuk 2008).

Geoff
sumber
4

Sementara jawaban yang diterima akan berfungsi sebagian besar waktu, saya telah menemukan (masih tidak tahu mengapa) beberapa kasus yang tidak. Sedikit modifikasi permintaan dengan menggunakan WITH OVERRIDEin RECONFIGUREmemberikan solusi

Use Master
GO

EXEC master.dbo.sp_configure 'show advanced options', 1
RECONFIGURE WITH OVERRIDE
GO

EXEC master.dbo.sp_configure 'xp_cmdshell', 1
RECONFIGURE WITH OVERRIDE
GO

Output yang diharapkan adalah

Opsi konfigurasi 'tampilkan opsi lanjutan' berubah dari 0 menjadi 1. Jalankan pernyataan RECONFIGURE untuk menginstal.
Opsi konfigurasi 'xp_cmdshell' berubah dari 0 menjadi 1. Jalankan pernyataan RECONFIGURE untuk menginstal.

Athafoud
sumber
4

Bahkan jika pertanyaan ini telah diselesaikan, saya ingin menambahkan saran saya tentang itu .... karena sebagai pengembang saya mengabaikannya.

Penting untuk diketahui bahwa kita berbicara tentang MSSQL xp_cmdshell diaktifkan sangat penting untuk keamanan, seperti yang ditunjukkan dalam pesan peringatan:

Blockquote SQL Server memblokir akses ke prosedur 'sys.xp_cmdshell' dari komponen 'xp_cmdshell' karena komponen ini dimatikan sebagai bagian dari konfigurasi keamanan untuk server ini. [...]

Membiarkan layanan diaktifkan adalah semacam kelemahan , yang misalnya dalam aplikasi web dapat mencerminkan dan menjalankan perintah SQL dari penyerang. CWE-89 yang populer : SQL Injectionitu bisa menjadi kelemahan dalam perangkat lunak kami, dan karenanya jenis skenario ini dapat membuka jalan bagi kemungkinan serangan, seperti CAPEC-108 :Command Line Execution through SQL Injection

Saya berharap telah melakukan sesuatu yang menyenangkan, kami Pengembang dan Insinyur melakukan hal-hal dengan kesadaran dan kami akan lebih aman!

penggergaji
sumber
0

Bagi saya, satu-satunya cara pada SQL 2008 R2 adalah ini:

EXEC sp_configure 'Show Advanced Options', 1    
RECONFIGURE **WITH OVERRIDE**    
EXEC sp_configure 'xp_cmdshell', 1    
RECONFIGURE **WITH OVERRIDE**
David Bru
sumber
-1

Anda dapat melakukannya menggunakan SQLcmd. Anda telah menjalankan perintah berikut. masukkan deskripsi gambar di sini

arnav
sumber
2
Dapatkah Anda menunjukkan bagaimana jawaban ini berbeda dari jawaban lain dari pertanyaan ini. Selain itu, harap gunakan blok kode untuk kode Anda alih-alih tangkapan layar.
Athafoud
c: \> sqlcmd -S. -E 1) EXEC sp_con \
arnav