วิธีที่แฮกเกอร์เข้าครอบครองเว็บไซต์ด้วย SQL Injection และ DDoS
แม้ว่าคุณจะเพียงแค่ติดตามกิจกรรมของกลุ่มแฮ็กเกอร์ Anonymous และ LulzSec เพียงอย่างเดียวคุณอาจเคยได้ยินเกี่ยวกับเว็บไซต์และบริการที่ถูกแฮ็กเช่น Sony hacks ที่น่าอับอาย คุณเคยสงสัยบ้างไหมว่าพวกเขาทำได้อย่างไร?
มีเครื่องมือและเทคนิคหลายอย่างที่กลุ่มเหล่านี้ใช้และในขณะที่เราไม่ได้ให้คู่มือแก่คุณในการทำสิ่งนี้ด้วยตนเองมันมีประโยชน์ที่จะเข้าใจว่าเกิดอะไรขึ้น การโจมตีสองครั้งที่คุณได้ยินอย่างสม่ำเสมอเกี่ยวกับการใช้คือ“ (แจกจ่ายแล้ว) การปฏิเสธการบริการ” (DDoS) และ“ SQL Injections” (SQLI) นี่คือวิธีการทำงาน.
ภาพโดย xkcd
Denial of Service Attack
มันคืออะไร?
“ การปฏิเสธการให้บริการ” (บางครั้งเรียกว่าการโจมตี“ การปฏิเสธการให้บริการแบบกระจาย” หรือ DDoS) เกิดขึ้นเมื่อระบบในกรณีนี้เว็บเซิร์ฟเวอร์ได้รับการร้องขอจำนวนมากในครั้งเดียวที่ทรัพยากรเซิร์ฟเวอร์ล้นระบบเพียงแค่ล็อค และปิดตัวลง เป้าหมายและผลลัพธ์ของการโจมตี DDoS ที่ประสบความสำเร็จคือเว็บไซต์บนเซิร์ฟเวอร์เป้าหมายไม่สามารถใช้งานได้กับคำขอการรับส่งข้อมูลที่ถูกกฎหมาย.
มันทำงานยังไง?
ตัวอย่างของโลจิสติกส์ของการโจมตี DDoS อาจอธิบายได้ดีที่สุด.
ลองนึกภาพผู้คนนับล้าน (ผู้โจมตี) มารวมกันโดยมีเป้าหมายในการขัดขวางธุรกิจของ Company X ด้วยการทำคอลล์เซ็นเตอร์ของพวกเขา ผู้โจมตีประสานงานเพื่อให้ในวันอังคารเวลา 9.00 น. พวกเขาจะโทรไปที่หมายเลขโทรศัพท์ของ Company X เป็นไปได้ว่าระบบโทรศัพท์ของ Company X จะไม่สามารถจัดการการโทรได้นับล้านครั้งในครั้งเดียวดังนั้นสายที่เข้ามาทั้งหมดจะถูกโจมตีโดยผู้โจมตี ผลลัพธ์ก็คือลูกค้าโทรถูกต้องตามกฎหมาย (เช่นผู้ที่ไม่ใช่ผู้โจมตี) จะไม่ผ่านเพราะระบบโทรศัพท์เชื่อมโยงกับการจัดการการโทรจากผู้โจมตี ดังนั้นในสาระสำคัญ บริษัท X อาจสูญเสียธุรกิจเนื่องจากคำขอที่ถูกกฎหมายไม่สามารถผ่านได้.
การจู่โจม DDoS บนเว็บเซิร์ฟเวอร์ทำงานในลักษณะเดียวกัน เนื่องจากแทบไม่มีวิธีใดที่จะทราบว่าทราฟฟิกใดที่มาจากคำขอที่ถูกกฎหมายกับผู้โจมตีจนกระทั่งเว็บเซิร์ฟเวอร์กำลังประมวลผลคำขอการโจมตีประเภทนี้จึงมีประสิทธิภาพมาก.
ดำเนินการโจมตี
เนื่องจากลักษณะ“ กำลังดุร้าย” ของการจู่โจม DDoS คุณต้องมีคอมพิวเตอร์จำนวนมากที่ทำงานร่วมกันเพื่อโจมตีในเวลาเดียวกัน การทบทวนตัวอย่าง call center ของเราสิ่งนี้จะทำให้ผู้โจมตีทุกคนต้องรู้ว่าจะโทรเวลา 9.00 น. และโทรจริงในเวลานั้น ในขณะที่หลักการนี้จะทำงานได้อย่างแน่นอนเมื่อมันมาถึงการโจมตีเว็บเซิร์ฟเวอร์มันจะกลายเป็นเรื่องง่ายขึ้นเมื่อคอมพิวเตอร์ซอมบี้แทนที่จะใช้คอมพิวเตอร์จริง.
อย่างที่คุณคงทราบกันดีว่ามีมัลแวร์และโทรจันหลายรูปแบบซึ่งอยู่ในระบบของคุณเมื่ออยู่ในระบบของคุณคุณจะนอนอยู่เฉยๆและ "โทรศัพท์กลับบ้าน" เป็นครั้งคราวเพื่อดูคำแนะนำ ตัวอย่างหนึ่งในคำแนะนำเหล่านี้อาจส่งคำขอซ้ำไปยังเว็บเซิร์ฟเวอร์ของ Company X เวลา 9.00 น. ดังนั้นด้วยการอัปเดตครั้งเดียวไปยังตำแหน่งที่บ้านของมัลแวร์ที่เกี่ยวข้องผู้โจมตีเพียงคนเดียวสามารถประสานคอมพิวเตอร์ที่ถูกบุกรุกนับแสนเพื่อทำการโจมตี DDoS ได้ทันที.
ความสวยงามของการใช้คอมพิวเตอร์ซอมบี้ไม่เพียง แต่มีประสิทธิภาพ แต่ยังอยู่ในความเป็นตัวตนเนื่องจากผู้โจมตีไม่จำเป็นต้องใช้คอมพิวเตอร์เพื่อทำการโจมตี.
โจมตีการฉีด SQL
มันคืออะไร?
การโจมตี“ SQL injection” (SQLI) เป็นการโจมตีที่ใช้ประโยชน์จากเทคนิคการพัฒนาเว็บที่ไม่ดีและโดยทั่วไปเมื่อรวมกับความปลอดภัยของฐานข้อมูลที่ผิดพลาด ผลลัพธ์ของการโจมตีที่ประสบความสำเร็จนั้นอาจมีตั้งแต่การแอบอ้างบัญชีผู้ใช้ไปจนถึงการประนีประนอมอย่างสมบูรณ์ของฐานข้อมูลหรือเซิร์ฟเวอร์ที่เกี่ยวข้อง แตกต่างจากการโจมตี DDoS การโจมตี SQLI นั้นสามารถป้องกันได้อย่างสมบูรณ์และง่ายดายหากมีการตั้งโปรแกรมเว็บแอปพลิเคชันอย่างเหมาะสม.
ดำเนินการโจมตี
เมื่อใดก็ตามที่คุณลงชื่อเข้าใช้เว็บไซต์และป้อนชื่อผู้ใช้และรหัสผ่านของคุณเพื่อทดสอบข้อมูลประจำตัวของคุณเว็บแอปพลิเคชันอาจเรียกใช้แบบสอบถามดังต่อไปนี้:
เลือกหมายเลขผู้ใช้จากผู้ใช้ที่ชื่อผู้ใช้ = "myuser" และรหัสผ่าน = "mypass";
หมายเหตุ: ค่าสตริงในเคียวรี SQL ต้องอยู่ในเครื่องหมายคำพูดเดี่ยวซึ่งเป็นสาเหตุที่ปรากฎขึ้นรอบค่าที่ผู้ใช้ป้อน.
ดังนั้นการรวมกันของชื่อผู้ใช้ที่ป้อน (myuser) และรหัสผ่าน (mypass) จะต้องตรงกับรายการในตารางผู้ใช้เพื่อให้ UserID ถูกส่งกลับ หากไม่มีการจับคู่จะไม่มีการส่งคืน UserID ดังนั้นข้อมูลรับรองการเข้าสู่ระบบจะไม่ถูกต้อง ในขณะที่การนำไปปฏิบัติโดยเฉพาะอาจแตกต่างกันไปกลไกนั้นค่อนข้างมาตรฐาน.
ดังนั้นตอนนี้มาดูที่แบบสอบถามการรับรองความถูกต้องแม่แบบซึ่งเราสามารถแทนที่ค่าที่ผู้ใช้ป้อนในแบบฟอร์มเว็บ:
เลือกหมายเลขผู้ใช้จากผู้ใช้ที่ชื่อผู้ใช้ = "[ผู้ใช้]" และรหัสผ่าน = "[ผ่าน]"
จากภาพรวมในครั้งแรกสิ่งนี้อาจดูเหมือนเป็นขั้นตอนที่ตรงไปตรงมาและเป็นตรรกะสำหรับการตรวจสอบความถูกต้องของผู้ใช้ได้อย่างง่ายดายอย่างไรก็ตามหากมีการดำเนินการแทนค่าที่ป้อนโดยผู้ใช้อย่างง่ายบนแม่แบบนี้.
ตัวอย่างเช่นสมมติว่า“ myuser'-” ถูกป้อนในฟิลด์ชื่อผู้ใช้และป้อน“ รหัสผ่านผิด” ในรหัสผ่าน การใช้การแทนที่แบบง่ายในเคียวรีเทมเพลตของเราเราจะได้สิ่งนี้:
เลือกหมายเลขผู้ใช้จากผู้ใช้ที่ชื่อผู้ใช้ = "myuser" - 'และรหัสผ่าน = "ผิด"
กุญแจสำคัญในคำสั่งนี้คือการรวมของสองขีดกลาง (-)
. นี่เป็นโทเค็นความคิดเห็นเริ่มต้นสำหรับคำสั่ง SQL ดังนั้นสิ่งใดที่ปรากฏหลังจากเครื่องหมายขีดคั่นสองอัน (รวม) จะถูกละเว้น เป็นหลักแบบสอบถามข้างต้นจะถูกดำเนินการโดยฐานข้อมูลเป็น:
เลือกหมายเลขผู้ใช้จากผู้ใช้ที่ชื่อผู้ใช้ = "myuser"
การละเลยการจ้องมองที่นี่คือการขาดการตรวจสอบรหัสผ่าน โดยการรวมเครื่องหมายขีดคั่นสองอันเป็นส่วนหนึ่งของเขตข้อมูลผู้ใช้เราได้ข้ามเงื่อนไขการตรวจสอบรหัสผ่านอย่างสมบูรณ์และสามารถเข้าสู่ระบบเป็น "myuser" โดยไม่ทราบรหัสผ่านที่เกี่ยวข้อง การกระทำของการจัดการแบบสอบถามเพื่อสร้างผลลัพธ์ที่ไม่ได้ตั้งใจนี้คือการโจมตีการฉีด SQL.
สิ่งที่เสียหายสามารถทำได้?
การโจมตีการฉีด SQL นั้นเกิดจากการเขียนโปรแกรมที่ประมาทและขาดความรับผิดชอบและสามารถป้องกันได้อย่างสมบูรณ์ (ซึ่งเราจะครอบคลุมในช่วงเวลาหนึ่ง) อย่างไรก็ตามขอบเขตของความเสียหายที่สามารถทำได้ขึ้นอยู่กับการตั้งค่าฐานข้อมูล เพื่อให้เว็บแอปพลิเคชันสามารถสื่อสารกับฐานข้อมูลแบ็กเอนด์ได้แอปพลิเคชั่นจะต้องทำการล็อกอินเข้าสู่ฐานข้อมูล (หมายเหตุนี่แตกต่างจากการล็อกอินของผู้ใช้ไปยังเว็บไซต์ของตัวเอง) บัญชีฐานข้อมูลที่เกี่ยวข้องนี้อาจต้องการอะไรก็ได้ตั้งแต่สิทธิ์การอ่าน / เขียนในตารางที่มีอยู่เท่านั้นไปจนถึงการเข้าถึงฐานข้อมูลเต็มรูปแบบ หากนี่ยังไม่ชัดเจนตัวอย่างบางส่วนควรช่วยให้เกิดความชัดเจน.
จากตัวอย่างข้างต้นคุณจะเห็นว่าโดยการป้อนเช่น, "youruser '-", "ผู้ดูแลระบบ" - "
หรือชื่อผู้ใช้อื่น ๆ เราสามารถเข้าสู่เว็บไซต์ได้ทันทีในฐานะผู้ใช้นั้นโดยไม่ทราบรหัสผ่าน เมื่อเราอยู่ในระบบไม่ทราบว่าเราไม่ได้เป็นผู้ใช้จริงดังนั้นเราจึงสามารถเข้าถึงบัญชีที่เกี่ยวข้องได้อย่างสมบูรณ์ สิทธิ์ของฐานข้อมูลจะไม่ให้ความปลอดภัยสุทธิสำหรับสิ่งนี้เพราะโดยปกติแล้วเว็บไซต์จะต้องมีการเข้าถึงแบบอ่าน / เขียนอย่างน้อยในฐานข้อมูลของตน.
ทีนี้สมมติว่าเว็บไซต์มีการควบคุมฐานข้อมูลที่เกี่ยวข้องอย่างสมบูรณ์ซึ่งให้ความสามารถในการลบระเบียนเพิ่ม / ลบตารางเพิ่มบัญชีความปลอดภัยใหม่ ฯลฯ เป็นสิ่งสำคัญที่จะต้องทราบว่าบางแอปพลิเคชันบนเว็บอาจต้องการการอนุญาตประเภทนี้ ไม่ใช่สิ่งที่เลวร้ายโดยอัตโนมัติที่ได้รับการควบคุมเต็มรูปแบบ.
ดังนั้นเพื่อแสดงให้เห็นถึงความเสียหายที่สามารถทำได้ในสถานการณ์นี้เราจะใช้ตัวอย่างที่ให้ไว้ในหนังสือการ์ตูนข้างต้นโดยการป้อนข้อมูลต่อไปนี้ในช่องชื่อผู้ใช้: "Robert '; ผู้ใช้ DROP TABLE; -".
หลังจากการทดแทนอย่างง่ายแบบสอบถามการรับรองความถูกต้องจะกลายเป็น:
เลือกหมายเลขผู้ใช้จากผู้ใช้ที่ชื่อผู้ใช้ = "Robert"; ผู้ใช้ DROP Table; - 'AND Password = "passpass "
หมายเหตุ: เครื่องหมายอัฒภาคในแบบสอบถาม SQL ใช้เพื่อบ่งบอกถึงจุดสิ้นสุดของคำสั่งเฉพาะและจุดเริ่มต้นของคำสั่งใหม่.
ซึ่งได้รับการดำเนินการโดยฐานข้อมูลเป็น:
เลือกหมายเลขผู้ใช้จากผู้ใช้ที่ชื่อผู้ใช้ = "Robert"
ผู้ใช้ DROP Table
เช่นเดียวกับที่เราใช้การโจมตี SQLI เพื่อลบตารางผู้ใช้ทั้งหมด.
แน่นอนว่าสามารถทำได้แย่กว่านั้นมากขึ้นอยู่กับการอนุญาต SQL อนุญาตผู้โจมตีสามารถเปลี่ยนค่าถ่ายโอนข้อมูลตาราง (หรือฐานข้อมูลทั้งหมดเอง) เป็นไฟล์ข้อความสร้างบัญชีเข้าสู่ระบบใหม่หรือแม้แต่จี้ติดตั้งฐานข้อมูลทั้งหมด.
ป้องกันการโจมตีการฉีด SQL
ดังที่เรากล่าวถึงหลายครั้งก่อนหน้านี้การโจมตีการฉีด SQL สามารถป้องกันได้อย่างง่ายดาย หนึ่งในกฎสำคัญของการพัฒนาเว็บคือคุณไม่เคยเชื่อใจอินพุตของผู้ใช้อย่างที่เราทำเมื่อเราทำการทดแทนแบบง่าย ๆ ในแบบสอบถามเทมเพลตของเราด้านบน.
การโจมตี SQLI นั้นขัดขวางได้ง่ายโดยสิ่งที่เรียกว่าการฆ่าเชื้อ (หรือหลบหนี) อินพุตของคุณ กระบวนการฆ่าเชื้อนั้นค่อนข้างน่ารำคาญเพราะทุกอย่างที่มันทำคือจัดการกับตัวอักษรอัญประกาศเดี่ยว (') ใด ๆ อย่างเหมาะสมดังนั้นจึงไม่สามารถใช้เพื่อยุติสตริงก่อนกำหนดภายในคำสั่ง SQL ได้.
ตัวอย่างเช่นหากคุณต้องการค้นหา“ O'neil” ในฐานข้อมูลคุณไม่สามารถใช้การทดแทนแบบง่าย ๆ ได้เนื่องจากการอ้างคำเดียวหลังจาก O จะทำให้สตริงสิ้นสุดลงก่อนเวลาอันควร แต่คุณจะทำให้มันสะอาดโดยใช้ตัวละครของฐานข้อมูลที่เกี่ยวข้อง สมมติว่าอักขระตัวหลีกเลี่ยงสำหรับอัญประกาศแบบอินไลน์กำลังนำหน้าคำพูดแต่ละคำด้วยสัญลักษณ์ \ ดังนั้น "โอนีล" จะถูกทำให้สะอาดในฐานะ "O \ 'นีล".
การสุขาภิบาลอย่างง่ายนี้ค่อนข้างป้องกันการโจมตี SQLI เพื่อแสดงให้เห็นให้ทบทวนตัวอย่างก่อนหน้าของเราอีกครั้งและดูข้อความค้นหาที่ได้เมื่อผู้ใช้ป้อนข้อมูลให้ถูกสุขลักษณะ.
myuser'--
/ wrongpass:
เลือกหมายเลขผู้ใช้จากผู้ใช้ที่ชื่อผู้ใช้ = "myuser \" - 'AND รหัสผ่าน = "ผิดพลาด"
เนื่องจากเครื่องหมายอัญประกาศเดี่ยวเดียวหลังจาก myuser ถูกหลบหนี (หมายถึงมันถูกพิจารณาว่าเป็นส่วนหนึ่งของค่าเป้าหมาย) ฐานข้อมูลจะค้นหาชื่อผู้ใช้ของ "myuser '-".
นอกจากนี้เนื่องจากขีดคั่นจะรวมอยู่ในค่าสตริงและไม่ใช่คำสั่ง SQL นั้นจะถือว่าเป็นส่วนหนึ่งของค่าเป้าหมายแทนที่จะถูกตีความว่าเป็นความคิดเห็นของ SQL.
โรเบิร์ต '; ผู้ใช้ DROP Table;--
/ wrongpass:
เลือกหมายเลขผู้ใช้จากผู้ใช้ที่ชื่อผู้ใช้ = "Robert \"; ผู้ใช้ DROP Table; - 'AND Password = "passpass "
เพียงแค่หนีเครื่องหมายอัญประกาศเดี่ยวหลัง Robert ทั้งเครื่องหมายอัฒภาคและเครื่องหมายขีดกลางจะอยู่ในสตริงการค้นหาชื่อผู้ใช้ดังนั้นฐานข้อมูลจะค้นหาอย่างแท้จริง "Robert '; ผู้ใช้ DROP TABLE; -"
แทนการดำเนินการลบตาราง.
สรุป
ในขณะที่การโจมตีเว็บมีการพัฒนาและมีความซับซ้อนมากขึ้นหรือมุ่งเน้นไปที่จุดที่แตกต่างกันของการเข้าใช้มันเป็นสิ่งสำคัญที่ต้องจำไว้เพื่อป้องกันการโจมตีที่พยายามและจริง.
การโจมตีบางประเภทเช่น DDoS นั้นไม่สามารถหลีกเลี่ยงได้ง่ายในขณะที่คนอื่น ๆ เช่น SQLI สามารถทำได้ อย่างไรก็ตามความเสียหายที่สามารถทำได้โดยการโจมตีประเภทนี้สามารถช่วงได้ทุกที่ตั้งแต่ความไม่สะดวกไปจนถึงภัยพิบัติขึ้นอยู่กับข้อควรระวังที่ได้รับ.