0Pricing
Security+ Academy · บทเรียน

การแทรกคำสั่ง SQL และคำสั่งระบบ

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

การแทรกคำสั่ง SQL และคำสั่งระบบ เป็นบทเรียน Security+ Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Security+ Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Security+ Academy มีบทเรียนทั้งหมด 4 บทเรียน

SQL Injection คืออะไร

การโจมตี SQL (SQLi) เกิดขึ้นเมื่อผู้โจมตีแทรกหรือ “ฉีด” โค้ด SQL ที่เป็นอันตรายลงในช่องรับข้อมูล ซึ่งภายหลังถูกส่งต่อไปยังคำสั่งสอบถามฐานข้อมูล เนื่องจากแอปพลิเคชันนำข้อมูลจาก User มาต่อเข้ากับคำสั่ง SQL โดยตรง ฐานข้อมูลจึงไม่สามารถแยกแยะระหว่างข้อมูลที่ถูกต้องกับ Commands ที่ผู้โจมตีส่งมาได้ SQLi มักได้รับการจัดอันดับให้เป็นหนึ่งใน Vulnerability บนเว็บที่อันตรายที่สุดใน OWASP Top 10

ตัวอย่าง Payload ของ SQLi แบบคลาสสิก

คำสั่งสอบถามสำหรับการเข้าสู่ระบบที่มี Vulnerability อาจมีลักษณะดังนี้: SELECT * FROM users WHERE username='INPUT' AND password='INPUT' ผู้โจมตีที่ส่ง ' OR '1'='1 เป็นชื่อ User จะทำให้คำสั่งสอบถามเปลี่ยนไปจนเงื่อนไข WHERE เป็นจริงเสมอ และข้ามขั้นตอนการยืนยันตัวตนทั้งหมด นี่คือ การโจมตีแบบฉีดที่ใช้สัจนิรันดร์

-- Vulnerable query (DO NOT use in production)
SELECT * FROM users
WHERE username = '' OR '1'='1'
  AND password = 'anything';
-- Returns ALL rows — auth bypassed

ประเภทของ SQL Injection

การโจมตีแบบ SQL Injection มีหลายรูปแบบ ได้แก่ SQLi แบบ In-band ซึ่งส่งผลลัพธ์กลับมาโดยตรงในการตอบกลับ HTTP (แบบอาศัยข้อผิดพลาดหรือแบบใช้ยูเนียน) SQLi แบบ Blind อนุมานข้อมูลจากการตอบกลับแบบ Boolean จริง/เท็จ หรือการหน่วงเวลาโดยเจตนา (SLEEP(5)) และ SQLi แบบ Out-of-band ซึ่งใช้ช่องทางรอง เช่น การค้นหา DNS เพื่อขโมยข้อมูลออกไป เมื่อไม่สามารถมองเห็นการตอบกลับได้

-- Time-based blind SQLi example
SELECT * FROM users
WHERE id = '1' AND SLEEP(5)--';
-- If response is delayed 5s, injection succeeded

การป้องกัน SQLi: คำสั่งสอบถามแบบกำหนดพารามิเตอร์

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

# Python example — parameterized query (safe)
import sqlite3
conn = sqlite3.connect('app.db')
cursor = conn.cursor()
username = 'admin'
password = 'secret'
cursor.execute(
    'SELECT * FROM users WHERE username=? AND password=?',
    (username, password)  # parameters, never concatenated
)

การตรวจสอบข้อมูลนำเข้าเป็นการป้องกันหลายชั้น

แม้คำสั่งสอบถามแบบกำหนดพารามิเตอร์จะเป็นการป้องกันหลัก แต่ การตรวจสอบข้อมูลนำเข้า ก็เป็นชั้นป้องกันรองที่สำคัญ การตรวจสอบแบบ Allowlist ยอมรับเฉพาะอักขระที่คาดไว้ เช่น อนุญาตเฉพาะตัวอักษรและตัวเลขสำหรับช่องชื่อ User และปฏิเสธข้อมูลอื่นทั้งหมด ส่วนการตรวจสอบแบบ Denylist จะบล็อกอักขระอันตรายที่ Known แต่ผู้โจมตีมักเข้ารหัสหรือทำให้ Payload คลุมเครือเพื่อหลบเลี่ยง Denylist จึงทำให้ Allowlist แข็งแกร่งกว่ามาก

Command Injection คืออะไร

การแทรก Commands (การแทรก Commands ของ OS) เกิดขึ้นเมื่อแอปพลิเคชันส่งข้อมูลจาก User ที่ยังไม่ได้ทำความสะอาดไปยัง Shell ของระบบ ซึ่งแตกต่างจาก SQL Injection ที่มุ่งโจมตีฐานข้อมูล การแทรก Commands มุ่งโจมตีระบบปฏิบัติการโดยตรง ทำให้ผู้โจมตีสามารถ run Commands ใด ๆ ด้วย Privileges ของกระบวนการเว็บเซิร์ฟเวอร์ Vulnerability ประเภทนี้ได้รับการจัดระดับความรุนแรงเป็น CRITICAL และมักนำไปสู่การยึดครองระบบทั้งหมด

ตัวอย่าง Command Injection

เว็บแอปที่ส่ง Ping ไปยังที่อยู่ IP ซึ่ง User ระบุ อาจใช้: ping -c 1 INPUT หากผู้โจมตีส่ง 8.8.8.8; cat /etc/passwd Shell จะตีความ ; เป็นตัวคั่น Commands และ run Commands ทั้งสองรายการ ตัวดำเนินการ Injection ที่พบบ่อย ได้แก่ ;, &&, ||, | และการแทนที่ Commands ด้วย Backtick

# Vulnerable Python (subprocess with shell=True)
import subprocess
user_ip = '8.8.8.8; cat /etc/passwd'  # attacker input
subprocess.run('ping -c 1 ' + user_ip, shell=True)

# Safe alternative — avoid shell=True, pass args as list
subprocess.run(['ping', '-c', '1', '8.8.8.8'])

การป้องกัน Command Injection

การป้องกัน Command Injection ที่ปลอดภัยที่สุดคือ หลีกเลี่ยงการเรียกใช้ Commands ของ OS จากข้อมูลของ User โดยสิ้นเชิง และใช้ฟังก์ชันจากไลบรารีที่ทำเป้าหมายเดียวกันแทน เมื่อหลีกเลี่ยงการเรียกใช้ Shell ไม่ได้ ให้ส่งอาร์กิวเมนต์เป็นรายการ (ไม่ใช้สตริงที่นำมาต่อกัน) ปิดการตีความของ Shell ตรวจสอบข้อมูลนำเข้ากับ Allowlist ที่เข้มงวด และ run กระบวนการด้วยบัญชี User ที่มี Privileges ต่ำที่สุด เท่าที่เป็นไปได้

บริบทของ OWASP: Injection ใน 10 อันดับแรก

OWASP Top 10 จัดให้ Injection ซึ่งครอบคลุมการโจมตีแบบ SQL, NoSQL, OS และ LDAP injection เป็นหนึ่งในความเสี่ยงด้านความปลอดภัยของแอปพลิเคชันที่สำคัญที่สุด OWASP แนะนำแนวทางการป้องกันหลายชั้น ได้แก่ ใช้ API ที่ปลอดภัยและไม่เรียกใช้ตัวแปลภาษา ตรวจสอบความถูกต้องของข้อมูลนำเข้าที่ฝั่ง Server โดยยอมรับเฉพาะรายการที่อนุญาต แปลงอักขระพิเศษโดยใช้รูปแบบไวยากรณ์เฉพาะของตัวแปลภาษานั้น และใช้การควบคุมของ SQL เช่น LIMIT เพื่อป้องกันการเปิดเผยข้อมูลจำนวนมาก

การตรวจจับ: WAF และการบันทึกเหตุการณ์

ไฟร์วอลล์แอปพลิเคชันบนเว็บ (WAF) สามารถตรวจจับและบล็อกข้อมูลโจมตีแบบ injection ที่พบบ่อยได้ โดยตรวจสอบคำขอ HTTP เทียบกับรูปแบบลายเซ็น อย่างไรก็ตาม WAF อาจถูกหลบเลี่ยงได้ด้วยเทคนิคการเข้ารหัส และไม่สามารถใช้ทดแทนการเขียนโค้ดอย่างปลอดภัยได้ การบันทึกเหตุการณ์ของแอปพลิเคชันอย่างเหมาะสม ซึ่งบันทึกพารามิเตอร์คำค้น รหัสการตอบกลับ และข้อความข้อผิดพลาด ช่วยให้ทีมรักษาความปลอดภัยระบุความพยายามโจมตีแบบ injection ได้ระหว่างการตรวจสอบเหตุการณ์

ผลกระทบในโลกจริงของการโจมตีแบบ Injection

การโจมตีแบบ injection ทำให้เกิดการรั่วไหลของข้อมูลครั้งใหญ่ที่สุดหลายครั้งในประวัติศาสตร์ เหตุข้อมูลรั่วไหลของ Equifax ในปี 2017 เปิดเผยระเบียนข้อมูล 147 ล้านรายการผ่านช่องโหว่ของแอปพลิเคชันบนเว็บ การโจมตีแบบ SQL injection ต่อเครือข่าย Sony PlayStation ทำให้บัญชี 77 ล้านบัญชีถูกเจาะในปี 2011 เหตุการณ์เหล่านี้แสดงให้เห็นว่าช่องโหว่แบบ injection สร้างผลกระทบทางธุรกิจอย่างรุนแรง ทั้งการขโมยข้อมูล ค่าปรับตามกฎระเบียบ ความเสียหายต่อชื่อเสียง และความรับผิดทางกฎหมาย ล้วนเกิดขึ้นได้หลังการโจมตีแบบ injection ประสบความสำเร็จ

ตรวจสอบความเข้าใจอย่างรวดเร็ว

ทดสอบความเข้าใจแนวคิดของ CompTIA Security+ (SY0-701) จากบทเรียนนี้

สรุปบทเรียน

ในบทเรียนนี้ คุณได้เรียนรู้ว่า SQL injection ใช้ประโยชน์จากข้อมูลนำเข้าที่ไม่ได้ทำความสะอาดและถูกนำไปต่อรวมในคำค้นของฐานข้อมูล command injection ส่งข้อมูลนำเข้าที่เป็นอันตรายไปยังเชลล์ของ OS ผ่านตัวดำเนินการอย่าง ; และ | และ คำค้นแบบกำหนดพารามิเตอร์กับการหลีกเลี่ยง shell=True เป็นแนวทางป้องกันหลัก บทถัดไปเราจะสำรวจการโจมตีแบบ Cross-Site Scripting (XSS) และ CSRF

คำถามที่พบบ่อย

บทเรียน “การแทรกคำสั่ง SQL และคำสั่งระบบ” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การแทรกคำสั่ง SQL และคำสั่งระบบ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Security+ Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Security+ Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การแทรกคำสั่ง SQL และคำสั่งระบบ”

เรียนรู้ว่าผู้โจมตีสร้างข้อมูลนำเข้าเพื่อแทรกคำสั่งและควบคุมคำค้นฐานข้อมูลหรือคำสั่ง OS ได้อย่างไร รวมถึงวิธีที่คำค้นแบบกำหนดพารามิเตอร์และการตรวจสอบข้อมูลนำเข้าช่วยป้องกันการโจมตี คุณปฏิบัติ Security+ Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Security+ Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Security+ Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “การแทรกคำสั่ง SQL และคำสั่งระบบ” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Security+ Academy นี้ได้ไหม

ได้ บทเรียน Security+ Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การแทรกคำสั่ง SQL และคำสั่งระบบ
  2. การเขียนสคริปต์ข้ามไซต์ (XSS) และ CSRF
  3. การยืนยันตัวตนที่มีข้อบกพร่องและการดีซีเรียลไลซ์ที่ไม่ปลอดภัย
  4. SDLC ที่ปลอดภัย เครื่องมือ SAST และ DAST
← กลับไปที่ Security+ Academy