บทนำ (Overview)
ช่องโหว่ “SQL injection” นั้นปกติแล้วจะเกิดขึ้นกับ “Web application” ฝั่ง “Server side” แต่ในหัวข้อนี้จะกล่าวถึงการทำ “SQL injection” ฝั่งโปรแกรมบนมือถือ แม้จะพบไม่บ่อยครั้งในโปรแกรมสำคัญ ๆ ปัจจุบัน แต่ก็เป็นไปได้ เพราะช่องโหว่ดังกล่าวอาจส่งผลกระทบการโจมตีอื่น ๆ ต่อไปได้ เช่นการดึงข้อมูลสำคัญในฐานข้อมูล แม้ไฟล์จะมีการเข้ารหัส การ “Bypass” หน้า “Login” สำหรับโปรแกรมประเภท “Stand Alone” เป็นต้น สำหรับตัวอย่างของ iOS สามารถติดตามได้จากบทความ How to exploit SQL injection (SQLite)
ขั้นตอน (Steps)
- ติดตั้งโปรแกรมช่องโหว่ “DIVA” สามารถติดตามวิธีการติดตั้งได้ที่ How to install DIVA (android)
- จากนั้นเข้าไปที่เมนู “7. INPUT VALIDATION ISSUES – PART1”
- วัตถุประสงค์ของช่องโหว่นี้คือ เราจะต้องดึงข้อมูล ของบัญชีผู้ใช้ ทั้งหมดที่มีอยู่ในระบบ ทั้ง ๆ ที่เราไม่ทราบ “username” เลย โดยเราจะต้องโจมตีผ่านช่องข้อมูล “Search” เค้าใบ้ให้เล็กน้อยว่า มีบัญชีผู้ใช้ 3 ชื่ออยู่ในฐานข้อมูล และหนึ่งในนั้นชื่อว่า “admin” เรามาลองดูว่าจริงหรือไม่
- ในการทดสอบ “SQL injection” นั้น เราจะต้องหา “Sign” ที่เกิดจาก “Error” ของฐานข้อมูลเนื่องจาก เรากรอกอักขระพิเศษเข้าไปแล้วเกิดไปรวมกับคำสั่งเดิมของฐานข้อมูล ทำให้ผิดเพี้ยนไป โดยปกติจะใช้ ‘ (single quote)
- จากการทดสอบโดยใส่ ‘ ไม่พบข้อความใด ๆ ซึ่งแตกต่าง จากการกรอกหนึ่งตัวอักษรเช่น “a” นั้นก็เป็นหนึ่งการตั้งข้อสังเกตุเป็นไปได้ว่า อาจมีความผิดปกติกับคำสั่ง SQL ของฐานข้อมูล
- ถ้าเราทราบข้อมูลเบื้องต้นที่สามารถค้นหาข้อมูลได้ถูกต้อง เช่น “admin” เราสามารถทดสอบได้ว่า อักขระพิเศษของเราที่ใส่ไปสามารถประมวลผลได้ อาจส่งผลช่องโหว่ “SQL injection” ตัวอย่างเช่น admi’ || ‘n
- จากข้างต้นเราลองใส่ concatenate (||) หรือคำสั่งเชื่อมตัวอักษรเข้าไปโดยอยู่ระหว่าง “single quote” ผลจากการทดลองพบว่าสามารถค้นหาได้อย่างคำว่า “admin” เนื่องมากจาสมมติฐานตามข้างล่าง
select * from where col ='admi'||'n';
- ทีนี้เราย้อนกลับไปที่การใส่ “Single quote” อีกครั้ง แล้วลองไปตรวจสอบที่ “Log cat” ดูว่าจะพอมีข้อมูลอะไรบ้างที่จะช่วยเราได้ (สามารถติดตามได้จากบทความ How to read LogCat by using Appie2)
- เมื่อเราใส่ ‘ เข้าไปพบว่ามีการแจ้งข้อผิดพลาดผ่าน “Log Cat” ในส่วนของ “Where”
Diva-sqli D Error occurred while searching in database: unrecognized token: "'" (code 1): , while compiling: SELECT * FROM sqliuser WHERE user = '' '
- เพราะฉะนั้นถ้าเราใส่ ‘ or ‘1’ = ‘1 นั้นหมายความว่าจะครบ syntax โดยไม่มีข้อผิดพลาดดังนี้
SELECT * FROM sqliuser WHERE user = '' or '1' = '1';
- จากสมมุติฐานข้างต้นถ้าเป็นจริงเราก็สามารถดึงข้อมูลทุก “Row” ทุก “Column” ในตาราง “sqliuser” ได้