16 ธ.ค. 2022 เวลา 08:41 • วิทยาศาสตร์ & เทคโนโลยี
SQL Injection
SQL Injection เป็นการโจมตีโดยแทรก (inject) คำสั่ง SQL ไปในพวกค่าต่างๆที่รับไปจากฝั่ง Client แล้วเอาไปประมวลผลที่ Server
ค่าพวกนี้เป็นได้ทั้งค่าที่มาจาก User Input ค่าที่ Browser สร้างเอง ค่า Cookie หรือ Header ต่างๆ ถ้าหากฝั่ง Server รับค่านั้นๆมาแล้วประกอบเป็นคำสั่ง SQL เอาไปประมวลผลก็โดนโจมตีได้หมด
ตัวอย่าง classic ที่มักเอามาสอนกันคือที่หน้า Login โดยการเอา username กับ password ไป query ต่อในฐานข้อมูล ถ้าถูกโจมตีก็เช่นเปลี่ยน SQL statement นั้นให้เป็นจริงตลอดโดยการใส่ statement ที่เป็นจริง ก็จะทำให้ผ่านหน้า Login ไปได้
ตัวอย่าง ใช้ statement or 1=1 ไปต่อ SQL คำสั่งเดิม อย่าง SELECT * FROM TABLE WHERE ID=1 XXXX กลายเป็น SELECT * FROM TABLE WHERE ID=1 or 1=1 -- XXXX ก็จะทำให้ได้ค่าเป็น true ตลอด ส่วน XXXX อันนั้นก็กลายเป็น Comment ไป
*** IMPACT ***
ผลกระทบจาก SQL Injection หลักๆ มีอยู่ 2-3 อย่าง เช่น
- สามารถเข้าถึงข้อมูลที่ไม่ควรจะเข้าได้ จากที่อ่านได้เฉพาะตาม condition ใน WHERE ก็อาจจะอ่านได้มากกว่านั้น
- เปลี่ยน Logic การทำงาน อย่างเช่นการ Login
- อาจจะ Update & Delete ข้อมูลในฐานข้อมูลได้ด้วย
ทั้งนี้ทั้งนั้น มันก็ขึ้นอยู่กับข้อมูลที่อยู่ในฐานข้อมูลนั้นๆ ว่า Sensitive ขนาดไหน มีข้อมูล username & password แล้วมีการเข้ารหัสไหม SQL statement ที่สามารถ Inject เข้าไปนั้นทำได้ขนาดไหน สิทธิในการรัน เป็นต้น
*** EXAMPLE ***
- Retrieving hidden data เข้าถึงข้อมูลเพิ่มขึ้น โดยเปลี่ยนแปลงเงื่อนไข
eg. SELECT * FROM products WHERE category = 'Gifts' AND released = 1
- Subverting application logic , bypass login โดยเปลี่ยนแปลงเงื่อนไข
eg. SELECT * FROM users WHERE username = 'administrator'--' AND password = ''
- Retrieving data from other database tables เข้าถึงข้อมูล โดย union กับ table อื่น
eg. SELECT name, description FROM products WHERE category = 'Gifts' UNION SELECT username, password FROM users--
- Examining the database เข้าถึง table default ของฐานข้อมูล
eg. SELECT * FROM information_schema.tables
- Blind SQL injection vulnerabilities บางทีผลจากการทำงานมันไม่ได้แสดงมาที่หน้าเว็บโดยตรง แต่ก็ยังสามารถโจมตี SQL injection ได้อยู่
- conditional responses by triggering SQL errors สังเกตจากการใส่ Query ให้มัน Error แล้วดูตรง response นั้นแหละว่า Error ไหม
- conditional responses by triggering time delays สังเกตจากการใส่ Query ให้มัน Delay แล้วดูตรง response ว่ามันปกติหรือ Delay
- Second-order SQL injection เรียกอีกอย่างว่า Store SQLi คล้ายๆ Store XSS แต่เปลี่ยนจากคำสั่ง XSS เป็น SQLi แทน
*** PREVENTION ***
หลักๆ มีอยู่ 2 แนวทาง
- เขาบอกให้ใช้ Prepare Statement ในแต่ละภาษามันก็จะมีทางของมัน ในการเอา Parameter ที่รับมา เอาไปประมวลผลร่วมกับ SQL แบบปลอดภัย ถ้า Dev รู้จักก็แนะนำให้ใช้ท่านี้ แต่ถ้า dev ไม่รู้จัก แล้วจะให้เราไปช่วยเขียนให้ อธิบายยาว ต้องหา Solution ให้ ผมจะข้ามทางเลือกนี้ไปเพราะงานมันจะวนกลับมา
- กำหนด Whitelist ของตัวอักษรที่รับมา ผมว่าอันนี้เข้าใจง่ายกว่า พวก sql statement อย่าง single quote ช่องว่าง อักขระแปลกๆ ก็ไม่ยอมรับพวกนี้ไป เช่นถ้ารับเฉพาะตัวเลข ก็ filter ตัวอื่นออกให้หมด

ดูเพิ่มเติมในซีรีส์

โฆษณา