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

การฉีด SQL คืออะไร?
การโจมตีแบบ SQL Injection คือการปลอมแปลงคำสั่ง SQL แบบไดนามิก โดยการลบส่วนใดส่วนหนึ่งของคำสั่งออก หรือเพิ่มเงื่อนไขที่จะเป็นจริงเสมอ การโจมตีนี้ใช้ประโยชน์จากข้อบกพร่องในการออกแบบเว็บแอปพลิเคชันที่ไม่ดี เพื่อใช้ประโยชน์จากคำสั่ง SQL ในการเรียกใช้โค้ด SQL ที่เป็นอันตราย
ข้อมูลเป็นองค์ประกอบที่สำคัญที่สุดอย่างหนึ่งของระบบสารสนเทศ องค์กรต่างๆ ใช้เว็บแอปพลิเคชันที่ขับเคลื่อนด้วยฐานข้อมูลเพื่อรับข้อมูลจากลูกค้า SQL เป็นตัวย่อของ Structured Query Languageใช้สำหรับเรียกดูและจัดการข้อมูลในฐานข้อมูล
การโจมตีแบบ SQL Injection ทำงานอย่างไร?
ประเภทของการโจมตีที่สามารถทำได้โดยใช้ SQL injection นั้นแตกต่างกันไป ขึ้นอยู่กับประเภทของเอนจินฐานข้อมูล การโจมตีนี้ทำงานกับคำสั่ง SQL แบบไดนามิก คำสั่งแบบไดนามิกคือคำสั่งที่สร้างขึ้นในระหว่างการทำงานโดยใช้พารามิเตอร์ที่ส่งมาจากแบบฟอร์มเว็บหรือสตริงคำค้นหา URI
ตัวอย่างการฉีด SQL
ลองพิจารณาแอปพลิเคชันเว็บอย่างง่ายที่มีแบบฟอร์มล็อกอิน โค้ด HTML สำหรับแบบฟอร์มแสดงอยู่ด้านล่าง
<form action=‘index.php’ method="post"> <input type="email" name="email" required="required"/> <input type="password" name="password"/> <input type="checkbox" name="remember_me" value="Remember me"/> <input type="submit" value="Submit"/> </form>
ที่นี่
- แบบฟอร์มด้านบนจะรับที่อยู่อีเมลและรหัสผ่าน จากนั้นส่งข้อมูลไปยัง... PHP ไฟล์ชื่อ index.php
- มีตัวเลือกในการบันทึกเซสชันการเข้าสู่ระบบลงในคุกกี้ เราอนุมานได้จากช่องทำเครื่องหมาย remember_me ระบบใช้เมธอด POST ในการส่งข้อมูล ซึ่งหมายความว่าค่าต่างๆ จะไม่แสดงในหน้าจอ URL.
สมมติว่าคำสั่งในส่วนแบ็กเอนด์สำหรับการตรวจสอบรหัสผู้ใช้มีดังต่อไปนี้
SELECT * FROM users WHERE email = $_POST['email'] AND password = md5($_POST['password']);
ที่นี่
- คำสั่งข้างต้นใช้ค่าจากอาร์เรย์ $_POST[] โดยตรงโดยไม่ทำการตรวจสอบความปลอดภัย
- รหัสผ่านจะถูกเข้ารหัสด้วยอัลกอริทึม MD5
เราจะสาธิตการโจมตีแบบ SQL injection โดยใช้ตัวอย่างต่อไปนี้ SQL Fiddle. เปิด URL http://sqlfiddle.com/ ในเว็บเบราว์เซอร์ของคุณ คุณจะเห็นหน้าต่างต่อไปนี้
หมายเหตุ: คุณจะต้องเขียนคำสั่ง SQL ด้วยตนเอง
ขั้นตอน 1) ป้อนรหัสนี้ในช่องด้านซ้าย
CREATE TABLE `users` ( `id` INT NOT NULL AUTO_INCREMENT, `email` VARCHAR(45) NULL, `password` VARCHAR(45) NULL, PRIMARY KEY (`id`)); insert into users (email,password) values ('m@m.com',md5('abc'));
ขั้นตอน 2) คลิก สร้างสคีมา (Build Schema)
ขั้นตอน 3) ป้อนรหัสนี้ในช่องด้านขวา
select * from users;
ขั้นตอน 4) คลิก "เรียกใช้ SQL" คุณจะเห็นผลลัพธ์ดังต่อไปนี้
สมมติว่าผู้ใช้ป้อน admin@admin.sys และรหัสผ่านเป็น 1234 คำสั่งที่ดำเนินการกับฐานข้อมูลจะเป็นดังนี้:
SELECT * FROM users WHERE email = 'admin@admin.sys' AND password = md5('1234');
โค้ดข้างต้นสามารถถูกโจมตีได้โดยการคอมเมนต์ส่วนของรหัสผ่านออก และเพิ่มเงื่อนไขที่จะเป็นจริงเสมอเข้าไป สมมติว่าผู้โจมตีป้อนข้อมูลต่อไปนี้ในช่องที่อยู่อีเมล
xxx@xxx.xxx' OR 1 = 1 LIMIT 1 -- ' ]
xxx สำหรับรหัสผ่าน
คำสั่งไดนามิกที่สร้างขึ้นจะเป็นดังนี้
SELECT * FROM users WHERE email = 'xxx@xxx.xxx' OR 1 = 1 LIMIT 1 -- ' ] AND password = md5('1234');
ที่นี่
- xxx@xxx.xxx ปิดท้ายด้วยเครื่องหมายอัญประกาศเดี่ยวซึ่งทำให้ข้อความสมบูรณ์
OR 1 = 1LIMIT 1 คือเงื่อนไขที่จะเป็นจริงเสมอ และจำกัดผลลัพธ์ที่ส่งคืนให้เหลือเพียงระเบียนเดียวเท่านั้น- — ' AND … เป็นความคิดเห็น SQL ที่จะกำจัดส่วนของรหัสผ่าน
คัดลอกคำสั่ง SQL ด้านบนแล้ววางลงในช่อง SQL Fiddle เรียกใช้คำสั่ง SQL ในช่องข้อความตามที่แสดงด้านล่าง
กิจกรรมการแฮ็ก: SQL Inject เว็บแอปพลิเคชัน
เรามีเว็บแอปพลิเคชั่นง่ายๆที่ http://www.techpanda.org/ โค้ดนี้มีความเสี่ยงต่อการโจมตีแบบ SQL Injection ใช้เพื่อเป็นตัวอย่างเท่านั้น โค้ดแบบฟอร์ม HTML ด้านบนนำมาจากหน้าล็อกอิน แอปพลิเคชันมีระบบรักษาความปลอดภัยขั้นพื้นฐาน เช่น การตรวจสอบความถูกต้องของช่องอีเมล ซึ่งหมายความว่าโค้ดข้างต้นของเราไม่สามารถนำไปใช้เพื่อหลีกเลี่ยงการล็อกอินได้
เพื่อหลีกเลี่ยงปัญหานั้น เราจึงใช้วิธีเจาะช่องรหัสผ่านแทน แผนภาพด้านล่างแสดงขั้นตอนที่ต้องปฏิบัติตาม
สมมติว่าผู้โจมตีป้อนข้อมูลดังต่อไปนี้
- ขั้นตอนที่ 1: ป้อน xxx@xxx.xxx เป็นที่อยู่อีเมล
- ขั้นตอนที่ 2: ป้อน xxx') หรือ 1 = 1 — ]
- คลิกที่ปุ่มส่ง
- คุณจะถูกนำไปยังหน้าแดชบอร์ด
คำสั่ง SQL ที่สร้างขึ้นจะมีลักษณะดังต่อไปนี้
SELECT * FROM users WHERE email = 'xxx@xxx.xxx' AND password = md5('xxx') OR 1 = 1 -- ]');
แผนภาพด้านล่างแสดงให้เห็นถึงวิธีการสร้างข้อความดังกล่าว
ที่นี่
- ข้อความดังกล่าวตั้งสมมติฐานอย่างชาญฉลาดว่ามีการใช้การเข้ารหัส MD5
- เติมเครื่องหมายอัญประกาศเดี่ยวและวงเล็บปิดให้สมบูรณ์
- เพิ่มเงื่อนไขให้กับข้อความซึ่งจะเป็นจริงเสมอ
โดยทั่วไป การโจมตีที่ประสบความสำเร็จจะใช้เทคนิคหลายอย่างร่วมกัน ดังที่แสดงไว้ข้างต้น
ประเภทการโจมตีแบบฉีด SQL อื่นๆ
การโจมตีแบบ SQL Injection สามารถสร้างความเสียหายได้มากกว่าแค่การหลีกเลี่ยงอัลกอริทึมการล็อกอิน การโจมตีบางประเภทได้แก่:
- กำลังลบข้อมูล
- กำลังอัปเดตข้อมูล
- การแทรกข้อมูล
- การดำเนินการคำสั่งบนเซิร์ฟเวอร์ที่สามารถดาวน์โหลดและติดตั้งโปรแกรมที่เป็นอันตราย เช่น โทรจัน
- การส่งออกข้อมูลที่มีค่าเช่นรายละเอียดบัตรเครดิต อีเมล และรหัสผ่านไปยังเซิร์ฟเวอร์ระยะไกลของผู้โจมตี
- การรับรายละเอียดการเข้าสู่ระบบของผู้ใช้ เป็นต้น
- การฉีด SQL ตามคุกกี้
- การฉีด SQL ตามข้อผิดพลาด
- การฉีด SQL แบบตาบอด
รายการข้างต้นไม่ใช่รายการที่ครบถ้วนสมบูรณ์ แต่เป็นเพียงตัวอย่างให้เห็นว่าการโจมตีแบบ SQL Injection สามารถทำอะไรได้บ้าง
เครื่องมืออัตโนมัติสำหรับการฉีด SQL
ในตัวอย่างข้างต้น เราใช้เทคนิคการโจมตีด้วยตนเองโดยอาศัยความรู้ด้าน SQL ที่เรามีมากมาย อย่างไรก็ตาม มีเครื่องมืออัตโนมัติที่สามารถช่วยให้คุณทำการโจมตีได้อย่างมีประสิทธิภาพมากขึ้นและใช้เวลาน้อยลง เครื่องมือเหล่านั้นได้แก่:
- SQLMap – http://sqlmap.org/
- การโจมตีแบบ jSQL Injection – https://www.kali.org/tools/jsql/
วิธีป้องกันการโจมตีแบบ SQL Injection
องค์กรสามารถใช้หลักการต่อไปนี้เพื่อป้องกันตัวเองจากการโจมตี SQL Injection
- ไม่ควรเชื่อถือข้อมูลที่ผู้ใช้ป้อนเข้ามา – ต้องทำการตรวจสอบและกรองข้อมูลก่อนนำไปใช้ในคำสั่ง SQL แบบไดนามิกเสมอ
- ขั้นตอนการจัดเก็บ – สิ่งเหล่านี้สามารถห่อหุ้มคำสั่ง SQL และถือว่าข้อมูลนำเข้าทั้งหมดเป็นพารามิเตอร์ได้
- งบที่เตรียมไว้ – คำสั่งเตรียมการ (prepared statements) ทำงานโดยการสร้างคำสั่ง SQL ก่อน จากนั้นจึงนำข้อมูลที่ผู้ใช้ส่งเข้ามาทั้งหมดมาใช้เป็นพารามิเตอร์ ซึ่งไม่มีผลต่อไวยากรณ์ของคำสั่ง SQL
- นิพจน์ปกติ – สามารถใช้สิ่งเหล่านี้ในการตรวจจับโค้ดที่อาจเป็นอันตรายและลบออกก่อนที่จะดำเนินการคำสั่ง SQL
- สิทธิ์การเข้าถึงของผู้ใช้ในการเชื่อมต่อฐานข้อมูล – ควรให้สิทธิ์การเข้าถึงเฉพาะที่จำเป็นแก่บัญชีที่ใช้เพื่อ เชื่อมต่อกับฐานข้อมูล- ซึ่งสามารถช่วยลดสิ่งที่คำสั่ง SQL สามารถดำเนินการบนเซิร์ฟเวอร์ได้
- ข้อความแสดงข้อผิดพลาด – ข้อความเหล่านี้ไม่ควรเปิดเผยข้อมูลที่ละเอียดอ่อนหรือตำแหน่งที่เกิดข้อผิดพลาดอย่างแน่ชัด สามารถใช้ข้อความแสดงข้อผิดพลาดแบบกำหนดเองง่ายๆ เช่น “ขออภัย ขณะนี้เรากำลังประสบปัญหาทางเทคนิค เราได้ติดต่อทีมงานด้านเทคนิคแล้ว โปรดลองอีกครั้งในภายหลัง” แทนการแสดงคำสั่ง SQL ที่ทำให้เกิดข้อผิดพลาดได้
กิจกรรมการแฮ็ก: ใช้ Havij สำหรับ SQL Injection
ในสถานการณ์จำลองนี้ เราใช้โปรแกรม Havij Advanced SQL Injection เพื่อสแกนเว็บไซต์หาช่องโหว่
หมายเหตุ: Havij เป็นอาคารเก่าที่ไม่ได้มีการบำรุงรักษา Windows เครื่องมือ SQLMap ที่กล่าวถึงข้างต้น เป็นมาตรฐานโอเพนซอร์สในปัจจุบัน
หมายเหตุ: โปรแกรมป้องกันไวรัสของคุณอาจตรวจพบไฟล์นี้เนื่องจากลักษณะของไฟล์ คุณควรเพิ่มไฟล์นี้ลงในรายการยกเว้นหรือหยุดการทำงานชั่วคราว โปรแกรมป้องกันไวรัส.
ภาพด้านล่างแสดงหน้าต่างหลักของ Havij
เครื่องมือข้างต้นสามารถใช้ประเมินความเสี่ยงด้านความปลอดภัยของเว็บไซต์หรือแอปพลิเคชันได้








