SQL Injection 101: SQLi คืออะไรและจะป้องกันการโจมตีได้อย่างไร
สิงหาคม 06, 2022 • security
What is SQL injection
SQL injection (SQLi) is a type of attack that allows criminals to execute malicious SQL statements against vulnerable web applications. Attackers can access sensitive data, such as customer information, personal data, trade secrets, and more by bypassing application security measures. Here we will discuss SQL injection, how it works, and how you can prevent attacks.
SQL injection attacks can happen on any website that uses a SQL database. This type of attack allows attackers to get access to your essential data. They can see consumer information, personal data, trade secrets, and intellectual property. This is one of the most severe types of attacks on web applications, according to OWASP.
Types of SQL Injection
In-band SQLi
In-band SQL injection is an attack where the attacker uses the same channel to send and receive queries. In-band means that the response is obtained using the same communications medium. The attacker’s goal is to get the response in a web browser immediately, if possible when carrying out the attack manually with a web browser.
Example of in-band SQL injection
The most common way for an attacker to do an in-band SQL injection is to change the request so they can see the personal information of the current user. This can be done by changing the value sent as part of the request. For example, if the statement was supposed to display the user’s name, the attacker could change it so that their name is displayed instead.
SELECT * FROM users WHERE user_id LIKE 'current_user'
Error-based SQLi and Union-based SQLi are the two most frequent forms of in-band SQL injection.
Error-based SQLi
An error-based SQLi technique is an in-band SQL injection approach that takes advantage of database server error messages to discover the database’s architecture. Error-based SQL injection is the most common type of in-band SQL injection.
Example of error-based SQLi:
If an attacker tries to log in with the following credentials:
username: ' OR 'a'='apassword: anything
The database will return an error because the statement is syntactically incorrect. The error message will reveal information about the database, which the attacker can use to their advantage.
Union-based SQLi:
In-band SQL injection is a way of getting information from a website using the UNION operator to combine the outputs of two or more SELECT statements.
Blind SQL injection
Blind SQL injection is an attack where the attacker tries to get answers from the database by asking questions that will result in a true or false response. The attacker uses error messages to see if the application responds differently when a specific code is used.
When a hacker uses SQL injection, the web application could display critical database warning messages stating that the SQL query syntax is incorrect. Blind SQL injection works the same way as traditional SQL injection, except for how data is obtained from the database. If a database does not have enough information for an attacker to exploit, an attacker must ask a series of questions to obtain data.
Blind SQL injection is divided into blind-boolean-based SQLi and Blind-time-based SQLi.
Boolean-based Blind SQLi
Boolean-based Blind SQL injection is an attack where the attacker tries to get answers from the database by asking questions that will result in a true or false response. The attacker uses error messages to see if the application responds differently when a specific code is used.
Example of boolean-based Blind SQLi:
If an attacker wants to find out the database type, they will use the following statement:
SELECT * FROM users WHERE user_id LIKE 'current_user' and database() like '%type%'
If the database is MySQL, the output would be something like this:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘and database() like ‘%type%” at line
Time-based Blind SQL injection
A time-based Blind attack is when an SQL command is sent to the server with code that causes queries to execute more slowly.
Time-based Blind attacks allow attackers to extract data based on access time. Such an attack is known as a blind or inferential injection assault. This is a type of assault in which no data flows between the attacker and the database, but because there is no response, it’s also known as a blind injection attack.
The response time indicates whether the answer is correct or incorrect. If the response is negative, the intruder will make another request. This attack technique is slow because the hacker must go through each character individually, especially when attacking massive databases.
Example of blind SQLi
In this example, the attacker tries to determine if the user with id=999 exists in the database. To do this, they use the following statement:
IF(SUBSTRING((SELECT password FROM users WHERE user_id=999),0, LEN('secret'))='secret', SLEEP(30), 'false')
If the user with id 999 exists in the database and their password is secret, then the application will sleep for 30 seconds. The application will return false if the user does not exist in the database.
Out-of-band SQLi
Someone who wants to steal data may send SQL code to a database server in a way that is not part of the usual communication between the server and other computers. This can be done by sending information to the server through DNS or HTTP requests.
The app’s response will not be affected by whether or not any data is returned, whether or not there is a problem with the database, or how long it takes to execute the query. Out-of-band can be used in network interactions to fire events at will. Depending on an injected condition, these may be activated conditionally to gain knowledge one bit at a time.
Data can also leak via several networking protocols from network interactions. The visual represents the request sent from the web application to the app’s database.
Example of out-of-band SQLi
In this example, the attacker tries to determine if a specific user exists in the database. To do this, they use the following statement:
SELECT user_id FROM users WHERE username='$username' AND password='$password' LIMIT 0,0 UNION SELECT NULL,'<?php echo system($_GET['cmd']); ? >' INTO OUTFILE '/var/opt/databases/$filename.php'; --
The application will return their user ID if the user exists in the database. If the user does not exist in the database, then the application will create a file that contains PHP code that can be used to execute system commands. The attacker can then use this file to run commands on the server.
How to prevent an SQL injection
The best way to protect against SQL injection attacks is to use input validation, prepared statements, and parametrized queries. The code should never make direct use of the user’s input. Developers must sanitize all input instead of simply web form inputs such as login forms. Single quotes should be eliminated from any questionable code components. It’s also a good idea to hide database problems on live sites to avoid inadvertently revealing them. SQL injection may provide information about a database system that attackers can use to their advantage.
If you find a problem with your website, you should take it offline immediately and contact your hosting provider. They can help you determine whether or not your site has been compromised and what steps you need to take to fix the problem. In the meantime, ensure that all of your website’s users know about the problem and change their passwords as soon as possible.
Prevention tips for avoiding SQL injections
มีหลายวิธีที่จะหลีกเลี่ยงช่องโหว่ SQL injection ในภาษาการเขียนโปรแกรมและการตั้งค่าฐานข้อมูลของคุณ เทคนิคเหล่านี้ใช้ได้กับฐานข้อมูลส่วนใหญ่ เช่น XML คุณสามารถใช้เทคนิคเหล่านี้เพื่อทำให้ฐานข้อมูลของคุณปลอดภัยยิ่งขึ้น
1) การใช้กระบวนการจัดเก็บที่สร้างขึ้นอย่างถูกต้อง
ผู้เริ่มต้นควรเริ่มต้นด้วยการเรียนรู้วิธีสร้างคำสั่งที่มีตัวแปร ซึ่งง่ายกว่าการสร้างแบบสอบถามแบบไดนามิก และเข้าใจง่ายกว่า แบบสอบถามแบบมีพารามิเตอร์เป็นวิธีที่นักพัฒนาสร้างโค้ด SQL ทั้งหมด จากนั้นจึงจัดเตรียมพารามิเตอร์แต่ละรายการในภายหลัง วิธีนี้ช่วยให้ฐานข้อมูลสามารถระบุระหว่างโค้ดต้นฉบับและข้อมูลได้
คำสั่งที่เตรียมไว้จะช่วยให้มั่นใจได้ว่าเป้าหมายของแบบสอบถามจะไม่เปลี่ยนแปลง แม้ว่าจะมีคนพยายามให้คำแนะนำ SQL ก็ตาม
2) การตรวจสอบอินพุตแบบรายการอนุญาต
แบบสอบถาม SQL ใช้ตัวแปรผูกในตำแหน่งเฉพาะสำหรับข้อมูล ตัวอย่างเช่น หากคุณใช้ Python คุณจะใช้ %s ตัวแทน คุณสามารถใช้นิพจน์ทั่วไปเพื่อตรวจสอบอินพุตของผู้ใช้กับรายการอนุญาตสำหรับอักขระที่อนุญาตในตัวแปรผูกแต่ละตัว
หากคุณใช้ JavaScript คุณสามารถใช้ _ว เพื่อให้ตรงกับอักขระตัวเลขและอักษรขีดล่าง
รายการที่อนุญาตควรเจาะจงให้มากที่สุดเพื่อหลีกเลี่ยงผลลัพธ์บวกปลอม
ตัวอย่างเช่น หากคุณต้องการค้นหาหมายเลขโทรศัพท์ของสหรัฐอเมริกา คุณจะใช้นิพจน์ทั่วไปดังต่อไปนี้:
/^\d{11}$/
ซึ่งจะตรงกับสตริงที่มีตัวเลข 11 หลัก ซึ่งอาจเป็นหมายเลขโทรศัพท์ หากมีใครพยายามส่งบางอย่างเช่น 'เอบีซีดีเอฟ' มันจะไม่ตรงกัน และอินพุตก็จะไม่ถูกต้อง
วิธีนี้จะช่วยให้แน่ใจว่าข้อมูลของคุณปลอดภัย หากคุณจำเป็นต้องใช้ค่าจากโค้ดแทนพารามิเตอร์ของผู้ใช้ ก็ไม่เป็นไร!
อย่างไรก็ตาม สมมติว่าค่าพารามิเตอร์ของผู้ใช้กำหนดเป้าหมายไปที่ชื่อตารางและคอลัมน์เฉพาะ ในกรณีนั้น ค่าพารามิเตอร์ควรได้รับการแมปกับชื่อตารางและคอลัมน์ที่เกี่ยวข้องเพื่อให้แน่ใจว่าอินพุตของผู้ใช้ที่ไม่ผ่านการตรวจสอบจะไม่เข้าสู่แบบสอบถาม
3) ใช้ไวท์ลิสต์
อย่ากรองข้อมูลอินพุตของผู้ใช้ตามรายการดำของอักขระที่ไม่ดี การใช้รายการอนุญาตของอักขระที่ดีที่คาดว่าจะอยู่ในฟิลด์เฉพาะจะมีประสิทธิภาพมากกว่ามาก วิธีนี้จะหยุดการโจมตีด้วยการแทรก SQL ก่อนที่จะเกิดขึ้น
ตัวอย่างเช่น อนุญาตให้ใส่เฉพาะตัวเลขและขีดกลางในช่องป้อนข้อมูลหากคุณต้องการหมายเลขโทรศัพท์ หากคุณต้องการที่อยู่อีเมล ให้ใส่เฉพาะอักขระที่ถูกต้องในที่อยู่อีเมลเท่านั้น
4) ใช้แพลตฟอร์มที่ทันสมัยที่สุด
PHP ไม่มีการป้องกัน SQLi ในแพลตฟอร์มการพัฒนาเว็บรุ่นเก่า ให้ใช้สภาพแวดล้อมการเขียนโปรแกรม ภาษา และเทคโนโลยีที่เกี่ยวข้องเวอร์ชันล่าสุดที่มีอยู่ แทนที่จะใช้ PHP ให้ใช้ PDO ในตัวอย่างนี้
5) สแกนแอปพลิเคชันเว็บของคุณเป็นประจำ
การแทรก SQL อาจตรวจพบได้ยากมาก สิ่งสำคัญคือต้องสแกนเว็บแอปพลิเคชันของคุณเพื่อหาช่องโหว่เป็นประจำ
6) การบังคับใช้สิทธิพิเศษขั้นต่ำ
หลักการสิทธิ์ขั้นต่ำคือแนวคิดด้านความปลอดภัยที่จำกัดผู้ใช้ให้มีสิทธิ์เข้าถึงขั้นต่ำที่จำเป็นต่อการทำงาน ซึ่งรวมถึงการจำกัดจำนวนบัญชีที่ผู้ใช้มีและสิทธิ์พิเศษที่บัญชีเหล่านั้นมี
การจำกัดการใช้งานให้น้อยที่สุด (LRF) คือแนวทางปฏิบัติและแนวคิดในการจำกัดสิทธิ์ผู้ใช้ บัญชี และกระบวนการประมวลผลให้เหลือเฉพาะทรัพยากรที่จำเป็นสำหรับงานพื้นฐานที่ยอมรับได้เท่านั้น ซึ่งจะช่วยรักษาระดับสิทธิ์ผู้ใช้หรือระดับการอนุญาตขั้นต่ำ ซึ่งมีความสำคัญอย่างยิ่งต่อการทำงานอย่างมีประสิทธิภาพของผู้คน
สิทธิ์ขั้นต่ำคือหลักการรักษาความปลอดภัยที่กำหนดให้แอปพลิเคชัน ระบบ และอุปกรณ์ต่างๆ ต้องมีสิทธิ์ที่จำเป็นในการดำเนินการงานเฉพาะเท่านั้น วิธีนี้จะช่วยจำกัดผลกระทบหากมีผู้ใช้ประโยชน์จากช่องโหว่และสร้างความเสียหาย ซึ่งแตกต่างจากการให้สิทธิ์แก่ผู้ใช้มากกว่าที่จำเป็น ซึ่งจะเพิ่มความเสี่ยงต่ออันตรายร้ายแรงจากการโจมตี SQL
การแทรก SQL – คำถามที่พบบ่อย
การแทรก SQL แบบอินแบนด์เป็นการโจมตีแบบแทรก SQL ที่พบได้บ่อยที่สุด โดยเกิดขึ้นเมื่อผู้โจมตีสามารถใช้ช่องทางการสื่อสารเดียวกันเพื่อส่งข้อมูลและรวบรวมผลลัพธ์
การป้องกันที่ดีที่สุดต่อการแทรก SQL คือการใช้แบบสอบถามแบบมีพารามิเตอร์ แบบสอบถามประเภทนี้ใช้ค่าตัวแทนสำหรับพารามิเตอร์ซึ่งจะให้มาในภายหลัง วิธีนี้ช่วยให้ฐานข้อมูลสามารถระบุระหว่างโค้ดต้นฉบับและข้อมูลได้
สามารถตรวจจับการแทรก SQL ได้หลายวิธี วิธีหนึ่งคือใช้ไฟร์วอลล์แอปพลิเคชันเว็บ (WAF) WAF คือฮาร์ดแวร์หรือซอฟต์แวร์ที่อยู่ระหว่างแอปพลิเคชันเว็บและอินเทอร์เน็ต WAF ตรวจสอบการรับส่งข้อมูลเพื่อหาการกระทำที่เป็นอันตราย และสามารถบล็อกการโจมตีการแทรก SQL ได้
การแทรก SQL ลำดับที่สองเกิดขึ้นเมื่อผู้โจมตีสามารถแทรกเนื้อหาที่จัดเก็บโดยแอปพลิเคชันเว็บแล้วจึงดำเนินการในภายหลัง การโจมตีประเภทนี้ทำได้ยากกว่าเนื่องจากผู้โจมตีจะต้องมีวิธีที่จะทริกเกอร์การดำเนินการเนื้อหาที่จัดเก็บไว้
การแทรก SQL แบบตาบอดเป็นการโจมตีที่ผู้โจมตีไม่เห็นผลลัพธ์ของเพย์โหลดโดยตรง แต่จะต้องใช้คำสั่งจริงหรือเท็จเพื่ออนุมานข้อมูลจากฐานข้อมูล การโจมตีประเภทนี้มีความท้าทายในการดำเนินการมากกว่า แต่ก็อาจอันตรายเท่ากับการแทรก SQL ประเภทอื่น
Stacked Query คือประเภทหนึ่งของการแทรก SQL ที่ผู้โจมตีใช้การสอบถามหลายรายการเพื่อดึงข้อมูลจากฐานข้อมูล การโจมตีประเภทนี้มีความท้าทายในการดำเนินการมากกว่า แต่หากประสบความสำเร็จก็อาจเป็นอันตรายได้มาก
การแทรก SQL ตามข้อผิดพลาดเป็นการโจมตีที่ผู้โจมตีใช้ข้อผิดพลาดของฐานข้อมูลเพื่ออนุมานข้อมูลจากฐานข้อมูล การโจมตีนี้ดำเนินการได้ยากกว่าแต่ก็อาจเป็นอันตรายได้มากหากทำสำเร็จ
ความปลอดภัย
แอดมินเป็นนักเขียนอาวุโสของ Government Technology ก่อนหน้านี้เธอเคยเขียนบทความให้กับ PYMNTS และ The Bay State Banner และสำเร็จการศึกษาระดับปริญญาตรีสาขาการเขียนสร้างสรรค์จากมหาวิทยาลัยคาร์เนกีเมลลอน เธออาศัยอยู่ชานเมืองบอสตัน