SQL Injection là một kỹ thuật tấn công vào cơ sở dữ liệu của một ứng dụng web, mà người tấn công có thể thực thi các câu lệnh SQL không mong muốn và có thể gây ra thiệt hại nghiêm trọng cho hệ thống. Điều này làm cho SQL Injection trở thành một trong những lỗ hổng bảo mật nghiêm trọng nhất đối với các ứng dụng web. Vậy SQL Injection là gì? Tại sao nó lại đáng lo ngại đến vậy? Hãy cùng tìm hiểu qua bài viết này.
SQL Injection là gì?
SQL Injection (tạm dịch là “tiêm SQL”) là một kỹ thuật tấn công được sử dụng để khai thác lỗ hổng bảo mật trong các ứng dụng web. Khi một ứng dụng web không kiểm tra hoặc xử lý đầu vào từ người dùng đúng cách, kẻ tấn công có thể tiêm vào các câu lệnh SQL không mong muốn vào cơ sở dữ liệu của ứng dụng.
SQL Injection là một trong những phương thức tấn công phổ biến nhất, và nó có thể gây ra những thiệt hại nghiêm trọng cho hệ thống. Kẻ tấn công có thể sử dụng SQL Injection để truy cập, thay đổi hoặc xóa dữ liệu, hoặc thậm chí là thực thi các câu lệnh SQL để kiểm soát hoàn toàn hệ thống. Điều này có thể gây ra những hậu quả nghiêm trọng, bao gồm mất dữ liệu, thiệt hại tài chính, hoặc thậm chí là tiết lộ thông tin nhạy cảm.
SQL Injection hoạt động như thế nào?
SQL injection hoạt động bằng cách sử dụng các câu lệnh SQL không đúng được chèn vào các ô nhập liệu trên trang web. Khi người dùng nhập và gửi dữ liệu lên trang web, các câu lệnh SQL này sẽ được gửi đến cơ sở dữ liệu và được thực thi.
Ví dụ, nếu một trang web yêu cầu người dùng nhập tên đăng nhập và mật khẩu để đăng nhập, hacker có thể sử dụng câu lệnh SQL injection để thêm các câu lệnh khác vào ô nhập tên đăng nhập. Ví dụ, nếu hacker nhập “admin' OR '1'='1
” vào ô nhập tên đăng nhập, câu lệnh SQL sẽ trở thành “SELECT * FROM users WHERE username='admin' OR '1'='1' AND password='[password]'
” và sẽ trả về tất cả các bản ghi trong bảng người dùng, bởi vì câu lệnh “OR '1'='1'
” luôn luôn đúng.
Các hacker cũng có thể sử dụng các câu lệnh SQL injection để thực hiện các hành động không mong muốn khác như xóa dữ liệu hoặc thay đổi thông tin trong cơ sở dữ liệu.
Ví dụ về SQL Injection
Tập lệnh sau đây là mã giả được thực thi trên máy chủ web. Đây là một ví dụ đơn giản về xác thực bằng ID và Password. Cơ sở dữ liệu ví dụ có một bảng được đặt tên users
với các cột sau: username
và 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)
Các trường đầu vào này dễ bị SQL Injection. Kẻ tấn công có thể sử dụng các lệnh SQL trong đầu vào theo cách làm thay đổi câu lệnh SQL do máy chủ cơ sở dữ liệu thực thi. Ví dụ: họ có thể sử dụng thủ thuật liên quan đến một trích dẫn và đặt passwdtrường thành:
password' OR 1=1
Kết quả là máy chủ cơ sở dữ liệu chạy truy vấn SQL sau:
SELECT id FROM users WHERE username='username' AND password='password' OR 1=1'
Do OR 1=1
, nên mệnh đề trả về giá trị id
đầu tiên từ bảng users
bất kể username
và password
là gì.
Người dùng đầu tiên trong cơ sở dữ liệu thường là quản trị viên. Bằng cách này, kẻ tấn công không chỉ bỏ qua xác thực mà còn giành được đặc quyền của quản trị viên. Họ cũng có thể nhận xét phần còn lại của câu lệnh SQL để kiểm soát thêm việc thực thi truy vấn SQL:
-- 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
Các loại tấn công SQL Injection phổ biến hiện nay
Tấn công SQL Injection có ba loại: SQLi in-band ,SQLi Inferential và SQLi Inferential. Bạn có thể phân loại các kiểu SQL injection dựa trên phương pháp sử dụng để truy cập dữ liệu backend, hoặc khả năng gây hại của chúng.
SQLi in-band
SQLi in-band hay còn được gọi là SQLi cổ điển được sử dụng để khởi chạy các lỗi cơ sở dữ liệu và thu thập các kết quả từ cuộc tấn công đó. Loại tấn công này này hoạt động dựa trên hai kỹ thuật tấn công chính là Error-based và Union-based.
- Error-based :sử dụng các câu lệnh không hợp lệ để gây ra lỗi trong câu lệnh SQL và lấy thông tin từ các thông báo lỗi.
- Union-based :sử dụng câu lệnh UNION trong câu lệnh SELECT để truy vấn nhiều bảng cùng một lúc và lấy dữ liệu từ các bảng khác.
SQLi Inferential
SQL injection inferential là loại tấn công khó khăn hơn, người tấn công không nhận được kết quả trực tiếp từ cơ sở dữ liệu. Thay vào đó, họ phải dựa vào các biểu hiện không rõ ràng của hệ thống để đoán dữ liệu được truy cập.
Ví dụ, nếu một trang web có một form tìm kiếm và người dùng nhập vào một câu lệnh SQL không hợp lệ, hacker có thể sử dụng form tìm kiếm đó để thực hiện các truy vấn boolean và lấy dữ liệu từ các thông báo lỗi hoặc các kết quả trả về khác.
SQLi Out-of-band
SQL injection out-of-band là một loại tấn công này không liên quan trực tiếp đến dữ liệu được truy cập. Người tấn công sử dụng các công cụ phần mềm để gửi các yêu cầu và nhận kết quả trả về từ cơ sở dữ liệu.
Ví dụ, nếu một trang web có một form tìm kiếm và người dùng nhập vào một câu lệnh SQL không hợp lệ, hacker có thể sử dụng form tìm kiếm đó để gửi câu lệnh và thiết lập một trang web khác như là một đích đến để nhận kết quả trả về từ cơ sở dữ liệu.
Các phương pháp ngăn chặn SQL Injection
Một số phương pháp ngăn chặn tấn công SQL injection bao gồm:
- Sử dụng Prepared Statements: Prepared Statements là cách để thực hiện các truy vấn SQL một cách an toàn. Với Prepared Statements, các câu lệnh SQL sẽ được tạo ra trước, và các giá trị được truyền vào sau đó. Điều này giúp tránh được việc chèn các ký tự đặc biệt không mong muốn vào câu lệnh SQL.
- Sử dụng Parameterized Queries: Tương tự như Prepared Statements, Parameterized Queries cũng giúp tránh được việc chèn các ký tự đặc biệt không mong muốn vào câu lệnh SQL. Tuy nhiên, Parameterized Queries cho phép các giá trị được truyền vào theo cách có thể tùy chỉnh hơn.
- Kiểm tra và xử lý đầu vào: Việc kiểm tra và xử lý đầu vào từ người dùng là một trong những biện pháp quan trọng nhất để ngăn chặn SQL Injection. Trong quá trình kiểm tra, phải đảm bảo rằng các đầu vào từ người dùng đã được kiểm tra và loại bỏ các ký tự đặc biệt.
- Sử dụng Firewall: Firewall có thể được sử dụng để chặn các truy vấn SQL không mong muốn, giúp hạn chế sự tổn thất dữ liệu do SQL Injection.
Tổng kết về SQL Injection
SQL Injection là một trong những lỗ hổng bảo mật nghiêm trọng nhất đối với các ứng dụng web. Để ngăn chặn SQL Injection, các nhà phát triển và quản trị hệ thống cần thực hiện các biện pháp bảo mật như sử dụng Prepared Statements, Parameterized Queries, kiểm tra và xử lý đầu vào, và sử dụng Firewall. Nếu không được kiểm soát tốt, SQL Injection có thể gây ra những hậu quả nghiêm trọng cho hệ thống và dữ liệu, do đó, nó đáng được quan tâm và giải quyết.
Vì vậy, đối với các nhà phát triển ứng dụng web, cần đảm bảo rằng các ứng dụng của họ được thiết kế và triển khai đầy đủ các biện pháp bảo mật để tránh SQL Injection. Đối với quản trị viên hệ thống, cần kiểm tra và giám sát hệ thống định kỳ, xác nhận rằng các cập nhật bảo mật đã được cài đặt và thực thi, và đảm bảo rằng tất cả các ứng dụng trên hệ thống đều đang chạy các phiên bản phần mềm mới nhất để tránh các lỗ hổng bảo mật đã biết đến.
- cách phòng chống sql injection
- tấn công sql injection
- sql injection là gì