เปิดใช้งานเซิร์ฟเวอร์ SQL 'xp_cmdshell'


177

ฉันต้องการที่จะดำเนินการ EXEC master..xp_cmdshell @bcpquery

แต่ฉันได้รับข้อผิดพลาดต่อไปนี้:

SQL Server บล็อกการเข้าถึงโพรซีเดอร์ 'sys.xp_cmdshell' ของคอมโพเนนต์ 'xp_cmdshell' เนื่องจากคอมโพเนนต์นี้ถูกปิดเป็นส่วนหนึ่งของการกำหนดค่าความปลอดภัยสำหรับเซิร์ฟเวอร์นี้ ผู้ดูแลระบบสามารถเปิดใช้งาน 'xp_cmdshell' ได้โดยใช้ sp_configure สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการเปิดใช้งาน 'xp_cmdshell' ให้ดูที่ "การกำหนดค่าพื้นที่ Surface" ใน SQL Server Books Online

มีวิธีใดบ้างที่จะเปิดใช้งานสิ่งนี้หรือดำเนินการบางอย่างก่อนเปิดใช้งานคุณลักษณะนี้

วิธีแก้ปัญหา

คำตอบ:


370

คุณต้องเปิดใช้งาน ตรวจสอบส่วนการอนุญาตของเอกสาร xp_cmdshell MSDN :

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

2
ทำงานได้ดีเรียบง่ายและมีประสิทธิภาพ!
indofraiser

2
ตรวจสอบให้แน่ใจว่าคุณดำเนินการ SQL Management Studio ในฐานะผู้ดูแลระบบ
ฮาอิมรามาน

ขอบคุณสำหรับความช่วยเหลือที่ยอดเยี่ยม กำลังมองหาวิธีแก้ปัญหาสำหรับวัน
Mohan Rajput

2
ความปลอดภัย - เปิดใช้งาน แต่ระวัง! โปรดทราบ: นี่
เลื่อย

39

คุณสามารถซ่อนตัวเลือกขั้นสูงอีกครั้งหลังจากกำหนดค่าใหม่:

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

คลิกขวาที่เซิร์ฟเวอร์ -> Facets -> การตั้งค่าพื้นที่ผิว -> XPCmshellEnbled -> จริง ป้อนคำอธิบายรูปภาพที่นี่


9

ตามที่ระบุไว้ในคำตอบอื่น ๆ เคล็ดลับ (ใน SQL 2005 หรือหลังจากนั้น) คือการเปลี่ยนการตั้งค่าระดับโลกshow advanced optionsและxp_cmdshellไป1ในลำดับที่

การเพิ่มลงในสิ่งนี้หากคุณต้องการรักษาค่าก่อนหน้านี้คุณสามารถอ่านค่าได้ก่อนจากsys.configurationsนั้นจึงนำไปใช้ในลำดับย้อนกลับที่ส่วนท้าย เราสามารถหลีกเลี่ยงการreconfigureโทรที่ไม่จำเป็น:

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

โปรดทราบว่าสิ่งนี้อาศัย SQL Server เวอร์ชัน 2005 หรือใหม่กว่า (คำถามเดิมคือสำหรับปี 2008)


4

ในขณะที่คำตอบที่ได้รับการยอมรับจะทำงานได้เกือบทุกครั้งฉันได้พบ (ยังไม่ทราบสาเหตุ) บางกรณีที่ไม่ได้ การแก้ไขเล็กน้อยของแบบสอบถามโดยใช้WITH OVERRIDEin RECONFIGUREช่วยแก้ปัญหา

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

ผลลัพธ์ที่คาดหวังคือ

ตัวเลือกการกำหนดค่า 'แสดงตัวเลือกขั้นสูง' เปลี่ยนจาก 0 เป็น 1 เรียกใช้คำสั่ง RECONFIGURE เพื่อติดตั้ง
ตัวเลือกการกำหนดค่า 'xp_cmdshell' เปลี่ยนจาก 0 เป็น 1 เรียกใช้คำสั่ง RECONFIGURE เพื่อติดตั้ง


4

แม้ว่าคำถามนี้จะได้รับการแก้ไข แต่ฉันต้องการเพิ่มคำแนะนำของฉันเกี่ยวกับเรื่องนั้น .... เนื่องจากในฐานะนักพัฒนาที่ฉันเพิกเฉย

สิ่งสำคัญคือต้องรู้ว่าเรากำลังพูดถึง MSSQL xp_cmdshell ที่เปิดใช้งานมีความสำคัญต่อความปลอดภัยตามที่ระบุไว้ในคำเตือนข้อความ:

Blockquote SQL Server บล็อกการเข้าถึงโพรซีเดอร์ 'sys.xp_cmdshell' ของคอมโพเนนต์ 'xp_cmdshell' เนื่องจากคอมโพเนนต์นี้ถูกปิดเป็นส่วนหนึ่งของการกำหนดค่าความปลอดภัยสำหรับเซิร์ฟเวอร์นี้ [ ... ]

การปล่อยให้บริการเปิดใช้งานเป็นจุดอ่อนชนิดหนึ่งตัวอย่างเช่นในเว็บแอพอาจสะท้อนและดำเนินการคำสั่ง SQL จากผู้โจมตี CWE-89 ที่ได้รับความนิยม: SQL Injectionอาจเป็นจุดอ่อนในซอฟต์แวร์ของเราและดังนั้นสถานการณ์ประเภทนี้สามารถปูทางไปสู่การโจมตีที่เป็นไปได้เช่นCAPEC-108 :Command Line Execution through SQL Injection

ฉันหวังว่าจะทำสิ่งที่ถูกใจเราผู้พัฒนาและวิศวกรทำสิ่งต่าง ๆ ด้วยความตระหนักรู้และเราจะปลอดภัยยิ่งขึ้น!


0

สำหรับฉันวิธีเดียวใน SQL 2008 R2 คือ:

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

-1

คุณสามารถทำได้โดยใช้ SQLcmd คุณได้รันคำสั่งต่อไปนี้ ป้อนคำอธิบายรูปภาพที่นี่


2
คุณช่วยแสดงให้เห็นว่าคำตอบนี้แตกต่างจากผู้ใช้อื่นของคำถามนี้ได้อย่างไร นอกจากนี้โปรดใช้การบล็อกรหัสสำหรับรหัสของคุณแทนภาพหน้าจอ
Athafoud

c: \> sqlcmd -S -E 1) EXEC sp_con \
arnav
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.