การทดสอบสำหรับช่องโหว่ Injection ของ SQL

การโจมตีของ SQL Injection ก่อให้เกิดความเสี่ยงอย่างมากต่อแอ็พพลิเคชันเว็บที่ขึ้นอยู่กับแบ็กเอนด์ ฐานข้อมูล เพื่อสร้างเนื้อหาแบบไดนามิก ในการโจมตีประเภทนี้แฮกเกอร์สามารถจัดการแอปพลิเคชันบนเว็บด้วยการพยายามแทรกคำสั่ง SQL ของตนเองลงในส่วนที่ออกโดยฐานข้อมูล ตัวอย่างเช่นดูบทความการโจมตีแบบ Injection ของ SQL ในฐานข้อมูล ในบทความนี้เราจะดูหลายวิธีที่คุณสามารถทดสอบแอปพลิเคชันเว็บของคุณเพื่อพิจารณาว่ามีความเสี่ยงที่จะเกิดการโจมตี SQL Injection หรือไม่

การสแกน SQL แบบอัตโนมัติ

ความเป็นไปได้อย่างหนึ่งคือการใช้โปรแกรมสแกนช่องโหว่ของเว็บแอ็พพลิเคชันเช่น WebInspect ของ HP, AppScan ของ IBM หรือ Cenzic's Hailstorm เครื่องมือเหล่านี้มีวิธีง่ายๆในการวิเคราะห์แอ็พพลิเคชันเว็บของคุณโดยอัตโนมัติสำหรับช่องโหว่ SQL Injection ที่อาจเกิดขึ้น อย่างไรก็ตามพวกเขาค่อนข้างแพงทำงานได้ถึง $ 25,000 ต่อที่นั่ง

การทดสอบการฉีด SQL แบบแมนนวล

นักพัฒนาแอปพลิเคชันที่ไม่ดีจะทำอย่างไร จริงๆแล้วคุณสามารถใช้การทดสอบขั้นพื้นฐานเพื่อประเมินเว็บแอ็พพลิเคชันของคุณสำหรับช่องโหว่ SQL Injection โดยใช้อะไรมากกว่าเว็บเบราเซอร์ ประการแรกคำเตือน: การทดสอบที่ฉันอธิบายดูเฉพาะข้อบกพร่อง SQL Injection ขั้นพื้นฐาน พวกเขาจะไม่ตรวจพบเทคนิคขั้นสูงและน่าเบื่อบ้างที่จะใช้ หากคุณสามารถจ่ายได้ให้ไปกับสแกนเนอร์อัตโนมัติ อย่างไรก็ตามหากคุณไม่สามารถจัดการป้ายราคานั้นได้การทดสอบด้วยตนเองเป็นขั้นตอนแรกที่ยอดเยี่ยม

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

http://myfakewebsite.com/directory.asp?lastname=chapple&firstname=mike

เราสามารถสมมติได้ว่าหน้านี้ทำการค้นหาฐานข้อมูล โดยใช้แบบสอบถามที่ คล้ายกับข้อความต่อไปนี้:

เลือกโทรศัพท์จากไดเรกทอรี WHERE lastname = 'chapple' และ firstname = 'Mike'

ลองทดสอบสักหน่อย ด้วยสมมติฐานข้างต้นเราสามารถทำการเปลี่ยนแปลงง่ายๆใน URL ที่ทดสอบการโจมตีการสั่ง SQL:

http://myfakewebsite.com/directory.asp?lastname=chapple&firstname=mike'+AND+(select+count(*)+from+fake)+%3e0+OR+'1'%3d'1

หากแอ็พพลิเคชันเว็บไม่ได้รับการป้องกันอย่างถูกต้องจากการฉีด SQL เพียงแค่เสียบชื่อปลอมนี้ลงในคำสั่ง SQL ที่ทำงานกับฐานข้อมูลซึ่งส่งผลให้:

เลือกหมายเลขโทรศัพท์จากไดเรกทอรี WHERE lastname = 'chapple' และ firstname = 'mike' AND (นับเลือก (*) จากของปลอม)> 0 หรือ '1' = '1'

คุณจะสังเกตเห็นว่าไวยากรณ์ด้านบนแตกต่างไปจากที่อยู่ใน URL เดิมเล็กน้อย ฉันได้รับอิสรภาพในการแปลงตัวแปรที่มีการเข้ารหัส URL สำหรับเทียบเท่าของ ASCII เพื่อให้สามารถปฏิบัติตามตัวอย่างได้ง่ายขึ้น ตัวอย่างเช่น% 3d เป็น URL ที่เข้ารหัสสำหรับอักขระ '=' ฉันยังเพิ่มการแบ่งบรรทัดบางอย่างเพื่อวัตถุประสงค์ที่คล้ายกัน

การประเมินผลลัพธ์

การทดสอบเกิดขึ้นเมื่อคุณพยายามโหลดเว็บเพจโดยใช้ URL ที่ระบุไว้ด้านบน หากแอ็พพลิเคชันเว็บมีพฤติกรรมที่ดีจะเป็นการตัดคำพูดเดียวออกจากข้อมูลก่อนที่จะส่งแบบสอบถามไปยังฐานข้อมูล นี้ก็จะทำให้การค้นหาแปลกสำหรับคนที่มีชื่อแรกที่มีพวงของ SQL! คุณจะเห็นข้อความแสดงข้อผิดพลาดจากแอปพลิเคชันที่คล้ายกับข้อความด้านล่าง:

ข้อผิดพลาด: ไม่พบผู้ใช้ที่มีชื่อ mike + AND + (เลือก + count (+) + จาก + fake) +% 3e0 + OR + 1% 3d1 Chapple!

ในทางกลับกันถ้าแอพพลิเคชันมีความเสี่ยงที่จะถูกฉีด SQL จะส่งคำสั่งไปยังฐานข้อมูลโดยตรงส่งผลให้เกิดความเป็นไปได้สองทาง ขั้นแรกถ้าเซิร์ฟเวอร์ของคุณเปิดใช้งานข้อความแสดงข้อผิดพลาดโดยละเอียด (ซึ่งคุณไม่ควรใช้) คุณจะเห็นสิ่งต่างๆดังนี้:

ตัวให้บริการ Microsoft OLE DB สำหรับข้อผิดพลาดของโปรแกรมควบคุม ODBC '80040e37' [Microsoft] [ODBC SQL Server Driver] [SQL Server] ชื่อออบเจกต์ไม่ถูกต้อง 'fake' /directory.asp บรรทัดที่ 13

ในทางกลับกันหากเว็บเซิร์ฟเวอร์ของคุณไม่แสดงข้อความแสดงข้อผิดพลาดโดยละเอียดคุณจะได้รับข้อผิดพลาดทั่วไปเพิ่มเติมเช่น:

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

หากคุณได้รับข้อผิดพลาดสองข้อใดข้างต้นแอ็พพลิเคชันของคุณมีความเสี่ยงที่จะเกิดการโจมตีแบบ SQL injection! ขั้นตอนบางอย่างที่คุณสามารถทำได้เพื่อป้องกันแอพพลิเคชันของคุณจากการโจมตีของ SQL Injection ได้แก่