โดยทั่วไปแล้วการโจมตีทางเว็บในปัจจุบันจะเป็นการโจมตีแบบพุ่งกระฉูด สาเหตุของการฉีดโดยทั่วไปคือการกรองตัวแปรที่ไม่สมบูรณ์ ซึ่งทำให้ผู้บุกรุกสามารถรันโปรแกรมหรือสืบค้นและแก้ไขข้อมูลโดยอำเภอใจอย่างผิดกฎหมาย เมื่อการโจมตีแบบฉีดเริ่มรุนแรงมากขึ้นเรื่อยๆ รหัสการกรองพิเศษบางอย่างก็เกิดขึ้น อย่างไรก็ตาม ความไม่สมบูรณ์ในโค้ดการกรองบางตัวอาจทำให้เกิดการโจมตีครั้งใหม่ได้ ข้อมูลต่อไปนี้ใช้โค้ดกรองที่ใช้กันอย่างแพร่หลาย - โปรแกรมต่อต้านการฉีดสากล SQL - เพื่ออธิบายสาเหตุ วิธีการใช้งาน และมาตรการป้องกันช่องโหว่
โปรแกรมต่อต้านการฉีดสากลของ SQL เขียนโดย Feng Zhiqiu จาก Firefox มันเป็นรหัสต่อต้านการฉีดที่ค่อนข้างสมบูรณ์ สามารถใช้การกรองการส่งสำหรับอักขระตัวกรองที่กำหนด และสามารถบันทึกข้อมูลข้อมูลที่ส่งโดย IP ของผู้โจมตี เมื่อใช้งาน คุณจะต้องเพิ่มโค้ด <--#Include File="WrSky_Sql.Asp"--> ไปที่ส่วนหัวของไฟล์เพื่อป้องกันการแทรกเพื่อให้สามารถกรองตัวแปรได้ หากคุณเพิ่มโค้ดโปรแกรมหลังไฟล์การเชื่อมต่อฐานข้อมูล (เช่น conn.asp) คุณสามารถทำการกรองตัวแปรของทั้งไซต์ได้ ดังนั้นจึงบรรลุผลการป้องกันการฉีด
เอาล่ะ มาดูโค้ดของส่วนการกรองตัวแปรกันก่อน:
'--------Definition part------------------
หรี่ Fy_Post, Fy_Get, Fy_In, Fy_Inf, Fy_Xh, Fy_db, Fy_dbstr
'ปรับแต่งสตริงที่ต้องการกรองโดยคั่นด้วย "เมเปิ้ล"
Fy_In = "' เมเปิ้ล; เมเปิ้ลและเมเปิ้ล exec เมเปิ้ลแทรก เมเปิ้ลเลือกเมเปิ้ล ลบการอัปเดตเมเปิ้ล นับเมเปิ้ล เมเปิ้ล * เมเปิ้ล% เมเปิ้ล chr เมเปิ้ลกลางเมเปิ้ลต้นแบบเมเปิ้ลตัดทอนเมเปิ้ลชาร์เมเปิ้ลประกาศ"
-
-
Fy_Inf = แยก (Fy_In, "เมเปิ้ล")
'--------ส่วนโพสต์------------------
หากขอแบบฟอร์ม<>จากนั้น
สำหรับแต่ละ Fy_Post ในคำขอ แบบฟอร์ม
สำหรับ Fy_Xh=0 ถึง Ubound(Fy_Inf)
ถ้า Instr(LCase(Request.Form(Fy_Post)),Fy_Inf(Fy_Xh))<>จากนั้น
'--------รับส่วนหนึ่ง--------
ถ้า Request.QueryString<>จากนั้น
สำหรับแต่ละ Fy_Get ใน Request.QueryString
สำหรับ Fy_Xh=0 ถึง Ubound(Fy_Inf)
ถ้า Instr(LCase(Request.QueryString(Fy_Get)),Fy_Inf(Fy_Xh))<>จากนั้น
โค้ดนี้จะกำหนดการกรองของตัวแปรที่ฉีดโดยทั่วไป เช่น "'", "และ" ฯลฯ หากคุณรู้สึกว่าการกรองไม่ใช่ เพียงพอหรือมากไปก็ทำเองได้ บวกหรือลบตัวอักษร เห็นได้ชัดว่าตราบใดที่ข้อมูลที่ส่งไปยังเซิร์ฟเวอร์ผ่านการรับหรือโพสต์มีอักขระที่ถูกกรอง โปรแกรมจะถูกห้าม สิ่งนี้นำไปสู่ปัญหา หากคุณเพิ่มโค้ดโปรแกรมหลังไฟล์การเชื่อมต่อฐานข้อมูลของฟอรัม ตราบใดที่เนื้อหาของโพสต์มีอักขระที่ถูกกรอง เนื้อหานั้นจะถูกแบน ตามค่าเริ่มต้นของการกรองเนื้อหา ดูเหมือนว่าแทบจะเป็นไปไม่ได้เลยที่จะโพสต์หากเนื้อหาเป็นภาษาอังกฤษ นอกจากนี้ บางครั้งมีการใช้อักขระพิเศษ (เช่น เครื่องหมายเปอร์เซ็นต์ "%) เมื่อกำหนดรูปแบบฟอรัม หากกรองอักขระพิเศษเหล่านี้ ฟอรัมทั้งหมดจะทำงานไม่ถูกต้อง จากปัญหาที่กล่าวมาข้างต้น ฉันใช้ dvbbs เพื่อทดสอบ และผลลัพธ์ก็เป็นไปตามที่ฉันคาดหวังไว้
วิธีแก้ไขปัญหาข้างต้นคือการป้องกันการฉีดคำสั่งการเชื่อมต่อเฉพาะในไฟล์ที่ต้องการกรองเท่านั้น แต่ภาระงานนี้มีค่อนข้างมาก และโดยทั่วไปผู้ดูแลเว็บไม่ทราบว่าต้องกรองไฟล์ใดบ้าง ดังนั้นข้อเสนอแนะของผมคือให้เพิ่มโค้ดการกรองไปที่ conn.asp จากนั้นสร้าง connl.asp ที่ไม่มีโค้ดการกรอง และเชื่อมต่อไฟล์ที่ไม่จำเป็นต้องกรองอย่างแน่นอน และโค้ดการกรองมีผลกระทบต่อการทำงานของ ไฟล์นี้เพื่อ conn1.asp แต่คุณต้องทราบว่าเนื้อหาพื้นฐานของไฟล์การเชื่อมต่อข้อมูลทั้งสองจะต้องสอดคล้องกัน นอกจากนี้ เป็นการดีที่สุดที่จะไม่ใช้อักขระที่ถูกกรองในการตั้งค่ารูปแบบ หากคุณต้องการใช้อักขระเหล่านี้จริงๆ คุณสามารถลบการกรองอักขระเหล่านี้ในโปรแกรมป้องกันการฉีดได้
ข้อมูลข้างต้นเป็นเรื่องเกี่ยวกับผลกระทบของโปรแกรมป้องกันการฉีดยาต่อการทำงานของไซต์งาน และจะไม่ก่อให้เกิดอันตรายใดๆ ความจริงแล้วอันตรายที่แท้จริงมาจากส่วนการบันทึกข้อมูล ลองดูที่ส่วนนี้ของโค้ด:
''--------เขียนไปยังฐานข้อมูล-------ส่วนหัว---- ----
Fy_dbstr="DBQ="+server.mappath("SqlIn.mdb")+";DefaultDir=;DRIVER={โปรแกรมควบคุมการเข้าถึง Microsoft (*.mdb)};"
ตั้งค่า Fy_db=Server.CreateObject("ADODB.CONNECTION")
Fy_db.open Fy_dbstr
Fy_db.Execute("insert into SqlIn(Sqlin_IP,SqlIn_Web,SqlIn_FS,SqlIn_CS,SqlIn_SJ) ค่า('"&Request.ServerVariables("REMOTE_ADDR")&"','"&Request.ServerVariables("URL")&"',' GET','"&Fy_Get&"','"&replace(Request.QueryString(Fy_Get),"'","''")&"')")
Fy_db.ปิด
ตั้งค่า Fy_db = ไม่มีเลย
'--------เขียนไปยังฐานข้อมูล-------หาง--------
Response.Write "<Script Language=JavaScript>alert('Fengwang SQL universal anti-injection system prompt↓ nnโปรดอย่าพยายามใส่อักขระที่ผิดกฎหมายในพารามิเตอร์ nnHTTP://WwW.WrSkY.CoM เวอร์ชันของระบบ: V2.0 (ASP) เวอร์ชันที่สมบูรณ์แบบ');<สคริปต์>
ตอบกลับเขียนว่า "การดำเนินการที่ผิดกฎหมาย! ระบบได้สร้างบันทึกต่อไปนี้↓<br><"
Response.Write "Operation IP:"&Request.ServerVariables("REMOTE_ADDR")&"<br>"
ตอบกลับเขียน "เวลาดำเนินการ:"&ตอนนี้&"<br>
response.Write "หน้าการดำเนินการ:"&Request.ServerVariables("URL")&"<br>"
ตอบกลับเขียน "วิธีการส่ง: GET<br>"
การตอบสนองเขียน "ส่งพารามิเตอร์:"&Fy_Get&"<br>"
Response.Write "ส่งข้อมูล:"&Request.QueryString(Fy_Get)
การตอบสนองสิ้นสุด
สิ้นสุดถ้า
ต่อไป
ต่อไป
สิ้นสุดถ้า
'---------------------------------
หน้าที่ของโค้ดนี้คือการบันทึกข้อมูลและการกระทำของผู้โจมตี ว่าเราสามารถใช้มาตรการรับมือที่จำเป็นได้ จะเห็นได้จากโค้ดที่โปรแกรมบันทึก IP ของผู้โจมตี ที่อยู่การส่ง เนื้อหาที่ส่ง ฯลฯ แต่มีช่องโหว่หลายประการที่นี่:
1. การโจมตีบ่อยครั้งไม่ได้รับการประมวลผล กล่าวอีกนัยหนึ่ง ไม่ว่าเราจะส่งข้อมูลทางกฎหมายอย่างไร ข้อมูลดังกล่าวจะถูกบันทึกโดยโปรแกรม ซึ่งมักจะนำไปสู่การโจมตี DOS ที่เป็นอันตราย ฉันทำการทดลองเกี่ยวกับเรื่องนี้ ฉันส่งคำสั่งต่อไปนี้หลังจาก URL ของไฟล์ที่ได้รับการป้องกัน: และ (เลือกด้านบน l asc(mid (ชื่อผู้ใช้,l,l)) จากผู้ดูแลระบบ)>0 ใช้ตัวช่วยสร้างคีย์เพื่อบันทึกกระบวนการส่ง จากนั้นทำซ้ำโดยอัตโนมัติ การส่ง หลังจากนั้นไม่นาน ขนาดฐานข้อมูลก็เปลี่ยนไปอย่างมาก (ดังแสดงในรูปที่ 1 และ 2) ดังที่คุณสามารถจินตนาการได้ หากคุณใช้เครื่องมือเช่น Shuoxue เพื่อเปิดใช้งานการส่งแบบหลายเธรด DOS ก็จะไม่เป็นปัญหาอย่างแน่นอน
รูปที่ 1
รูปที่ 2
2. ความยาวข้อมูลบันทึกไม่ถูกตัดทอน นี่คือสิ่งที่ฉันค้นพบระหว่างการทดสอบโปรแกรมป้องกันการฉีดที่ส่งผลต่อการทำงานของฟอรัม ดังแสดงในรูปที่ 3 หากเนื้อหาโพสต์มีอักขระที่ถูกกรอง เนื้อหาโพสต์จะถูกบันทึกลงในฐานข้อมูลอย่างสมบูรณ์ กระดานสนทนาหรือระบบบทความทั่วไปมีการจำกัดความยาวของบทความที่เผยแพร่ แต่โปรแกรม SQL anti-injection ไม่ได้กำหนดข้อจำกัดใดๆ เกี่ยวกับเรื่องนี้ หากผู้โจมตีส่งเนื้อหาที่ยาวเกินไปหลังจาก URL ของไฟล์ที่ได้รับการป้องกัน ก็มีแนวโน้มที่จะทำให้โปรแกรมขัดข้อง เนื่องจากความเสียหายค่อนข้างสูง ฉันจึงไม่ได้ทดสอบ แต่เนื้อหาที่ฉันส่งมากถึง 100K จะถูกบันทึกตามปกติ
รูปที่ 3
3. ปัญหาการแปลงเนื้อหาข้อมูลและการระเบิดของฐานข้อมูล เมื่อพิจารณาจากโค้ด โปรแกรมจะบันทึกข้อมูลที่ส่งอย่างผิดกฎหมายลงในฐานข้อมูลโดยตรงโดยไม่มีการแปลง กล่าวอีกนัยหนึ่ง ไม่ว่าคุณจะส่งอะไร ตราบใดที่มีเนื้อหาที่ถูกกรอง โปรแกรมจะบันทึกเนื้อหาทั้งหมดที่คุณส่ง ปัญหานี้ไม่ได้ร้ายแรงในตอนแรก แต่เพื่อประโยชน์ของ "ความปลอดภัย" เว็บมาสเตอร์บางคนต้องการเปลี่ยนไฟล์ mdb ทั้งหมดเป็นคำต่อท้าย asp นอกจากนี้ ฐานข้อมูลของโปรแกรมต่อต้านการฉีดมีเพียงตารางเดียว ดังนั้นเราจึงสามารถรับ webshell ได้โดยการเขียน URL ของไฟล์ที่ได้รับการป้องกันไปยังฐานข้อมูลโดยตรง ในระหว่างกระบวนการทดสอบ เราได้เปลี่ยน sqlin.mdb เป็น sqlin.asp จากนั้นเพิ่ม หลังจากป้อน URL ของไฟล์ที่ได้รับการป้องกันแล้ว จะมีการป้อนแบ็คดอร์ Binglangzi micro ASP หลังจากเชื่อมต่อกับไคลเอนต์ Ice Fox แล้ว ก็รับ wedshll ได้สำเร็จ
เนื่องจากวิธีการรับ webshell นี้ต้องการให้แน่ใจว่าฐานข้อมูลของอีกฝ่ายทำงานในรูปแบบ ASP และรู้เส้นทางข้อมูล เราจึงต้องค้นหาวิธีรับเส้นทางของฐานข้อมูลนี้ ภายใต้สถานการณ์ปกติ เราสามารถคาดเดาเส้นทางของฐานข้อมูลได้โดยตรง แต่ในความเป็นจริงแล้ว เส้นทางนี้สามารถเปิดเผยได้ เมื่อพิจารณาจากโปรแกรมป้องกันการฉีดทั้งหมด เราไม่พบคำสั่งไลบรารีที่ป้องกันการระเบิด ดังนั้นเราจึงจำเป็นต้องเข้าถึงหรือใช้งานโดยตรงเท่านั้น วิธีการ %5C ฐานข้อมูลถูกเปิดเผย หากโค้ดโปรแกรมถูกวางไว้หลังไฟล์การเชื่อมต่อฐานข้อมูลโดยตรง เนื่องจากโดยทั่วไปไฟล์การเชื่อมต่อข้อมูลจะมีคำสั่งป้องกันการระเบิด เราจึงไม่สามารถเปิดเผยที่อยู่ของฐานข้อมูลได้
ที่กล่าวมาข้างต้นล้วนเป็นปัญหาในกระบวนการบันทึกข้อมูล เว็บมาสเตอร์ที่มีความสามารถสามารถแก้ไขช่องโหว่ที่เกี่ยวข้องได้ด้วยตนเอง เช่น การบล็อก IP โดยอัตโนมัติสำหรับการส่งข้อมูลซ้ำจำนวนมาก ในความเป็นจริงเราสามารถลบส่วนที่บันทึกข้อมูลของโค้ดได้อย่างสมบูรณ์ ซึ่งจะไม่ส่งผลกระทบต่อการกรองตัวแปร และแม้ว่าข้อมูลของผู้โจมตีจะถูกบันทึก แต่ก็จะไม่มีประโยชน์มากนัก ดังนั้นผมขอแนะนำว่าควรลบโค้ดนี้ออกดีที่สุด เพื่อไม่ให้ช่องโหว่ทั้งหมดเกิดขึ้นอีกต่อไป
โอเค แค่นั้นแหละสำหรับบทความนี้ สุดท้ายนี้ ฉันอยากจะเตือนคุณว่าเมื่อใช้โปรแกรมป้องกันความปลอดภัย คุณควรใส่ใจกับปัญหาด้านความปลอดภัยของตัวโปรแกรมด้วย
คำเตือนพิเศษ: โปรแกรมต่อต้านการฉีด 3.0 ก็มีช่องโหว่เช่นกัน ช่องโหว่มีความร้ายแรงมากขึ้น