บทช่วยสอนการฉีด SQL: วิธีการเรียนรู้ด้วยตัวอย่าง

การฉีด SQL คืออะไร?

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

ข้อมูลเป็นหนึ่งในองค์ประกอบที่สำคัญที่สุดของระบบสารสนเทศ องค์กรใช้แอปพลิเคชันเว็บที่ขับเคลื่อนด้วยฐานข้อมูลเพื่อรับข้อมูลจากลูกค้า SQL เป็นตัวย่อสำหรับ Structured Query Language มันถูกใช้เพื่อดึงและจัดการข้อมูลในฐานข้อมูล

ด้วย SQL Injection

การโจมตีแบบฉีด 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

การทำงานของการฉีด 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 คุณจะเห็นผลลัพธ์ดังต่อไปนี้

การทำงานของการฉีด 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

กิจกรรมการแฮ็ก: SQL Inject เว็บแอปพลิเคชัน

เรามีเว็บแอปพลิเคชั่นง่ายๆที่ http://www.techpanda.org/ ที่เสี่ยงต่อการโจมตี SQL Injection เพื่อวัตถุประสงค์ในการสาธิตเท่านั้น โค้ดแบบฟอร์ม HTML ด้านบนนี้มาจากหน้าเข้าสู่ระบบ แอปพลิเคชันนี้มีการรักษาความปลอดภัยขั้นพื้นฐาน เช่น การทำความสะอาดช่องอีเมล ซึ่งหมายความว่าโค้ดด้านบนนี้ไม่สามารถใช้ข้ามขั้นตอนการเข้าสู่ระบบได้

เพื่อหลีกเลี่ยงปัญหานี้ เราสามารถใช้ช่องรหัสผ่านแทนได้ แผนภาพด้านล่างแสดงขั้นตอนที่คุณต้องปฏิบัติตาม

SQL Inject เว็บแอปพลิเคชัน

สมมติว่าผู้โจมตีให้ข้อมูลต่อไปนี้

  • ขั้นตอนที่ 1: ป้อน xxx@xxx.xxx เป็นที่อยู่อีเมล
  • ขั้นตอนที่ 2: ป้อน xxx') หรือ 1 = 1 — ]

SQL Inject เว็บแอปพลิเคชัน

  • คลิกที่ปุ่มส่ง
  • คุณจะถูกนำไปที่แผงควบคุม

คำสั่ง SQL ที่สร้างขึ้นจะเป็นดังนี้

SELECT * FROM users WHERE email = 'xxx@xxx.xxx' AND password = md5('xxx') OR 1 = 1 -- ]');

แผนภาพด้านล่างแสดงให้เห็นถึงข้อความที่ถูกสร้างขึ้น

SQL Inject เว็บแอปพลิเคชัน

ที่นี่

  • คำสั่งนี้ถือว่ามีการใช้การเข้ารหัส md5 อย่างชาญฉลาด
  • กรอกเครื่องหมายคำพูดเดี่ยวและวงเล็บปิดให้สมบูรณ์
  • เพิ่มเงื่อนไขต่อท้ายข้อความที่จะเป็นจริงเสมอ

โดยทั่วไป การโจมตีแบบ SQL Injection ที่ประสบความสำเร็จจะพยายามใช้เทคนิคต่างๆ มากมาย เช่น วิธีที่แสดงไว้ด้านบนเพื่อทำการโจมตีให้สำเร็จ

ประเภทการโจมตีแบบฉีด SQL อื่นๆ

การแทรก SQL อาจสร้างอันตรายได้มากกว่าการผ่านอัลกอริทึมการเข้าสู่ระบบ การโจมตีบางส่วนได้แก่

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

รายการข้างต้นยังไม่ครบถ้วนสมบูรณ์ มันแค่ทำให้คุณเข้าใจว่า SQL Injection คืออะไร

เครื่องมืออัตโนมัติสำหรับการฉีด SQL

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

วิธีป้องกันการโจมตี SQL Injection

องค์กรสามารถใช้หลักการต่อไปนี้เพื่อป้องกันตัวเองจากการโจมตี SQL Injection

  • ข้อมูลของผู้ใช้ไม่ควรเชื่อถือ – จะต้องได้รับการฆ่าเชื้อเสมอก่อนที่จะใช้ในคำสั่ง SQL แบบไดนามิก
  • ขั้นตอนการจัดเก็บ – สิ่งเหล่านี้สามารถสรุปคำสั่ง SQL และถือว่าอินพุตทั้งหมดเป็นพารามิเตอร์
  • แถลงการณ์ที่เตรียมไว้ – คำสั่งที่เตรียมไว้เพื่อทำงานโดยการสร้างคำสั่ง SQL ก่อนจากนั้นจึงถือว่าข้อมูลผู้ใช้ที่ส่งมาทั้งหมดเป็นพารามิเตอร์ สิ่งนี้ไม่มีผลกระทบต่อไวยากรณ์ของคำสั่ง SQL
  • การแสดงออกปกติ – สิ่งเหล่านี้สามารถใช้เพื่อตรวจจับโค้ดที่อาจเป็นอันตรายและลบออกก่อนดำเนินการคำสั่ง SQL
  • สิทธิ์การเข้าถึงของผู้ใช้การเชื่อมต่อฐานข้อมูล – ควรมอบสิทธิ์การเข้าถึงที่จำเป็นให้กับบัญชีที่ใช้เท่านั้น เชื่อมต่อกับฐานข้อมูล- ซึ่งสามารถช่วยลดสิ่งที่คำสั่ง SQL สามารถดำเนินการบนเซิร์ฟเวอร์ได้
  • ข้อความแสดงข้อผิดพลาด – ข้อความเหล่านี้ไม่ควรเปิดเผยข้อมูลที่ละเอียดอ่อนและไม่ควรเปิดเผยจุดที่เกิดข้อผิดพลาด ข้อความแสดงข้อผิดพลาดแบบกำหนดเองอย่างง่าย เช่น “ขออภัย เรากำลังพบข้อผิดพลาดทางเทคนิค ทีมงานด้านเทคนิคได้รับการติดต่อแล้ว โปรดลองอีกครั้งในภายหลัง” สามารถนำมาใช้แทนการแสดงคำสั่ง SQL ที่ทำให้เกิดข้อผิดพลาดได้

กิจกรรมการแฮ็ก: ใช้ Havij สำหรับ SQL Injection

ในสถานการณ์จริงนี้ เราจะใช้โปรแกรม Havij Advanced SQL Injection เพื่อสแกนเว็บไซต์เพื่อหาช่องโหว่

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

รูปภาพด้านล่างแสดงหน้าต่างหลักของ Havij

ใช้ Havij สำหรับการฉีด SQL

เครื่องมือข้างต้นสามารถใช้เพื่อประเมินช่องโหว่ของเว็บไซต์/แอปพลิเคชันได้

สรุป

  • SQL Injection เป็นประเภทการโจมตีที่ใช้ประโยชน์จากคำสั่ง SQL ที่ไม่ดี
  • การแทรก SQL สามารถใช้เพื่อข้ามอัลกอริทึมการเข้าสู่ระบบ ดึงข้อมูล แทรกข้อมูล อัปเดตข้อมูล และลบข้อมูล
  • เครื่องมือ SQL Injection ได้แก่ SQLMap, SQLPing และ SQLSmack เป็นต้น
  • นโยบายความปลอดภัยที่ดีเมื่อเขียนคำสั่ง SQL สามารถช่วยลดการโจมตีแบบแทรก SQL ได้