How to exploit SQL injection (SQLite) – INPUT VALIDATION ISSUES – PART1

บทนำ (Overview)

ช่องโหว่ “SQL injection” นั้นปกติแล้วจะเกิดขึ้นกับ “Web application” ฝั่ง “Server side”  แต่ในหัวข้อนี้จะกล่าวถึงการทำ “SQL injection” ฝั่งโปรแกรมบนมือถือ แม้จะพบไม่บ่อยครั้งในโปรแกรมสำคัญ ๆ ปัจจุบัน แต่ก็เป็นไปได้ เพราะช่องโหว่ดังกล่าวอาจส่งผลกระทบการโจมตีอื่น ๆ ต่อไปได้ เช่นการดึงข้อมูลสำคัญในฐานข้อมูล แม้ไฟล์จะมีการเข้ารหัส การ “Bypass” หน้า “Login” สำหรับโปรแกรมประเภท “Stand Alone” เป็นต้น สำหรับตัวอย่างของ iOS สามารถติดตามได้จากบทความ How to exploit SQL injection (SQLite)

ขั้นตอน (Steps)

  1. ติดตั้งโปรแกรมช่องโหว่ “DIVA” สามารถติดตามวิธีการติดตั้งได้ที่ How to install DIVA (android)
  2. จากนั้นเข้าไปที่เมนู “7. INPUT VALIDATION ISSUES – PART1”DIVAandroid-input-part1-01
  3. วัตถุประสงค์ของช่องโหว่นี้คือ เราจะต้องดึงข้อมูล ของบัญชีผู้ใช้ ทั้งหมดที่มีอยู่ในระบบ ทั้ง ๆ ที่เราไม่ทราบ “username” เลย โดยเราจะต้องโจมตีผ่านช่องข้อมูล “Search” เค้าใบ้ให้เล็กน้อยว่า มีบัญชีผู้ใช้ 3 ชื่ออยู่ในฐานข้อมูล และหนึ่งในนั้นชื่อว่า “admin” เรามาลองดูว่าจริงหรือไม่ DIVAandroid-input-part1-02
  4. ในการทดสอบ “SQL injection” นั้น เราจะต้องหา “Sign” ที่เกิดจาก “Error” ของฐานข้อมูลเนื่องจาก เรากรอกอักขระพิเศษเข้าไปแล้วเกิดไปรวมกับคำสั่งเดิมของฐานข้อมูล ทำให้ผิดเพี้ยนไป โดยปกติจะใช้ ‘ (single quote)DIVAandroid-input-part1-03
  5. จากการทดสอบโดยใส่ ‘ ไม่พบข้อความใด ๆ ซึ่งแตกต่าง จากการกรอกหนึ่งตัวอักษรเช่น “a” นั้นก็เป็นหนึ่งการตั้งข้อสังเกตุเป็นไปได้ว่า อาจมีความผิดปกติกับคำสั่ง SQL ของฐานข้อมูลDIVAandroid-input-part1-04
  6. ถ้าเราทราบข้อมูลเบื้องต้นที่สามารถค้นหาข้อมูลได้ถูกต้อง เช่น “admin” เราสามารถทดสอบได้ว่า อักขระพิเศษของเราที่ใส่ไปสามารถประมวลผลได้ อาจส่งผลช่องโหว่ “SQL injection” ตัวอย่างเช่น admi’ || ‘nDIVAandroid-input-part1-05
  7. จากข้างต้นเราลองใส่ concatenate (||) หรือคำสั่งเชื่อมตัวอักษรเข้าไปโดยอยู่ระหว่าง “single quote” ผลจากการทดลองพบว่าสามารถค้นหาได้อย่างคำว่า “admin” เนื่องมากจาสมมติฐานตามข้างล่าง
    select * from where col ='admi'||'n';
    
  8. ทีนี้เราย้อนกลับไปที่การใส่ “Single quote” อีกครั้ง แล้วลองไปตรวจสอบที่ “Log cat” ดูว่าจะพอมีข้อมูลอะไรบ้างที่จะช่วยเราได้ (สามารถติดตามได้จากบทความ How to read LogCat by using Appie2) DIVAandroid-input-part1-06
  9. เมื่อเราใส่ ‘ เข้าไปพบว่ามีการแจ้งข้อผิดพลาดผ่าน “Log Cat” ในส่วนของ “Where”
    Diva-sqli  D  Error occurred while searching in database: unrecognized token: "'" (code 1): , while compiling: SELECT * FROM sqliuser WHERE user = '' '
    
  10. เพราะฉะนั้นถ้าเราใส่ ‘ or ‘1’ = ‘1 นั้นหมายความว่าจะครบ syntax โดยไม่มีข้อผิดพลาดดังนี้
    SELECT * FROM sqliuser WHERE user = '' or '1' = '1';
    
  11. จากสมมุติฐานข้างต้นถ้าเป็นจริงเราก็สามารถดึงข้อมูลทุก “Row” ทุก “Column” ในตาราง “sqliuser” ได้ DIVAandroid-input-part1-07

 

ใส่ความเห็น