SQL Injection (SQLi)
Thuật ngữ SQL Injection (SQLi) thường được dùng để chỉ một kiểu tấn công “tiêm nhúng” mà ở đó, kẻ tấn công có thể thực thi những câu lệnh truy vấn SQL độc hại (có thể biết đến nhiều nhất với kiểu tấn công này là chèn các payload độc hại) để điều khiển cơ sở dữ liệu của ứng dụng web trên máy chủ (có thể hiểu cơ sở dữ liệu được nhắc đến ở đây là “hệ thống quản lý cơ sở dữ liệu quan hệ” – Relational Database Management System với viết tắt là RDBMS).
Kể từ khi lỗ hỗng SQL Injection xuất hiện, cho phép thực thi hiệu quả trên bất kỳ website hay ứng dụng web nào đang sử dụng bộ cơ sở dữ liệu dựa trên nền tảng SQL, thì đây là dạng lỗ hổng được xếp vào dạng cổ điển nhất, hiệu quả nhất và cũng nguy hiểm bậc nhất trong các dạng lỗ hổng ứng dụng web.
Bằng việc tận dụng một lỗ hổng khai thác được qua phương thức SQL Injection, trong điều kiện cần thiết, kẻ tấn công có thể sử dụng nó để vượt qua (bypass) cơ chế xác thực (Authentication) và ủy quyền (Authorization) rồi sau đó truy xuất nội dung của toàn bộ cơ sở dữ liệu. Bên cạnh đó, SQL Injection đồng thời cũng có thể dùng để thêm, hiệu chỉnh hay thậm chí là xóa bỏ một bản ghi (record) trong bộ cơ sở dữ liệu của nạn nhân, từ đó làm ảnh hưởng đến tính toàn vẹn dữ liệu ban đầu.
Thậm chí phương thức này nguy hiểm đến mức, nó có thể cung cấp cho kẻ tấn công quyền truy cập trái phép (không cần chứng thực) vào các dữ liệu nhạy cảm bao gồm: dữ liệu khách hàng, những thông tin mang tính chất cá nhân (PII – Personally Identifiable Information), bí mật kinh doanh, sở hữu trí tuệ và các thông tin nhạy cảm khác.
Cách thức SQL Injection hoạt động
Để có thể chạy được một truy vấn SQL độc hại chống lại cơ sở dữ liệu của máy chủ, trước tiên kẻ tấn công phải tìm được phương thức đầu vào của truy vấn SQL mà ứng dụng web mục tiêu có hỗ trợ. Đó chính là các thuộc tính id mà truy vấn SQL hay sử dụng để gọi dữ liệu xuất ra cho người dùng từ trong cơ sở dữ liệu của nó. Và một điều kiện khác để quá trình SQL Injection có thể diễn ra được thì bắt buộc trang web mục tiêu chứa lỗ hổng cần phải cho phép nhập trực tiếp thông tin người dùng bằng các câu lệnh SQL. Lúc này, kẻ tấn công có thể dựa vào đó chèn thêm payload bên trong các câu lệnh truy vấn SQL thông thường và khởi chạy để tấn công và khai thác cơ sở dữ liệu của máy chủ mục tiêu.
Mã giả server-side sau đây được sử dụng cho việc xác thực thông tin người dùng tới ứng dụng web.
# 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)
Đoạn script ngắn trên đây là một ví dụ đơn giản về việc xác thực người dùng với cơ chế username và password đối với cơ sở dữ liệu gồm một bảng (table) được đặt tên là users và hai cột trong đó lần lượt có tên username và password.
Như ta thấy, đoạn script này rất dễ bị tổn thương nếu bị khai thác bằng SQL Injection. Bởi vì kẻ tấn công có thể gửi mã độc hại kèm theo trong phần nhập lệnh (input) theo cách hắn muốn để làm thay đổi các câu lệnh SQL ban đầu được máy chủ cơ sở dữ liệu cho phép.
Một ví dụ đơn giản về chèn payload bằng SQL Injection có thể là từ những điều đơn giản nhỏ nhất như thay đổi trường (field) password thành password’ hoặc 1=1 chẳng hạn.
Để thực thi ý định đó, kẻ tấn công có thể chạy câu lệnh hoàn chỉnh sau:
SELECT id FROM users WHERE username=’username’ AND password=’password’ OR 1=1’
Mở rộng hơn, để gia tăng khả năng khai thác hiệu quả từ SQL Injection, kẻ tấn công có thể tùy biến thêm nhiều truy vấn khác như một vài ví dụ dưới đây
— 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
Một khi những truy vấn này được thực thi, kết quả được trả về cho ứng dụng web để xử lý, và quá trình xác thực vượt quyền được tiến hành. Một khi quá trình này khả thi, ứng dụng sẽ cho phép kẻ tấn đăng nhập vào hệ thống với tài khoản đầu tiên trả về trong kết quả truy vấn – thông thường tài khoản đầu tiên này chính là tài khoản người quản trị.
Điều tệ hại nhất mà kẻ tấn công có thể làm với SQL?
SQL là ngôn ngữ lập trình được thiết kế ra nhằm quản lý dữ liệu được lưu trữ trong RDBMS, do đó mà SQL thường được dùng để truy cập, hiệu chỉnh và xóa bỏ dữ liệu trong đây. Hơn nữa, trong một vài trường hợp đặc biệt, RDBMS cũng có thể chạy các lệnh trên hệ điều hành từ chính biểu thức SQL.
Hãy ghi nhớ kĩ những điều sau đây, đọc thật kỹ để thấy được một cuộc tấn công thành công bằng SQL Injection có thể mang lại những gì cho kẻ tấn công.
- Kẻ tấn công có thể sử dụng SQL Injection để vượt qua quá trình xác thực hoặc thậm chí giả mạo một tài khoản cụ thể để truy vấn.
- Một trong những hàm chính của SQL đó là lựa chọn dữ liệu dựa trên truy vấn và xuất ra kết quả mong muốn ngay từ bước này. Một lõ hổng SQL Injection nghiêm trọng có thể dẫn đến tiết lộ toàn bộ dữ liệu nằm trong một cơ sở dữ liệu bất kỳ trên máy chủ nạn nhân.
- Kể từ khi các ứng dụng web sử dụng SQL để thay đổi dữ liệu trong cơ sở dữ liệu, thì đồng thời kẻ tấn công cũng có thể làm được điều đó tương tự (lợi dụng các id đầu vào bị lỗi). Những thay đổi ngoài chủ đích của kẻ xấu gây ra có thể ảnh hưởng tính toàn vẹn dữ liệu và tạo ra các vấn đề thoái thác (repudiation issues), ví dụ như, các vấn đề về vô hiệu hóa giao dịch, thay đổi số dư và các bản ghi khác.
- SQL thường được dùng để xóa bỏ các bản ghi trong cơ sở dữ liệu. Tương tự, kẻ tấn công cũng có quyền này nếu hắn thực hiện SQL Injection thành công. Dù cho bạn đã áp dụng các biện pháp sao lưu phục hồi, nhưng việc xóa bỏ dữ liệu gây ra bởi những kẻ tấn công cũng ảnh hưởng không nhỏ đến độ an toàn và ổn định, tính đáp ứng yêu cầu của hệ thống trong thời gian chờ phục hồi.
- Một số máy chủ chứa cơ sở dữ liệu được cấu hình (cố ý hay vì lý do khác) nhằm cho phép thực thi một cách tùy ý các lệnh (command) của hệ điều hành ngay trên chính máy tính này. Nếu trong điều kiện cho phép, kẻ tấn công sẽ sử dụng SQL Injection làm cẩm nang hành động nhằm thực hiện một cuộc tấn công trong mạng nội bộ khi ngồi sau tường lửa.
Còn tiếp…
VÕ TÌNH THƯƠNG
votinhthuong9@gmail.com