SQLi: การโจมตีแบบฉีด

Nov 30 2022
การฉีด SQL คืออะไร? SQLi เป็นการโจมตีชนิดหนึ่งในแอปพลิเคชันบนเว็บ ซึ่งผู้โจมตีสามารถเรียกใช้คำสั่งที่เป็นอันตรายในฐานข้อมูลของเว็บไซต์ SQL เป็นเทคนิคการแทรกโค้ดที่ใช้ในการรันคำสั่ง SQL ที่เป็นอันตราย

การฉีด SQL คืออะไร?

SQLi เป็นการโจมตีชนิดหนึ่งในแอปพลิเคชันบนเว็บ ซึ่งผู้โจมตีสามารถเรียกใช้คำสั่งที่เป็นอันตรายในฐานข้อมูลของเว็บไซต์ SQL เป็นเทคนิคการแทรกโค้ดที่ใช้ในการรันคำสั่ง SQL ที่เป็นอันตราย

ตัวอย่างเช่น หากคุณต้องการเข้าสู่ระบบเว็บไซต์และคุณลืมชื่อผู้ใช้และรหัสผ่าน ด้วยการใช้ SQLi injection เราสามารถเข้าสู่ระบบหรือเข้าถึงหน้าเว็บโดยไม่ต้องรู้รหัสผ่าน

การฉีด SQL ทำงานอย่างไร

การฉีด SQL มีการแทรกหรือฉีดแบบสอบถาม SQL ผ่านข้อมูลอินพุตจากไคลเอนต์ในแอปพลิเคชัน สิ่งเหล่านี้ถูกแทรกลงในระนาบข้อมูลซึ่งส่งผลต่อคำสั่ง SQL ที่กำหนดไว้ล่วงหน้า

การฉีด SQL โจมตีเป้าหมายที่ช่องโหว่ในคำสั่ง SQL แบบไดนามิก คิดว่าคำสั่ง SQL ไดนามิกเหมือนกับฟังก์ชันทางคณิตศาสตร์หลายตัวแปรที่มีพารามิเตอร์คงที่ในขณะที่ผลลัพธ์ถูกกำหนดโดยค่าที่อยู่ในตัวแปรอิสระ

ในทำนองเดียวกัน คำสั่ง SQL แบบไดนามิกยังประกอบด้วยชุดพารามิเตอร์ที่กำหนดไว้ล่วงหน้า (เช่น เว็บฟอร์ม) และคำสั่งแบบเต็มจะถูกสร้างขึ้นเฉพาะเมื่อผู้ใช้ป้อนข้อมูลเท่านั้น

ดูตัวอย่างต่อไปนี้ของคำสั่ง SQL ของแบบฟอร์มการเข้าสู่ระบบ:

SELECT * FROM users WHERE username = '$username' AND password = bcrypt ('$password')

หากมีช่องโหว่ในคำสั่ง SQL แบบไดนามิก ผู้โจมตีสามารถป้อนสคริปต์ที่ซับซ้อนในแบบฟอร์มเพื่อทำให้พารามิเตอร์ที่มีอยู่เสียหาย และเปลี่ยนความหมายของคำสั่งทั้งหมด

ประเภทของการฉีด SQL:

In-band SQLi: In-band SQL injection เป็นประเภทของ SQL injection ที่ผู้โจมตีได้รับผลลัพธ์เป็นการตอบสนองโดยตรงผ่านช่องทางการสื่อสารเดียวกัน ตัวอย่างเช่น หากผู้โจมตีเปิดการโจมตีด้วยตนเองผ่านเว็บเบราว์เซอร์ ผลลัพธ์ของการโจมตีจะแสดงในเว็บเบราว์เซอร์เดียวกันกับเธอ In-band SQL injection เรียกอีกอย่างว่า SQL injection แบบดั้งเดิม

การฉีด SQL ตามข้อผิดพลาด — ที่นี่ผู้โจมตีดำเนินการบางอย่างที่ทำให้ฐานข้อมูลสร้างข้อความแสดงข้อผิดพลาด คุณสามารถใช้ข้อความแสดงข้อผิดพลาดเพื่อระบุฐานข้อมูลที่กำลังใช้ ตัวจัดการเวอร์ชันเซิร์ฟเวอร์ใด ฯลฯ

Union-Based SQL injection —คำสั่งที่สร้างโดยฐานข้อมูลเพื่อรับการตอบสนอง HTTP เดียว คุณสามารถสร้างแบบสอบถามใน URL หรือรวมคำสั่งหลายรายการในช่องป้อนข้อมูลเพื่อพยายามสร้างคำตอบ

Blind SQLi : Blind SQL injection เป็นประเภทของ SQL injection ที่ผู้โจมตีไม่ได้รับการตอบสนองอย่างชัดเจนจากฐานข้อมูลที่ถูกโจมตี แต่จะสังเกตพฤติกรรมของเซิร์ฟเวอร์ฐานข้อมูลและแอปพลิเคชันแทน เพื่อสร้างโครงสร้างฐานข้อมูลใหม่ทีละน้อย การฉีด SQL แบบตาบอดเป็นที่รู้จักกันว่าการฉีด SQL แบบอนุมาน

ตามบูลีน — ที่นี่ ผู้โจมตีจะส่งแบบสอบถาม SQL ไปยังฐานข้อมูลและขอให้แอปพลิเคชันส่งคืนผลลัพธ์ที่แตกต่างกัน ขึ้นอยู่กับว่าแบบสอบถามส่งคืนค่า True หรือ False

ตามเวลา — ในการโจมตีนี้ ผู้โจมตีจะส่งแบบสอบถาม SQL ไปยังฐานข้อมูลและทำให้ฐานข้อมูลต้องรอตามระยะเวลาที่กำหนดก่อนที่จะแบ่งปันผลลัพธ์ เวลาตอบสนองช่วยให้ผู้โจมตีระบุได้ว่าข้อความค้นหาเป็นจริงหรือเท็จ

Out-of-Band SQLi: Out-of-Band SQL Injection (OOB SQLi) เป็นรูปแบบหนึ่งของ SQL injection ที่ผู้โจมตีไม่ได้รับการตอบสนองจากแอปพลิเคชันที่ถูกโจมตีผ่านช่องทางการสื่อสารเดียวกัน แต่อาจถูกหลอกให้ส่ง ข้อมูลไปยังปลายทางระยะไกลที่ควบคุมโดยผู้โจมตี การฉีด SQL นอกแบนด์จะทำได้ก็ต่อเมื่อเซิร์ฟเวอร์ที่คุณใช้มีคำสั่งที่ทริกเกอร์คำขอ DNS หรือ HTTP อย่างไรก็ตาม สิ่งนี้ใช้กับเซิร์ฟเวอร์ SQL ที่เป็นที่นิยมทั้งหมด

ตัวอย่างบน SQLi

ตัวอย่างแรกนั้นง่ายมาก แสดงให้เห็นว่าผู้โจมตีสามารถใช้ช่องโหว่ SQL Injection เพื่อแก้ไขความปลอดภัยของแอปพลิเคชันและรับรองความถูกต้องในฐานะผู้ดูแลระบบได้อย่างไร

สคริปต์ต่อไปนี้เป็นรหัสจำลองที่ทำงานบนเว็บเซิร์ฟเวอร์ เป็นตัวอย่างง่ายๆ ในการตรวจสอบสิทธิ์ด้วยชื่อผู้ใช้และรหัสผ่าน ฐานข้อมูลตัวอย่างมีชื่อตารางusersที่มีคอลัมน์ต่อไปนี้: usernameและpassword

# Define POST variables
uname = request.POST['username']
passwd = request.POST['password']
# SQL query vulnerable to SQLi
sql = “SELECT id FROM users WHERE username=’” + uname + “’ AND password=’” + passwd + “’”
# Execute the SQL statement
database.execute(sql)

password' OR 1=1

SELECT id FROM users WHERE username='username' AND password='password' OR 1=1'

-- MySQL, MSSQL, Oracle, PostgreSQL, SQLite
' OR '1'='1' --
' OR '1'='1' /*
-- MySQL
' OR '1'='1' #
-- Access (using null characters)
' OR '1'='1' %00
' OR '1'='1' %16

องค์กรสามารถใช้นโยบายต่อไปนี้เพื่อป้องกันการโจมตี SQL Injection

  1. อย่าเชื่อถือข้อมูลของผู้ใช้ ควรทำความสะอาดก่อนนำไปใช้ในคำสั่ง SQL แบบไดนามิก
    Stored Procedure — อนุญาตให้คุณสรุปคำสั่ง SQL และถือว่าอินพุตทั้งหมดเป็นพารามิเตอร์
  2. คำสั่งที่เตรียมไว้ —คำสั่งที่เตรียมไว้ซึ่งทำงานโดยการสร้างคำสั่ง SQL ก่อน จากนั้นจึงประมวลผลข้อมูลผู้ใช้ที่ส่งมาเป็นพารามิเตอร์ สิ่งนี้ไม่ส่งผลกระทบต่อไวยากรณ์ของคำสั่ง SQL
    Regular Expressions — สามารถใช้เพื่อตรวจหาโค้ดที่อาจเป็นอันตรายและลบออกก่อนที่คำสั่ง SQL จะถูกดำเนินการ
  3. สิทธิ์ผู้ใช้การเชื่อมต่อฐานข้อมูล —บัญชีที่ใช้เชื่อมต่อกับฐานข้อมูลควรได้รับเฉพาะสิทธิ์ที่จำเป็นเท่านั้น สิ่งนี้ช่วยลดประสิทธิภาพของคำสั่ง SQL บนเซิร์ฟเวอร์
  4. ข้อความแสดง ข้อผิดพลาด — ข้อความเหล่านี้จะไม่เปิดเผยข้อมูลที่ละเอียดอ่อนหรือตำแหน่งที่แน่นอนของข้อผิดพลาด “ขออภัย เกิดข้อผิดพลาดทางเทคนิค ฉันได้ติดต่อทีมเทคนิค ลองอีกครั้งในภายหลัง” แทนที่จะแสดงคำสั่ง SQL ที่ทำให้เกิดข้อผิดพลาด

นี่คือสิ่งที่ไฟร์วอลล์เว็บแอปพลิเคชัน (WAF) ทำ วิเคราะห์ข้อมูลที่ผู้ใช้ป้อนเข้าเว็บแอปพลิเคชันของคุณทั้งหมดเพื่อหาการจับคู่กับโค้ดที่น่าสงสัย

เราหวังว่าคุณจะเข้าใจการเปรียบเทียบและชัดเจนกับแนวคิด

แสดงความคิดเห็นและแบ่งปันความคิดของคุณ !!

ผู้เขียน:

อาคัช เชคอวัต, มาธุรี เชลเก, เชตัน ชินเด, สวาราลี โซเล

อ้างอิง:

https://learn.microsoft.com/en-us/sql/relational-databases/security/sql-injection?view=sql-server-ver16

https://systemweakness.com/sql-injection-attacks-53e942aae1f8

https://qawerk.com/blog/what-is-sql-injection/

https://brightsec.com/blog/sql-injection-attack/