การโจมตีระบบด้วยเทคนิค SQL Injection

Kritchai Tadbhusinwat
G-Able
Published in
2 min readMay 5, 2023
Image from https://www.treinaweb.com.br/blog/protegendo-suas-aplicacoes-python-de-sql-injection

SQL Injection ถ้าดูจากชื่อแล้วจะต้องเกี่ยวข้องกับภาษา SQL และ คำว่า Injection แปลว่าการการฉีด แสดงว่าต้องมีการเติมอะไรบางอย่างเข้าไปในคำสั่ง SQL

การโจมตีระบบด้วยวิธีนี้มีมานานแล้ว แม้ว่าในปัจจุบันจะมีความพยายามป้องกัน เช่น ใช้ WAF(Web Application Firewall) คัดกรอง content ที่รับส่งใน Network , Escaping User Input ตรวจสอบ content ที่ได้รับมาจาก user , Access Permission กำหนดสิทธิ์การเข้าถึง เป็นต้น แต่ก็ยังคงพบว่ามีการถูกโจมตีด้วยวิธีการนี้อยู่ ดังนั้นในบทความนี้จะกล่าวถึงการโจมตีระบบด้วยเทคนิค SQL Injection และวิธีการเขียนโปรแกรมในภาษา Python เพื่อป้องกัน

โดยทั่วไปแล้ว Application ต่าง ๆ มักจะเก็บข้อมูลอยู่ใน Database
และการที่จะติดต่อกับ Database นั้นจะใช้ภาษา SQL ในการจัดการต่าง ๆ เช่น สร้าง Database , สร้าง Table , เรียกดู-แก้ไข ข้อมูล เป็นต้น

หมายเหตุ ผู้อ่านควรมีรู้พื้นฐานเกี่ยวกับภาษา SQL ก่อนอ่านต่อ

ในที่นี้จะใช้ Database SQLite ซึ่งมีติดมากับภาษา Python อยู่แล้วเป็นตัวอย่าง

จาก code ด้านบน จะทำการ connect ไปที่ไฟล์ Database ถ้าหากว่ายังไม่มีจะทำการสร้างใหม่ ดังนั้นจะพบว่าไฟล์ test_sql_injection.db ถูกสร้างขึ้นมา

จากนั้นจะทำการสร้าง Table ภายใต้ database test_sql_injection.db ชื่อว่า user และ country_code พร้อมทั้ง insert ข้อมูลเข้าไปเก็บใน table ทั้ง 2

Image by Author

โดยทั่วไปแล้ว Application ต่าง ๆ มักจะมีช่องให้ user กรอก ข้อมูล สิ่งที่ต้องการ จากใน database ดังนั้น จะลองสร้าง function เพื่อลองดึงข้อมูล ดังนี้

ที่บรรทัด 22–28 จะเห็นว่าโปรแกรมสามารถดึงค่ามาแสดงจาก database ได้ถูกต้อง

การโจมตีด้วยเทคนิค SQL Injection ที่บรรทัด 31, 36 จะเห็นว่า ค่าที่เราส่งไปนั้นเป็นส่วนหนึ่งของภาษา SQL และทำให้เงื่อนไข sql statement เป็นจริงเสมอ ทำให้โปรแกรม return ข้อมูลทั้งหมดใน table ออกมา
ที่บรรทัด 41 function จะทำการ query ข้อมูลที่ table user แต่สามารถดึงข้อมูลที่ table country_code ออกมาได้ด้วย โดยใช่คำสั่ง UNION

นอกจากนี้หาก Database ที่ใช้นั้น support การเรียก multiple sql statement ก็อาจจะถูกใช้คำสั่ง sql อื่น ๆ เช่น DROP(ลบ table) , UPDATE(แก้ข้อมูล) , — (comment คำสั่ง sql) ก็จะยิ่งทำให้เกิดความเสียหายกับข้อมูลได้

วิธีการเขียนโปรแกรมเพื่อป้องกัน สามารถทำได้โดยการแก้ไข function ที่ query ข้อมูล เปลี่ยนจากการ แทนค่าตัวแปรโดยตรงใน sql statement ก็ให้ใช้เป็น parameter แทน เรียกวิธีนี้ว่า Parameterised Query ดัง code ต่อไปนี้

นอกจากนี้หากต้องการ query ข้อมูล ออกมาเป็น pandas dataframe เลย เพื่อความสะดวกในการนำไปใช้งานต่อ สามารถทำได้ ดังนี้

จะเห็นว่าการใช้ parameter อาจจะมีความยุ่งยากกว่าการแทนค่าตัวแปรใน sql statement อยู่เล็กน้อย แต่ถ้าเทียบกับความปลอดภัยที่เพิ่มขึ้นก็ถือว่าคุ้มค่ามาก

--

--

Kritchai Tadbhusinwat
G-Able
Writer for

Programmer บริษัทเอกชนที่เป็นส่วนหนึ่งของเบื้องหลังให้กับบริษัทชั้นนำต่าง ๆ และ Tutor สอนกวดวิชาคณิตศาสตร์/ฟิสิกส์ เพื่อเตรียมสอบเข้ามหาวิทยาลัย