Kích hoạt máy chủ SQL 'xp_cmdshell'


177

Tôi muốn thực thi EXEC master..xp_cmdshell @bcpquery

Nhưng tôi nhận được lỗi sau:

SQL Server đã chặn quyền truy cập vào thủ tục 'sys.xp_cmdshell' của thành phần 'xp_cmdshell' vì thành phần này bị tắt như một phần của cấu hình bảo mật cho máy chủ này. Quản trị viên hệ thống có thể cho phép sử dụng 'xp_cmdshell' bằng cách sử dụng sp_cool. Để biết thêm thông tin về cách bật 'xp_cmdshell', hãy xem "Cấu hình diện tích bề mặt" trong Sách dành cho máy chủ SQL trực tuyến.

Có cách nào để kích hoạt điều này hoặc thực hiện một cái gì đó trước khi kích hoạt tính năng này không?

Làm thế nào để giải quyết nó?

Câu trả lời:


370

Bạn cần kích hoạt nó. Kiểm tra phần Quyền của tài liệu MSDN xp_cmdshell :

http://msdn.microsoft.com/en-us/l 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

2
Hoạt động thực sự, cũng đơn giản và hiệu quả!
indofraiser

2
Đảm bảo bạn thực thi SQL Management Studio với tư cách quản trị viên
Haim Raman

Cảm ơn bạn đã giúp đỡ rất nhiều. Tìm kiếm giải pháp cho ngày.
Mohan Rajput

2
bảo mật - Cho phép nhưng hãy cẩn thận! hãy ghi nhớ: điều này
cưa xẻ

39

Bạn cũng có thể ẩn tùy chọn nâng cao một lần nữa sau khi cấu hình lại:

-- 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

19

Nhấp chuột phải vào máy chủ -> Khía cạnh -> Cấu hình diện tích bề mặt -> XPCmshellEnbled -> true nhập mô tả hình ảnh ở đây


9

Được liệt kê trong câu trả lời khác, lừa (trong SQL 2005 hoặc mới hơn) là để thay đổi các thiết lập cấu hình toàn cầu show advanced optionsxp_cmdshellđể 1, trong thứ tự đó.

Thêm vào đó, nếu bạn muốn giữ các giá trị trước đó, bạn có thể đọc chúng từ sys.configurationsđầu, sau đó áp dụng chúng theo thứ tự ngược lại ở cuối. Chúng tôi cũng có thể tránh reconfigurecác cuộc gọi không cần thiết :

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

Lưu ý rằng điều này phụ thuộc vào SQL Server phiên bản 2005 trở lên (câu hỏi ban đầu là cho năm 2008).


4

Mặc dù câu trả lời được chấp nhận sẽ hoạt động hầu hết thời gian, tôi đã gặp phải (vẫn không biết tại sao) một số trường hợp không. Một sửa đổi nhỏ của truy vấn bằng cách sử dụng WITH OVERRIDEin RECONFIGUREđưa ra giải pháp

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

Sản lượng dự kiến ​​là

Tùy chọn cấu hình 'hiển thị tùy chọn nâng cao' đã thay đổi từ 0 thành 1. Chạy câu lệnh RECONFIGURE để cài đặt.
Tùy chọn cấu hình 'xp_cmdshell' đã thay đổi từ 0 thành 1. Chạy câu lệnh RECONFIGURE để cài đặt.


4

Ngay cả khi câu hỏi này đã được giải quyết, tôi muốn thêm lời khuyên của mình về điều đó .... vì là nhà phát triển tôi đã bỏ qua.

Điều quan trọng cần biết là chúng ta đang nói về MSSQL xp_cmdshell được kích hoạt là rất quan trọng đối với bảo mật, như được chỉ ra trong cảnh báo tin nhắn:

Blockquote SQL Server đã chặn quyền truy cập vào thủ tục 'sys.xp_cmdshell' của thành phần 'xp_cmdshell' vì thành phần này bị tắt như một phần của cấu hình bảo mật cho máy chủ này. [...]

Rời khỏi dịch vụ được kích hoạt là một loại điểm yếu , ví dụ như trong ứng dụng web có thể phản ánh và thực thi các lệnh SQL từ kẻ tấn công. CWE-89 phổ biến : SQL Injectionnó có thể là điểm yếu trong phần mềm của chúng tôi và do đó, các loại kịch bản này có thể mở đường cho các cuộc tấn công có thể xảy ra, chẳng hạn như CAPEC-108 :Command Line Execution through SQL Injection

Tôi hy vọng đã làm được điều gì đó dễ chịu, chúng tôi Nhà phát triển và Kỹ sư làm mọi việc với nhận thức và chúng tôi sẽ an toàn hơn!


0

Đối với tôi, cách duy nhất trên SQL 2008 R2 là:

EXEC sp_configure 'Show Advanced Options', 1    
RECONFIGURE **WITH OVERRIDE**    
EXEC sp_configure 'xp_cmdshell', 1    
RECONFIGURE **WITH OVERRIDE**

-1

Bạn có thể làm bằng cách sử dụng SQLcmd. bạn đã chạy theo lệnh nhập mô tả hình ảnh ở đây


2
Bạn có thể chỉ ra cách trả lời này khác với các câu trả lời khác của câu hỏi này không. Ngoài ra, vui lòng sử dụng khối mã cho mã của bạn thay vì ảnh chụp màn hình.
Athafoud

c: \> sqlcmd -S. -E 1) EXEC sp_con \
arnav
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.