SQL Injection: ทำงานอย่างไรและเพราะเหตุใด
ทำความเข้าใจ SQLi แบบคลาสสิก แบบตาบอด และแบบนอกช่องทาง รวมถึงเหตุผลที่คำสั่งค้นหาแบบกำหนดพารามิเตอร์ช่วยป้องกันได้
SQL Injection: ทำงานอย่างไรและเพราะเหตุใด เป็นบทเรียน Cyber Security Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Cyber Security Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Cyber Security Academy มีบทเรียนทั้งหมด 4 บทเรียน
การฉีดคำสั่ง SQL คืออะไร
การฉีดคำสั่ง SQL (SQLi) เกิดขึ้นเมื่อข้อมูลขาเข้าจากผู้ใช้ถูกนำไปรวมในคำสั่ง SQL โดยไม่มีการทำความสะอาดอย่างเหมาะสม ทำให้ผู้โจมตีสามารถเปลี่ยนแปลงตรรกะของคำสั่งได้ นี่เป็นหนึ่งในช่องโหว่เว็บที่เก่าแก่และสร้างความเสียหายมากที่สุด
การทำงานของการฉีดคำสั่ง SQL
ฟอร์มเข้าสู่ระบบเรียกใช้คำสั่ง: SELECT * FROM users WHERE username='INPUT' AND password='INPUT'
หากผู้โจมตีป้อน ' OR 1=1-- เป็นชื่อผู้ใช้ คำสั่งจะกลายเป็น: SELECT * FROM users WHERE username='' OR 1=1--' AND password='...' — ซึ่งจะส่งคืนข้อมูลผู้ใช้ทั้งหมด
ประเภทของการฉีดคำสั่ง SQL
รูปแบบของการฉีด SQL:
- ในช่องทางเดียวกัน: ผลลัพธ์ถูกส่งกลับโดยตรงในคำตอบ (แบบคลาสสิก แบบอาศัยข้อผิดพลาด)
- บูลีนแบบตาบอด: ไม่มีผลลัพธ์โดยตรง อนุมานข้อมูลจากคำตอบจริง/เท็จ
- อาศัยเวลาแบบตาบอด: อนุมานข้อมูลจากความล่าช้าของคำตอบ (
SLEEP(5)) - นอกช่องทาง: ข้อมูลถูกนำออกผ่านคำขอ DNS/HTTP
การฉีดแบบอาศัย UNION
การโจมตีด้วย UNION จะผนวกผลลัพธ์จากคำสั่งที่ผู้โจมตีควบคุม:
-- Discover number of columns:
id=1 ORDER BY 3--
-- Extract data:
id=1 UNION SELECT username,password,NULL FROM users--การฉีดแบบอาศัยข้อผิดพลาด
ข้อความข้อผิดพลาดอาจเปิดเผยโครงสร้างฐานข้อมูล ผู้โจมตีป้อนข้อมูลที่ทำให้เกิดข้อผิดพลาดทางไวยากรณ์ แล้วข้อความข้อผิดพลาดที่ได้จะเปิดเผยชื่อตาราง ชื่อคอลัมน์ หรือเวอร์ชันฐานข้อมูล ควรปิดข้อความข้อผิดพลาดแบบละเอียดในระบบจริง
การฉีด SQL แบบตาบอด
เมื่อไม่มีผลลัพธ์ที่มองเห็นได้ ผู้โจมตีจะใช้เงื่อนไขบูลีน:
-- If admin exists, page loads normally:
id=1 AND (SELECT COUNT(*) FROM users WHERE username='admin')=1--
-- Time-based:
id=1; IF(1=1) WAITFOR DELAY '0:0:5'--sqlmap: การฉีด SQL แบบอัตโนมัติ
sqlmap ช่วยทำให้การตรวจหาและใช้ประโยชน์จากการฉีด SQL เป็นไปโดยอัตโนมัติ สามารถดัมป์ฐานข้อมูล อ่านไฟล์ และแม้แต่เรียกใช้คำสั่ง OS ได้ หากผู้ใช้ฐานข้อมูลมีสิทธิ์เพียงพอ
sqlmap -u "http://target.com/page?id=1" --dbs
sqlmap -u "http://target.com/page?id=1" -D webapp -T users --dumpการป้องกันการฉีด SQL: คำสั่งแบบมีพารามิเตอร์
การป้องกันหลักคือ คำสั่งแบบมีพารามิเตอร์ (คำสั่งที่เตรียมไว้ล่วงหน้า) โดยส่งข้อมูลขาเข้าจากผู้ใช้เป็นพารามิเตอร์ และไม่เคยนำไปต่อเข้ากับสตริงคำสั่งโดยตรง:
# Python (safe):
cursor.execute("SELECT * FROM users WHERE username = %s", (username,))
# Node.js (safe):
pool.query("SELECT * FROM users WHERE id = $1", [userId])การป้องกันด้วย ORM
การใช้ ORM (SQLAlchemy, Hibernate, Sequelize) โดยทั่วไปจะป้องกันการฉีด SQL ได้ เพราะคำสั่งถูกสร้างผ่านนามธรรมที่ปลอดภัย อย่างไรก็ตาม เมธอดคำสั่งดิบ (execute(), query()) ที่แทรกสตริงจะหลีกเลี่ยงการป้องกันของ ORM
การตรวจสอบข้อมูลขาเข้าและ WAF
การป้องกันเพิ่มเติม:
- ตรวจสอบและอนุญาตเฉพาะประเภทข้อมูลที่กำหนด (จำนวนเต็ม อีเมล)
- ใช้ไฟร์วอลล์สำหรับเว็บแอปพลิเคชัน (WAF) เพื่อตรวจหารูปแบบการฉีด
- ใช้บัญชีฐานข้อมูลที่มีสิทธิ์น้อยที่สุด (ไม่มี DROP และไม่มี UNION สำหรับคำสั่งแบบอ่านอย่างเดียว)
- ใช้กระบวนงานที่จัดเก็บไว้ (ช่วยลดพื้นที่เสี่ยง แต่ไม่ใช่ทางแก้ไขที่สมบูรณ์)
ผลกระทบของการฉีด SQL
การฉีด SQL ที่สำเร็จอาจทำให้เกิดสิ่งต่อไปนี้: ดัมป์ฐานข้อมูลทั้งหมด การข้ามขั้นตอนยืนยันตัวตน การแก้ไขหรือลบข้อมูล การอ่านไฟล์ของเซิร์ฟเวอร์ (LOAD_FILE) การเขียนเว็บเชลล์ และการเรียกใช้คำสั่ง OS ผ่าน xp_cmdshell (MSSQL)
ตรวจสอบอย่างรวดเร็ว: การโจมตีแบบฉีดคำสั่งเอสคิวแอล
การป้องกันหลักจากการโจมตีแบบฉีดคำสั่งเอสคิวแอลคืออะไร
สรุปบทเรียน
การโจมตีแบบฉีดคำสั่งเอสคิวแอลใช้ข้อมูลนำเข้าจากผู้ใช้ที่ไม่ได้ทำให้ปลอดภัยเพื่อควบคุมคำสั่งสอบถามฐานข้อมูล ประเภทการโจมตี ได้แก่ แบบคลาสสิก แบบบูลีนเชิงอนุมาน แบบอิงเวลา และแบบ UNION การป้องกันหลักคือการใช้คำสั่งสอบถามแบบกำหนดพารามิเตอร์ — ห้ามนำข้อมูลนำเข้าจากผู้ใช้มาต่อเข้ากับคำสั่งเอสคิวแอลโดยเด็ดขาด ใช้เครื่องมือแปลงวัตถุกับฐานข้อมูลอย่างระมัดระวัง ใช้บัญชีฐานข้อมูลที่มีสิทธิ์น้อยที่สุด และปิดใช้ข้อความแสดงข้อผิดพลาดโดยละเอียด
คำถามที่พบบ่อย
บทเรียน “SQL Injection: ทำงานอย่างไรและเพราะเหตุใด” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “SQL Injection: ทำงานอย่างไรและเพราะเหตุใด” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Cyber Security Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Cyber Security Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “SQL Injection: ทำงานอย่างไรและเพราะเหตุใด”
ทำความเข้าใจ SQLi แบบคลาสสิก แบบตาบอด และแบบนอกช่องทาง รวมถึงเหตุผลที่คำสั่งค้นหาแบบกำหนดพารามิเตอร์ช่วยป้องกันได้ คุณปฏิบัติ Cyber Security Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Cyber Security Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Cyber Security Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “SQL Injection: ทำงานอย่างไรและเพราะเหตุใด” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Cyber Security Academy นี้ได้ไหม
ได้ บทเรียน Cyber Security Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- SQL Injection: ทำงานอย่างไรและเพราะเหตุใด
- Cross-Site Scripting (XSS)
- Cross-Site Request Forgery (CSRF)
- การกำหนดค่าความปลอดภัยผิดพลาดและบริการที่เปิดเผย