บทช่วยสอนการฉีด SQL: วิธีการเรียนรู้ด้วยตัวอย่าง
การฉีด SQL คืออะไร?
SQL Injection คือการโจมตีที่สร้างพิษต่อคำสั่ง SQL แบบไดนามิกเพื่อแสดงความคิดเห็นบางส่วนของคำสั่งหรือต่อท้ายเงื่อนไขที่จะเป็นจริงเสมอ ใช้ประโยชน์จากข้อบกพร่องด้านการออกแบบในเว็บแอปพลิเคชันที่ออกแบบมาไม่ดีเพื่อใช้ประโยชน์จากคำสั่ง SQL เพื่อรันโค้ด SQL ที่เป็นอันตราย
ข้อมูลเป็นหนึ่งในองค์ประกอบที่สำคัญที่สุดของระบบสารสนเทศ องค์กรใช้แอปพลิเคชันเว็บที่ขับเคลื่อนด้วยฐานข้อมูลเพื่อรับข้อมูลจากลูกค้า SQL เป็นตัวย่อสำหรับ Structured Query Language มันถูกใช้เพื่อดึงและจัดการข้อมูลในฐานข้อมูล
การโจมตีแบบฉีด SQL ทำงานอย่างไร
ประเภทของการโจมตีที่สามารถทำได้โดยใช้การแทรก SQL จะแตกต่างกันไปขึ้นอยู่กับประเภทของกลไกฐานข้อมูล การโจมตีนี้ใช้ได้กับคำสั่ง 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
สมมติว่าคำสั่งที่ส่วนหลังสำหรับการตรวจสอบ ID ผู้ใช้มีดังนี้
SELECT * FROM users WHERE email = $_POST['email'] AND password = md5($_POST['password']);
ที่นี่
- ข้อความข้างต้นใช้ค่าของ
$_POST[]
จัดเรียงโดยตรงโดยไม่ต้องฆ่าเชื้อ - รหัสผ่านถูกเข้ารหัสโดยใช้อัลกอริทึม MD5
เราจะแสดงการโจมตีแบบฉีด SQL โดยใช้ sqlfiddle เปิด 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) คลิกสร้างสคีมา
ขั้นตอน 3) ป้อนรหัสนี้ในบานหน้าต่างด้านขวา
select * from users;
ขั้นตอน 4) คลิก Run 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 = 1
LIMIT 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 Injection ที่ประสบความสำเร็จจะพยายามใช้เทคนิคต่างๆ มากมาย เช่น วิธีที่แสดงไว้ด้านบนเพื่อทำการโจมตีให้สำเร็จ
ประเภทการโจมตีแบบฉีด SQL อื่นๆ
การแทรก SQL อาจสร้างอันตรายได้มากกว่าการผ่านอัลกอริทึมการเข้าสู่ระบบ การโจมตีบางส่วนได้แก่
- กำลังลบข้อมูล
- กำลังอัปเดตข้อมูล
- การแทรกข้อมูล
- การดำเนินการคำสั่งบนเซิร์ฟเวอร์ที่สามารถดาวน์โหลดและติดตั้งโปรแกรมที่เป็นอันตราย เช่น โทรจัน
- การส่งออกข้อมูลที่มีค่าเช่นรายละเอียดบัตรเครดิต อีเมล และรหัสผ่านไปยังเซิร์ฟเวอร์ระยะไกลของผู้โจมตี
- การรับรายละเอียดการเข้าสู่ระบบของผู้ใช้เป็นต้น
- การฉีด SQL ตามคุกกี้
- การฉีด SQL ตามข้อผิดพลาด
- การฉีด SQL แบบตาบอด
รายการข้างต้นยังไม่ครบถ้วนสมบูรณ์ มันแค่ทำให้คุณเข้าใจว่า SQL Injection คืออะไร
เครื่องมืออัตโนมัติสำหรับการฉีด SQL
ในตัวอย่างข้างต้น เราใช้เทคนิคการโจมตีด้วยตนเองโดยอาศัยความรู้อันกว้างขวางของเราเกี่ยวกับ SQL มีเครื่องมืออัตโนมัติที่สามารถช่วยให้คุณทำการโจมตีได้อย่างมีประสิทธิภาพมากขึ้นและภายในเวลาที่สั้นที่สุด เครื่องมือเหล่านี้ได้แก่
- SQLMap – http://sqlmap.org/
- การฉีด JSQL – https://tools.kali.org/vulnerability-analysis/jsql
วิธีป้องกันการโจมตี SQL Injection
องค์กรสามารถใช้หลักการต่อไปนี้เพื่อป้องกันตัวเองจากการโจมตี SQL Injection
- ข้อมูลของผู้ใช้ไม่ควรเชื่อถือ – จะต้องได้รับการฆ่าเชื้อเสมอก่อนที่จะใช้ในคำสั่ง SQL แบบไดนามิก
- ขั้นตอนการจัดเก็บ – สิ่งเหล่านี้สามารถสรุปคำสั่ง SQL และถือว่าอินพุตทั้งหมดเป็นพารามิเตอร์
- แถลงการณ์ที่เตรียมไว้ – คำสั่งที่เตรียมไว้เพื่อทำงานโดยการสร้างคำสั่ง SQL ก่อนจากนั้นจึงถือว่าข้อมูลผู้ใช้ที่ส่งมาทั้งหมดเป็นพารามิเตอร์ สิ่งนี้ไม่มีผลกระทบต่อไวยากรณ์ของคำสั่ง SQL
- การแสดงออกปกติ – สิ่งเหล่านี้สามารถใช้เพื่อตรวจจับโค้ดที่อาจเป็นอันตรายและลบออกก่อนดำเนินการคำสั่ง SQL
- สิทธิ์การเข้าถึงของผู้ใช้การเชื่อมต่อฐานข้อมูล – ควรมอบสิทธิ์การเข้าถึงที่จำเป็นให้กับบัญชีที่ใช้เท่านั้น เชื่อมต่อกับฐานข้อมูล- ซึ่งสามารถช่วยลดสิ่งที่คำสั่ง SQL สามารถดำเนินการบนเซิร์ฟเวอร์ได้
- ข้อความแสดงข้อผิดพลาด – ข้อความเหล่านี้ไม่ควรเปิดเผยข้อมูลที่ละเอียดอ่อนและไม่ควรเปิดเผยจุดที่เกิดข้อผิดพลาด ข้อความแสดงข้อผิดพลาดแบบกำหนดเองอย่างง่าย เช่น “ขออภัย เรากำลังพบข้อผิดพลาดทางเทคนิค ทีมงานด้านเทคนิคได้รับการติดต่อแล้ว โปรดลองอีกครั้งในภายหลัง” สามารถนำมาใช้แทนการแสดงคำสั่ง SQL ที่ทำให้เกิดข้อผิดพลาดได้
กิจกรรมการแฮ็ก: ใช้ Havij สำหรับ SQL Injection
ในสถานการณ์จริงนี้ เราจะใช้โปรแกรม Havij Advanced SQL Injection เพื่อสแกนเว็บไซต์เพื่อหาช่องโหว่
หมายเหตุ: ของคุณ โปรแกรมป้องกันไวรัส อาจตั้งค่าสถานะเนื่องจากธรรมชาติของมัน คุณควรเพิ่มลงในรายการยกเว้นหรือหยุดซอฟต์แวร์ป้องกันไวรัสของคุณชั่วคราว
รูปภาพด้านล่างแสดงหน้าต่างหลักของ Havij
เครื่องมือข้างต้นสามารถใช้เพื่อประเมินช่องโหว่ของเว็บไซต์/แอปพลิเคชันได้
สรุป
- SQL Injection เป็นประเภทการโจมตีที่ใช้ประโยชน์จากคำสั่ง SQL ที่ไม่ดี
- การแทรก SQL สามารถใช้เพื่อข้ามอัลกอริทึมการเข้าสู่ระบบ ดึงข้อมูล แทรกข้อมูล อัปเดตข้อมูล และลบข้อมูล
- เครื่องมือ SQL Injection ได้แก่ SQLMap, SQLPing และ SQLSmack เป็นต้น
- นโยบายความปลอดภัยที่ดีเมื่อเขียนคำสั่ง SQL สามารถช่วยลดการโจมตีแบบแทรก SQL ได้