Net stop <service> ข้อผิดพลาดระบบ 5 ปฏิเสธการเข้าถึง


1

จาก SQL Server 2012 ฉันพยายามทำสิ่งนี้:

DECLARE @COMMAND nvarchar(4000)
SET @COMMAND = 'net stop <servicename>'
exec master.dbo.xp_cmdshell @COMMAND

ฉันได้รับข้อผิดพลาดระบบ 5 และการเข้าถึงถูกปฏิเสธว่าเป็นการตอบสนอง

บัญชีบริการ (ตรวจสอบด้วยwhoami) จะถูกเพิ่มไปยังผู้ดูแลระบบดังนั้นมีอะไรผิดพลาดอีกบ้าง?


เมื่อคุณไปถึง 'จาก SQLServer 2012' คุณหมายถึงจาก SQLServer Management Studio (ssms.exe) หรือไม่
Frank Thomas

ใช่ถ้าฉันใส่คำสั่งใน. bat หรือ. cmd และเรียกใช้จาก OS นั้นก็ใช้ได้ เมื่อฉันพยายามเรียกใช้จาก ssms ฉันได้รับข้อผิดพลาดเดียวกัน
Sjef

เรียกใช้ ssms ในฐานะผู้ดูแลระบบ
Frank Thomas

คำตอบ:


0

เรียกใช้ SQL Server 2012 ในฐานะผู้ดูแลระบบและปัญหาจะหายไป


บัญชีบริการที่กล่าวถึงมีสิทธิ์ของผู้ดูแลระบบ
Sjef

ใช่ แต่ถึงกระนั้นก็ต้องมีการใช้งานจริงในฐานะผู้ดูแล คุณต้องคลิกขวาที่โปรแกรมแล้วเลือก run as administrator เพื่อให้สิทธิ์พิเศษแก่แอปพลิเคชัน คุณสามารถเห็นการทำงานที่เหมือนกันหากคุณพยายามทำคำสั่งในหน้าต่างพรอมต์คำสั่ง แม้ว่าผู้ใช้ของคุณมีสิทธิ์ของผู้ดูแลระบบมันจะไม่ทำงานจนกว่าคุณจะเปิดใช้งานพรอมต์คำสั่งในฐานะผู้ดูแลระบบ มันเป็นสิ่งที่ UAC
LPChip

ในกรณีนี้ผู้ใช้ที่รันบริการ DB นั้นไม่สำคัญกับปัญหานี้ ปัญหาคือผู้ที่สามารถควบคุมบริการได้โดยเริ่ม / หยุด / แก้ไขบริการ การโจมตี SQL Injection จะหายนะหากผู้ใช้เก่าเพียงใดสามารถเรียกใช้งาน xp_cmdshell และโดยอาศัยการเข้าถึง SQLServers ที่ได้รับสิทธิพิเศษสามารถเรียกใช้คำสั่งโดยพลการในฐานะผู้ดูแลระบบเซิร์ฟเวอร์
Frank Thomas

0

อนุญาตให้ผู้ใช้ที่ไม่ใช่ sysadmin ดำเนินการxp_cmdshellจาก SSMS

ฉันช่วยแก้ไขปัญหาที่เราต้องการอนุญาตให้นักพัฒนาแอปเข้าถึงเพื่อดำเนินการxp_cmdshellจากภายในเซสชัน SSMS มากกว่า " Run as " จากSQL Agent Jobบนเซิร์ฟเวอร์การพัฒนาที่ไม่สำคัญโดยไม่ต้องให้เขาดูแลระบบบนอินสแตนซ์ของ SQL Server

สิ่งที่เราทำ

หมายเหตุ:บัญชีผู้ใช้โดเมนสามารถถูกแทนที่ด้วยบัญชีกลุ่มงานบัญชีเครื่องภายใน ฯลฯ

สำคัญ:คุณต้องเข้าใจถึงความเสี่ยงในการอนุญาตให้ผู้ใช้ในสภาพแวดล้อมการใช้งานคำสั่งระดับ OS และคุณควรให้สิทธิ์ระดับนี้xp_cmdshellแก่ผู้ที่เชื่อถือได้เพียงพอกับความปลอดภัยระดับนี้ด้วยวิธีพร็อกซี

  1. สร้างบัญชีผู้ใช้โดเมนใหม่ด้วยรหัสผ่านที่รัดกุมและจดชื่อผู้ใช้และรหัสผ่าน ตรวจสอบให้แน่ใจว่าบัญชีถูกเปิดใช้งานและรหัสผ่านถูกตั้งค่าให้ไม่มีวันหมดอายุ

  2. สร้างการเข้าสู่ระบบเซิร์ฟเวอร์ SQLใหม่ซึ่งเชื่อมโยงกับบัญชีผู้ใช้โดเมนใหม่ที่เราสร้าง

  3. สร้างหนังสือรับรองพร็อกซีใหม่ที่เชื่อมโยงกับบัญชีผู้ใช้โดเมน

    EXEC sp_xp_cmdshell_proxy_account '<Domain>\<NewUser>', '<password>' -- you have to type actual password
    
  4. จริงอยู่ที่ว่าSQL Server เข้าสู่ระบบอย่างชัดเจนEXECUTEเข้าถึงระบบขยายเก็บไว้ proc จากMasterDB sys.xp_cmdshellชื่อ

    --see who all has execute access to xp_cmdshell   
    Use master                      
    EXEC sp_helprotect 'xp_cmdshell'
    
    
    -- To allow advanced options to be changed.
    EXEC sp_configure 'show advanced options', 1
    RECONFIGURE
    GO
    
    -- Enable the xp_cmdshell procedure
    EXEC sp_configure 'xp_cmdshell', 1
    RECONFIGURE
    GO
    
    -- Grant execute permissions to account
    GRANT EXECUTE ON xp_cmdshell TO [<Domain>\<NewUser>]
    
  5. ให้สิทธิ์คนที่ใช้ที่EXECUTE AS impersonateอนุญาตให้ใหม่SQL Server เข้าสู่ระบบ

    GRANT IMPERSONATE ON LOGIN::[<Domain>\<NewUser>] TO [<Domain>\<UserGrantingExecuteAsUser>]
    
  6. ตอนนี้รันคำสั่งด้วยEXECUTE AS LOGINและส่งnet stopคำสั่งไปยังxp_cmdshellโพรซีเดอร์ที่เก็บไว้ หลักการความปลอดภัยตามที่ระบุไว้ในขั้นตอน # 5 ด้านบนใน<Domain>\<UserGrantingExecuteAsUser>ควรเป็นของบุคคลที่คุณกำลังเรียกใช้ SSMS เป็นบริบทการรักษาความปลอดภัยที่ชาญฉลาดสำหรับงานนี้

    EXECUTE AS LOGIN = '<Domain>\<NewUser>'
    DECLARE @COMMAND nvarchar(4000)
    SET @COMMAND = 'net stop <servicename>'
    EXEC xp_cmdshell @COMMAND
    REVERT
    

แหล่งข้อมูลเพิ่มเติม

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