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