SQLi: การโจมตีแบบฉีด
![](https://post.nghiatu.com/assets/images/m/max/724/0*KgPBOeSCwnCVuMiG.png)
การฉีด 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:
![](https://post.nghiatu.com/assets/images/m/max/724/1*c1h3FcCXRUUGmUhrz3WBtQ.png)
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
![](https://post.nghiatu.com/assets/images/m/max/724/0*sZm3DdUShCPaw8Ez.png)
ตัวอย่างแรกนั้นง่ายมาก แสดงให้เห็นว่าผู้โจมตีสามารถใช้ช่องโหว่ 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
![](https://post.nghiatu.com/assets/images/m/max/724/0*Y3LbAJ4WnkwLhkHn.png)
องค์กรสามารถใช้นโยบายต่อไปนี้เพื่อป้องกันการโจมตี SQL Injection
- อย่าเชื่อถือข้อมูลของผู้ใช้ ควรทำความสะอาดก่อนนำไปใช้ในคำสั่ง SQL แบบไดนามิก
Stored Procedure — อนุญาตให้คุณสรุปคำสั่ง SQL และถือว่าอินพุตทั้งหมดเป็นพารามิเตอร์ - คำสั่งที่เตรียมไว้ —คำสั่งที่เตรียมไว้ซึ่งทำงานโดยการสร้างคำสั่ง SQL ก่อน จากนั้นจึงประมวลผลข้อมูลผู้ใช้ที่ส่งมาเป็นพารามิเตอร์ สิ่งนี้ไม่ส่งผลกระทบต่อไวยากรณ์ของคำสั่ง SQL
Regular Expressions — สามารถใช้เพื่อตรวจหาโค้ดที่อาจเป็นอันตรายและลบออกก่อนที่คำสั่ง SQL จะถูกดำเนินการ - สิทธิ์ผู้ใช้การเชื่อมต่อฐานข้อมูล —บัญชีที่ใช้เชื่อมต่อกับฐานข้อมูลควรได้รับเฉพาะสิทธิ์ที่จำเป็นเท่านั้น สิ่งนี้ช่วยลดประสิทธิภาพของคำสั่ง SQL บนเซิร์ฟเวอร์
- ข้อความแสดง ข้อผิดพลาด — ข้อความเหล่านี้จะไม่เปิดเผยข้อมูลที่ละเอียดอ่อนหรือตำแหน่งที่แน่นอนของข้อผิดพลาด “ขออภัย เกิดข้อผิดพลาดทางเทคนิค ฉันได้ติดต่อทีมเทคนิค ลองอีกครั้งในภายหลัง” แทนที่จะแสดงคำสั่ง 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/