การโจมตีแบบแทรก SQL หมายถึงการใช้ประโยชน์จากช่องโหว่ในการออกแบบเพื่อรันคำสั่ง Sql บนเซิร์ฟเวอร์เป้าหมายและทำการโจมตีอื่นๆ เพื่อสร้างคำสั่ง Sql แบบไดนามิกโดยไม่ต้องตรวจสอบข้อมูลที่ป้อนโดยผู้ใช้ นี่คือเหตุผลหลักที่ทำให้การโจมตีแบบแทรก Sql ประสบความสำเร็จ
ตัวอย่างเช่น:
หากคำสั่งแบบสอบถามของคุณเลือก * จากผู้ดูแลระบบโดยที่ชื่อผู้ใช้=''"&user&"'' และรหัสผ่าน=''"&pwd&"''"
ดังนั้น หากชื่อผู้ใช้ของฉันคือ: 1'' หรือ ''1''=''1
จากนั้นข้อความค้นหาของคุณจะกลายเป็น:
เลือก * จากผู้ดูแลระบบโดยที่ชื่อผู้ใช้=''1 หรือ ''1''=''1'' และรหัสผ่าน=''"&pwd&"''"
ด้วยวิธีนี้ ข้อความค้นหาของคุณจะผ่าน และคุณสามารถเข้าสู่อินเทอร์เฟซการจัดการของคุณได้
ดังนั้น ข้อมูลของผู้ใช้จึงต้องได้รับการตรวจสอบเมื่อใช้ความระมัดระวัง แปลงหรือกรองอักขระพิเศษบางตัว เช่น เครื่องหมายคำพูดเดี่ยว เครื่องหมายคำพูดคู่ อัฒภาค เครื่องหมายจุลภาค ทวิภาค หมายเลขการเชื่อมต่อ ฯลฯ
อักขระพิเศษและสตริงที่ต้องกรองคือ:
ผู้ใช้เน็ต
xp_cmdshell
/เพิ่ม
ดำเนินการ master.dbo.xp_cmdshell
ผู้ดูแลระบบกลุ่มท้องถิ่นสุทธิ
เลือก
นับ
รศ
ถ่าน
กลาง
-
-
-
แทรก
ลบออกจาก
วางตาราง
อัปเดต
ตัด
จาก
%
ต่อไปนี้เป็นรหัสป้องกันสองรหัสที่ฉันเขียนเกี่ยวกับการแก้ไขการโจมตีแบบฉีดเพื่อเป็นข้อมูลอ้างอิงของคุณ!
รหัสเวอร์ชัน js เพื่อป้องกันการโจมตีแบบฉีด SQL:
<ภาษาสคริปต์ = "****">
-
var url = location.search;
var re=/^?(.*)(select%20|insert%20|delete%20from%20|count(|drop%20table|update%20truncate%20|asc(|mid(|char) (|xp_cmdshell|exec%20master|net%20localgroup%20administrators|"|../../image/bbs3000/whatchutalkingabout_smile.gifnet%20user|''|%20or%20)(.*)$/gi;
var e = re.test(url);
ถ้า(จ) {
alert("ที่อยู่มีอักขระที่ผิดกฎหมาย~");
location.href="error.asp";
-
-
<สคริปต์>
[สิ้นสุดโค้ด]
รหัสเวอร์ชัน ASP เพื่อป้องกันการโจมตีแบบฉีด SQL ~:
[รหัสเริ่มต้น]
-
เมื่อเกิดข้อผิดพลาด ดำเนินการต่อต่อไป
Dim strTemp
ถ้า LCase(Request.ServerVariables("HTTPS")) = "off" จากนั้น
strTemp = "http://"
อื่น
strTemp = "https://"
สิ้นสุดถ้า
strTemp = strTemp & Request.ServerVariables("SERVER_NAME")
ถ้า Request.ServerVariables("SERVER_PORT") <> 80 จากนั้น strTemp = strTemp & /// & Request.ServerVariables("SERVER_PORT")
strTemp = strTemp & Request.ServerVariables("URL")
ถ้า Trim(Request.QueryString) <> "" จากนั้น strTemp = strTemp & "?" & Trim(Request.QueryString)
strTemp = LCase(strTemp)
ถ้า Instr(strTemp,"select%20") หรือ Instr(strTemp,"insert%20") หรือ Instr(strTemp, "delete%20from") หรือ Instr(strTemp,"count(") หรือ Instr(strTemp,"drop%20table") หรือ Instr(strTemp,"update%20") หรือ Instr(strTemp,"truncate%20") หรือ Instr(strTemp,"asc(") หรือ Instr(strTemp,"mid(") หรือ Instr(strTemp,"char(") หรือ Instr(strTemp,"xp_cmdshell") หรือ Instr(strTemp,"exec%20master") หรือ Instr(strTemp,"net%20localgroup%20administrators") หรือ Instr(strTemp,///) หรือ Instr(strTemp,"net%20user") หรือ Instr(strTemp,"''") หรือ Instr(strTemp,"%20or %20") จากนั้น
การตอบสนองเขียน "<script language=''****''>"
ตอบกลับเขียน "alert(''ที่อยู่ผิดกฎหมาย!!'');"
การตอบสนองเขียน "location.href=''error.asp'';"
ตอบกลับเขียน "<script>"
สิ้นสุดถ้า
%>
ต่อไปนี้เป็นวิธีการป้องกันที่ค่อนข้างง่าย เหล่านี้เป็นวิธีที่ทุกคนคุ้นเคย หวังว่าฉันจะสามารถช่วยคุณได้ ~
ส่วนใหญ่สำหรับการถ่ายโอนตัวแปรตัวเลข:
id = Request.QueryString("id")
ถ้าไม่ใช่(isNumeric(id)) จากนั้น
ตอบกลับเขียน "ที่อยู่ผิดกฎหมาย~"
การตอบสนองสิ้นสุด
สิ้นสุดถ้า