
ไขความลับฐานข้อมูล: เมื่อข้อผิดพลาดกลายเป็นหน้าต่างสู่ข้อมูลสำคัญ
เมื่อพูดถึงความปลอดภัยทางไซเบอร์ หนึ่งในช่องโหว่ที่อันตรายและพบบ่อยคือ SQL Injection
เป็นการโจมตีที่มุ่งเป้าไปที่การแทรกคำสั่ง SQL ที่ไม่พึงประสงค์เข้าไปในช่องทางที่แอปพลิเคชันสื่อสารกับฐานข้อมูล
และวันนี้ เราจะมาเจาะลึกรูปแบบการโจมตีที่น่าสนใจ นั่นคือ Error-Based SQL Injection ที่อาศัยข้อผิดพลาดจากฐานข้อมูลเพื่อเปิดเผยข้อมูลลับออกมา
อะไรคือ Error-Based SQL Injection?
Error-Based SQL Injection คือเทคนิคที่ผู้โจมตีจงใจสร้างข้อผิดพลาดขึ้นในฐานข้อมูล เพื่อให้ข้อความผิดพลาดเหล่านั้นเปิดเผยข้อมูลบางอย่างที่ปกติแล้วจะไม่ถูกแสดง
แทนที่จะพยายามดึงข้อมูลโดยตรงเหมือน UNION-Based SQL Injection วิธีนี้จะใช้ข้อความแสดงข้อผิดพลาดของฐานข้อมูลเป็นช่องทางในการดูข้อมูล
จินตนาการว่าคุณพยายามเปิดประตู แต่แทนที่จะเปิด คุณกลับได้ยินเสียงของกลไกข้างในที่บอกรายละเอียดเกี่ยวกับตัวล็อกนั้น นี่คือหลักการพื้นฐานของมัน
คุกกี้ TrackingId กับช่องโหว่ที่มองไม่เห็น
หลายคนอาจไม่คิดว่าคุกกี้อย่าง TrackingId ที่ดูเหมือนไม่มีพิษมีภัย จะกลายเป็นจุดอ่อนได้
แต่ในความเป็นจริง TrackingId สามารถเป็นจุดเริ่มต้นของการโจมตี SQL Injection ได้ หากแอปพลิเคชันนำค่าในคุกกี้นี้ไปประมวลผลในคำสั่ง SQL โดยไม่มีการตรวจสอบและกรองข้อมูลอย่างเหมาะสม
ผู้โจมตีสามารถแก้ไขค่า TrackingId เพื่อแทรกโค้ด SQL เข้าไปได้ และเมื่อฐานข้อมูลพยายามประมวลผลคำสั่งที่ผิดปกติเหล่านั้น ก็อาจเกิดข้อผิดพลาดขึ้นมา
ไขรหัสฐานข้อมูล: เมื่อ PostgreSQL เผยตัวตน
การรู้ว่าฐานข้อมูลปลายทางเป็นชนิดใดมีความสำคัญอย่างยิ่ง เพราะฟังก์ชันและไวยากรณ์ของ SQL จะแตกต่างกันไป
ในกรณีของ PostgreSQL ซึ่งเป็นระบบจัดการฐานข้อมูลแบบโอเพนซอร์สที่ได้รับความนิยมอย่างมาก มีเทคนิคเฉพาะที่สามารถใช้เพื่อดึงข้อมูลผ่านข้อผิดพลาด
เช่น การพยายามแปลงค่าบางอย่างที่ฐานข้อมูลไม่สามารถแปลงได้ (Type Conversion Error) บ่อยครั้งที่ข้อความผิดพลาดจะปรากฏขึ้นพร้อมกับข้อมูลที่เราต้องการดึงออกมา
การใช้คำสั่งที่จงใจทำให้เกิดข้อผิดพลาด เช่น SELECT CAST(เวอร์ชันฐานข้อมูล AS integer) จะทำให้ PostgreSQL แสดงข้อความผิดพลาดที่รวมถึงค่าของเวอร์ชันฐานข้อมูลที่ต้องการ
สร้าง Payload เพื่อเปิดเผยข้อมูล
การสร้าง Payload หรือโค้ดคำสั่งโจมตี ต้องอาศัยความเข้าใจในไวยากรณ์ SQL ของฐานข้อมูลนั้นๆ และวิธีการสร้างข้อผิดพลาด
ตัวอย่างเช่น หากเราต้องการดึงชื่อฐานข้อมูล ผู้โจมตีอาจแทรกโค้ด SQL เข้าไปใน TrackingId ลักษณะนี้:
TrackingId=xyz' AND (SELECT CAST(version() AS integer))--
เมื่อระบบประมวลผลคำสั่งนี้ PostgreSQL จะพยายามแปลงค่าสตริงที่ได้จากฟังก์ชัน version() ให้เป็นจำนวนเต็ม ซึ่งไม่สามารถทำได้
ผลลัพธ์คือข้อผิดพลาดจะปรากฏขึ้น และในข้อความผิดพลาดนั้น อาจมีข้อมูลเวอร์ชันของฐานข้อมูลที่ถูกเปิดเผยออกมา
นี่เป็นเพียงตัวอย่างง่ายๆ แต่หลักการเดียวกันนี้สามารถนำไปใช้เพื่อดึงข้อมูลอื่นๆ เช่น ตาราง ผู้ใช้ หรือข้อมูลสำคัญอื่นๆ ได้
ป้องกันระบบของคุณให้ปลอดภัย
การป้องกัน Error-Based SQL Injection เริ่มต้นที่การตรวจสอบและกรองข้อมูลที่เข้ามาในแอปพลิเคชันอย่างเข้มงวด
ใช้ Prepared Statements หรือ Parameterized Queries เพื่อแยกโค้ด SQL ออกจากข้อมูลที่ผู้ใช้ป้อน ซึ่งเป็นวิธีที่มีประสิทธิภาพที่สุด
จำกัดสิทธิ์ของบัญชีฐานข้อมูลให้เข้าถึงเฉพาะข้อมูลที่จำเป็นเท่านั้น และกำหนดค่าการแสดงข้อผิดพลาดของฐานข้อมูลให้ไม่เปิดเผยข้อมูลที่ละเอียดอ่อนแก่ผู้ใช้
การหมั่นตรวจสอบความปลอดภัยของแอปพลิเคชันและอัปเดตระบบอยู่เสมอ เป็นสิ่งสำคัญที่ไม่ควรมองข้าม เพราะช่องโหว่ทางความปลอดภัยมักถูกค้นพบใหม่ๆ อยู่เสมอ