ไม่ว่าจะนานแค่ไหน ตั้งแต่ยุคดึกดําบรรพ์จนถึงปัจจุบัน การโจมตีช่องโหว่ SQL Injection ก็ยังเป็นวิธีการแฮ็กที่ค่อนข้างจะคลาสสิกและยังคงมีความอันตรายอยู่ ซึ่งช่องโหว่นี้เกิดจากการที่แฮกเกอร์แทรกโค้ด SQL เข้าไปในช่องรับข้อมูลบนเว็บไซต์ที่ไม่ได้มีการป้องกันอย่างเหมาะสม ส่งผลให้แฮกเกอร์สามารถเข้าถึงข้อมูลและแก้ไขข้อมูลใน Database ได้ตามใจชอบ ไม่ว่าจะเป็นการดึงข้อมูลสำคัญ ลบข้อมูล หรือแม้กระทั่งการเข้ายึดระบบได้ โดยวันนี้เราจะสามารถแสดงวิธีการและเทคนิคที่ใช้โจมตีช่องโหว่ SQL Injection กันครับ
โดยในบทความนี้เราจะเน้นไปที่การโจมตีแบบ Manual ซึ่งจะใช้เครื่องมือที่ชื่อว่า Burp Suite เป็นหลัก เพื่อให้สามารถวิเคราะห์และโจมตีได้ง่ายขึ้น
Burp Suite คืออะไร
Burp Suite เป็นเครื่องมือที่ใช้ในการตรวจสอบและวิเคราะห์การทำงานของเว็บแอปพลิเคชัน ผ่านการดักจับและปรับแต่ง HTTP Request/Response หรือการส่งข้อมูลระหว่างผู้ใช้งานและเว็บเซิร์ฟเวอร์ โดยมีโมดูลย่อย ๆ หลายชนิด เช่น Proxy, Scanner, Intruder ที่ช่วยให้เราค้นหาช่องโหว่และทำการโจมตีได้ง่ายขึ้น นอกจากนี้ Burp Suite ยังมีฟังก์ชันเพิ่มเติมอย่าง Repeater และ Sequencer ซึ่งช่วยให้การทดสอบและวิเคราะห์ความปลอดภัยของเว็บแอปพลิเคชันสามารถทำได้ง่ายขึ้น
การโจมตีช่องโหว่ SQL Injection จะแบ่งออกเป็นหลาย ๆ แบบด้วยกัน ยกตัวอย่างเช่น Error-Based, Union-Based และ Boolean-Based เป็นต้น ซึ่งในบทความนี้เราจะจำลองการโจมตีเป็นแบบ Error-based เพื่อให้ผู้อ่านสามารถทำความเข้าใจได้ง่ายขี้นครับ
โดยเราจะขอยืมแล็บ SQLi-Labs-Docker จาก Github ของคุณ yuyudhn มาใช้จำลองเป็นเว็บแอปพลิเคชันที่มีช่องโหว่ SQL Injection ครับ
หน้าล็อคอินเราจะเห็นว่ามีให้กรอกอีเมล และรหัสผ่านเพื่อเข้าใช้งานเว็บแอปพลิเคชัน จากนั้นเราได้ลองล็อคอินด้วย
อีเมล user@email.com และรหัสผ่านเป็น password เราจะพบว่ามีการแจ้งเตือน Invalid Credential
ถัดมาเราได้ใช้ Burp Suite เพื่อส่ง HTTP Request อีกครั้ง แต่ครั้งนี้เราได้ลองเพิ่ม Single Quote(‘) ต่อท้ายอีเมล user@email.com แล้วจะเห็นว่าเว็บแอปพลิเคชันมีการแสดง Error ของ SQL Syntax ออกมาที่หน้าล็อคอิน ตามภาพ
จาก Error ที่แสดงออกมาทำให้เราได้รู้ว่าหน้าล็อคอินสามารถโจมตี SQL Injection ได้!!!!
เมื่อเรารู้แล้วว่าสามารถโจมตี SQL Injection ได้ ถึงตอนนี้เราสามารถค้นหา Payload จากเว็บ Portswigger หรือ Pentestmonkey ได้เลย โดยในขั้นถัดไปเราสามารถโจมตี SQL Injection เพื่อดูว่าตอนนี้เว็บแอปพลิเคชันใช้ Database อะไรอยู่ สามารถใช้เป็น Payload ได้ดังนี้เลยครับ
user@email.com’+AND+EXTRACTVALUE(1,CONCAT(0x5c,(SELECT+database())))+AND+’
อธิบายเพิ่มเติม: Payload นี้ใช้ฟังก์ชัน EXTRACTVALUE เพื่อทำให้เกิด Error ใน SQL Syntax จากนั้นใช้ SELECT database() เพื่อดึงชื่อ Database ออกมาแสดงใน Error Message ด้วย
จากภาพ ทำให้เราได้รู้ว่าเว็บแอปพลิเคชันใช้งาน Database ชื่อว่า evangelion_sqli เย่!!!!
แต่เดียวก่อน ถ้าหยุดแค่นี้มันก็คงไม่ใช่ SQL Injection นะสิ เป้าหมายของคือการหาอีเมลและรหัสผ่านเพื่อใช้ล็อคอินเข้าไปใช้งานเว็บแอปพลิเคชันให้ได้
แถม!! จริง ๆ แล้วเราสามารถโจมตี SQL Injection เพื่อดูข้อมูลจาก Database อื่นได้ด้วย โดยเราสามารถใช้งาน Payload ได้ดังนี้เลย
user@email.com’+AND+EXTRACTVALUE(1,CONCAT(0x5c,(SELECT+schema_name+FROM+information_schema.schemata+LIMIT+1+OFFSET+2)))+AND+’
อธิบายเพิ่มเติม: Payload นี้ใช้งาน SELECT schema_name FROM information_schema.schemata LIMIT 1 OFFSET 2 ซึ่งจะดึงชื่อของ Database ลำดับที่สามออกมา โดยเราสามารถเปลี่ยน OFFSET เพื่อดึงชื่อของ Database อื่น ๆ ออกมาได้
กลับมาที่เป้าหมายของเราต่อ โดยขั้นตอนถัดมาเราสามารถที่จะทำการโจมตีต่อเพื่อดึงข้อมูล Table ทั้งหมดจาก Database evangelion_sqli ได้
user@email.com’+AND+EXTRACTVALUE(1,CONCAT(0x5c,(SELECT+GROUP_CONCAT(table_name)+FROM+information_schema.tables+WHERE+TABLE_SCHEMA+=+’evangelion_sqli’)))+AND+’
อธิบายเพิ่มเติม: Payload นี้ใช้ฟังก์ชัน SELECT GROUP_CONCAT(table_name) FROM information_schema.tables เพื่อดึงชื่อของ Table ทั้งหมดจาก Database ที่ชื่อ evangelion_sqli
จากภาพ เราจะเห็นว่าใน Database ที่ชื่อ evangelion_sqli มี Table ทั้งหมด 2 Table โดยมีจะ Table Info และ Users ครับ ซึ่งในที่นี่เราสนใจแค่ Table ที่ชื่อ Users เท่านั้น เพราะเป้าหมายของเราคือการหาอีเมลและรหัสผ่าน!!
ต่อมาเราจะใช้ Payload เพื่อดีงข้อมูลจาก Table ชื่อ Users กันครับ
user@email.com’+AND+EXTRACTVALUE(1,CONCAT(0x5c,(SELECT+CONCAT(email,’:’,password)+FROM+Users+LIMIT+1)))+AND+’
อธิบายเพิ่มเติม: Payload นี้ใช้ SELECT CONCAT(email, ‘:’, password) FROM Users LIMIT 1 เพื่อดึงข้อมูล email และ password จาก Table ที่ชื่อ Users ซึ่งการใช้ EXTRACTVALUE จะมีข้อด้อยคือ ถ้ารหัสผ่านยาวเกินไปเราจะดึงข้อมูลออกมาไม่หมด ทำให้อาจจะต้องใช้วิธีอื่นในการโจมตี
จากภาพ เราจะเห็นว่าสามารถโจมตี SQL Injection เพื่อดึงข้อมูลอีเมลและรหัสผ่านได้สำเร็จ เย่ ๆ ๆ จากนั้นเราได้ลองนำอีเมลและรหัสผ่านมาล็อคอิน แล้วก็จะเห็นว่าสามารถล็อคอินได้แล้ว!!
ถึงตรงนี้เราก็สำเร็จเป้าหมายในการหาอีเมลและรหัสผ่านเรียบร้อยแล้วครับ
Conclusion
สรุปภาพรวมสำหรับ SQL Injection จากที่เราได้ทำมาทั้งหมดเป็นแค่ส่วนหนึ่งของกระบวนการโจมตีเท่านั้น ซึ่งในระบบที่มีการตั้งค่าที่ไม่เหมาะสมอาจจะทำให้แฮกเกอร์สามารถโจมตี SQL Injection เพื่อเข้ายึดระบบได้เลย แต่ในบทความนี้เราไม่สามารถแสดงให้เห็นได้เนื่องจากตัวแล็บมีการตั้งค่าจำกัดสิทธิการเขียนไฟล์ ทำให้ไม่สามารถเขียนไฟล์ลงไปในระบบของเว็บแอปพลิเคชันได้ จึงไม่สามารถโจมตี SQL Injection เพื่อยึดระบบได้นั้นเอง ในบทความถัด ๆ ไปเราอาจมีการแสดงวิธีการโจมตี SQL Injection ที่ยากกว่านี้ โดยจะเป็น Boolean-Based ซึ่งอาจจะมีการเขียน Python Script เพื่อใช้ในการโจมตี เนื่องจากช่องโหว่มีความซับซ้อน และทั้งหมดนี้ ขอขอบคุณทุกท่านที่ทำการอ่านบทความนี้จนจบนะครับ ผิดพลาดตรงไหน ขออภัยด้วยนะครับ สำหรับวันนี้เราขอเป็ดไปก่อน เอ๊ยลาไปก่อน สวัสดีครับ