SQL Injection Attack หมายถึงการใช้ประโยชน์จากช่องโหว่การออกแบบเรียกใช้คำสั่ง SQL บนเซิร์ฟเวอร์เป้าหมายและการโจมตีอื่น ๆ
เหตุผลหลักว่าทำไมการโจมตีการฉีด SQL จึงประสบความสำเร็จเมื่อสร้างคำสั่ง SQL แบบไดนามิก
ตัวอย่างเช่น:
หากคำสั่งการสืบค้นของคุณเลือก * จากผู้ดูแลระบบที่ชื่อผู้ใช้ = '"& ผู้ใช้ &"' และรหัสผ่าน = '"PWD &"' "
จากนั้นถ้าชื่อผู้ใช้ของฉันคือ: 1 'หรือ' 1 '=' 1
จากนั้นคำสั่งค้นหาของคุณจะกลายเป็น:
เลือก * จากผู้ดูแลระบบโดยที่ชื่อผู้ใช้ = '1 หรือ' 1 '=' 1 'และรหัสผ่าน =' "PWD &" '"
ด้วยวิธีนี้คำสั่งค้นหาของคุณจะถูกส่งผ่านและคุณสามารถป้อนอินเทอร์เฟซการจัดการของคุณ
ดังนั้นเมื่อป้องกันคุณต้องตรวจสอบอินพุตของผู้ใช้ อักขระพิเศษพิเศษเช่นคำพูดเดียว, คำพูดสองครั้ง, เครื่องหมายอัฒภาค, เครื่องหมายจุลภาค, โคโลยอน, การเชื่อมต่อ ฯลฯ ได้รับการแปลงหรือกรอง
อักขระพิเศษและสตริงที่ต้องกรองคือ:
ผู้ใช้สุทธิ
xp_cmdshell
/เพิ่ม
Exec Master.dbo.xp_cmdshell
ผู้ดูแลระบบ LocalGroup สุทธิ
เลือก
นับ
ASC
ถ่าน
กลาง
-
-
-
แทรก
ลบออก
โต๊ะวาง
อัปเดต
ตัด
จาก
-
ด้านล่างนี้เป็นรหัสป้องกันสองรหัสที่ฉันเขียนเกี่ยวกับการแก้ปัญหาการโจมตีการฉีดสำหรับการอ้างอิงการเรียนรู้ของคุณ!
รหัสโจมตี SQL Injection reple ~:::
[รหัสเริ่มต้น]
<ภาษาสคริปต์ = "JavaScript">
-
var url = location.search;
var re =/^/? (.*) (เลือก%20 | แทรก%20 | ลบ%20 จาก%20 | count/(| drop%20table | อัปเดต%20trate%20 | ASC/(| Mid/(| Char/(| (| XP_CMDSHELL | EXEC%20MASTER | NET%20LOCALGROUP%20AdMinistrators |/"|: | NET%20USER |/'|%20OR%20) (.*) $/GI;
var e = re.test (url);
ถ้า (e) {
การแจ้งเตือน ("ที่อยู่มีอักขระที่ผิดกฎหมาย ~");
location.href = "error.asp";
-
-
<script>
[รหัสสิ้นสุด]
รหัส ASP เวอร์ชันเพื่อป้องกันการโจมตีการฉีด SQL ~:
[รหัสเริ่มต้น]
-
เมื่อเกิดข้อผิดพลาดต่อไป
Dim strtemp
ถ้า lcase (request.serverVariables ("https")) = "ปิด" แล้ว
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 & "?"
strtemp = lcase (strtemp)
ถ้า instr (strtemp, "select%20") หรือ instr (strtemp, "แทรก%20") หรือ strtemp, "ลบ%20 จาก") หรือ strtemp, "count (") หรือ strtemp, "ลดลง" %20table ") หรือ Instr (strtemp," Update%20 ") หรือ Instr (strtemp," truncate%20 ") หรือ instr (strtemp," asc (") หรือ strtemp," mid (") หรือ strtemp (strtemp , "char (") หรือ strtemp, "xp_cmdshell") หรือ Instr (strtemp, "exec%20master") หรือ instr (strtemp, "net%20localgroup%20 ผู้ดูแลระบบ") หรือ instr (strtemp, ":") หรือ strtemp, "net%20user") หรือ instr (strtemp, "'') ") หรือ instr (strtemp,"%20or%20 ") แล้ว
Response.write "<script Language = 'JavaScript'>"
Response.write "Alert ('ที่อยู่ผิดกฎหมาย !!');"
Response.write "location.href = 'error.asp';"
Response.write "<script>"
สิ้นสุดถ้า
-
[รหัสสิ้นสุด]
C# ตรวจสอบสตริงเพื่อป้องกันการโจมตีการฉีด SQL
ในตัวอย่างนี้มีการระบุอย่างไม่แน่นอนว่าเป็น = 'ตัวเลข
bool checkparams (params object [] args)
-
String [] Lawlesses = {"=", "'"};
if (Lawlesses == null || lawlesses.length <= 0) คืนค่าจริง;
// สร้างนิพจน์ปกติตัวอย่าง: Lawlesses คือเครื่องหมาย = และ 'เครื่องหมายจากนั้นนิพจน์ทั่วไปคือ.* [=}'].* (สำหรับเนื้อหาที่เกี่ยวข้องของนิพจน์ทั่วไปโปรดดู MSDN)
// นอกจากนี้เนื่องจากฉันต้องการทำฟังก์ชั่นทั่วไปและง่ายต่อการปรับเปลี่ยนฟังก์ชั่นฉันมีขั้นตอนอื่นจากอาร์เรย์อักขระไปยังนิพจน์ทั่วไป
string str_regex = ".*[";
สำหรับ (int i = 0; i <lawlesses.length-1; i ++)
str_regex+= lawlesses [i]+"|";
str_regex+= lawlesses [lawlesses.length-1]+"].*";
-
foreach (วัตถุ Arg ใน args)
-
if (arg เป็นสตริง) // ถ้าเป็นสตริงให้ตรวจสอบโดยตรง
-
if (regex.matches (arg.toString (), str_regex) .count> 0)
กลับเท็จ;
-
ถ้า (arg คือ icollection) // ถ้าเป็นคอลเลกชันให้ตรวจสอบว่าองค์ประกอบในคอลเลกชันเป็นสตริงหรือไม่
-
foreach (Object obj in (icollection) arg)
-
ถ้า (obj เป็นสตริง)
-
if (regex.matches (obj.toString (), str_regex) .count> 0)
กลับเท็จ;
-
-
-
-
กลับมาจริง;