Trước khi trực tiếp trả lời câu hỏi, cần lưu ý rằng ngay cả khi tất cả những gì kẻ tấn công có thể làm là đọc dữ liệu mà lẽ ra anh ấy không thể làm được, đó là thông thường vẫn thực sự tệ. Hãy xem xét điều đó bằng cách sử dụng JOIN
s và SELECT
ing từ các bảng hệ thống (như mysql.innodb_table_stats
), kẻ tấn công bắt đầu bằng SELECT
tiêm và không có kiến thức nào khác về cơ sở dữ liệu của bạn có thể ánh xạ lược đồ của bạn và sau đó lọc toàn bộ dữ liệu mà bạn có trong MySQL. Đối với phần lớn cơ sở dữ liệu và ứng dụng, điều đó đã đại diện cho một lỗ hổng bảo mật nghiêm trọng.
Nhưng để trả lời câu hỏi trực tiếp:có một số cách mà tôi biết bằng cách đưa vào MySQL SELECT
có thể được sử dụng để sửa đổi dữ liệu. May mắn thay, tất cả chúng đều yêu cầu hợp lý hoàn cảnh bất thường để có thể. Tất cả các ví dụ tiêm dưới đây được đưa ra liên quan đến truy vấn có thể tiêm ví dụ từ câu hỏi:
SELECT id, name, message FROM messages WHERE id = $_GET['q']
1. Truy vấn "xếp chồng" hoặc "hàng loạt".
Kỹ thuật tiêm cổ điển chỉ đặt toàn bộ một câu lệnh khác sau câu lệnh được tiêm vào. Như được đề xuất trong một câu trả lời khác tại đây
, bạn có thể đặt $_GET['q']
thành 1; DELETE FROM users; --
để truy vấn tạo thành hai câu lệnh được thực thi liên tiếp, câu lệnh thứ hai sẽ xóa mọi thứ trong users
bảng.
Giảm nhẹ
Hầu hết các trình kết nối MySQL - đặc biệt là bao gồm mysql_*
của PHP (không được dùng nữa) và (không dùng nữa) mysqli_*
các hàm - hoàn toàn không hỗ trợ các truy vấn xếp chồng hoặc theo lô, vì vậy kiểu tấn công đơn thuần này không hoạt động. Tuy nhiên, một số do - đáng chú ý là bao gồm trình kết nối PDO của PHP (mặc dù hỗ trợ có thể bị tắt để tăng tính bảo mật
).
2. Khai thác các chức năng do người dùng xác định
Các hàm có thể được gọi từ SELECT
và có thể thay đổi dữ liệu. Nếu một chức năng thay đổi dữ liệu đã được tạo trong cơ sở dữ liệu, bạn có thể thực hiện SELECT
gọi nó, chẳng hạn bằng cách chuyển 0 OR SOME_FUNCTION_NAME()
dưới dạng giá trị của $_GET['q']
.
Giảm nhẹ
Hầu hết các cơ sở dữ liệu không chứa bất kỳ chức năng nào do người dùng xác định - chứ đừng nói đến những chức năng thay đổi dữ liệu - và do đó, không có cơ hội nào để thực hiện kiểu khai thác này.
3. Ghi vào tệp
Như được mô tả trong bài báo (được đặt tên hơi tự phụ) của Muhaimin Dzulfakar Khai thác MySQL Nâng cao
, bạn có thể sử dụng INTO OUTFILE
hoặc INTO DUMPFILE
các mệnh đề trên MySQL select để kết xuất kết quả vào một tệp. Kể từ, bằng cách sử dụng UNION
, mọi kết quả tùy ý có thể là SELECT
ed, điều này cho phép viết các tệp mới với nội dung tùy ý tại bất kỳ vị trí nào mà người dùng đang chạy mysqld
có thể truy cập. Có thể hiểu điều này có thể được khai thác không chỉ để sửa đổi dữ liệu trong cơ sở dữ liệu MySQL, mà còn để có được quyền truy cập shell vào máy chủ mà nó đang chạy - ví dụ:bằng cách viết một tập lệnh PHP vào webroot và sau đó đưa ra yêu cầu đối với nó, nếu Máy chủ MySQL được đồng lưu trữ với máy chủ PHP.
Giảm nhẹ
Rất nhiều yếu tố làm giảm khả năng khai thác thực tế của cuộc tấn công nghe có vẻ ấn tượng này:
- MySQL sẽ không bao giờ cho phép bạn sử dụng
INTO OUTFILE
hoặcINTO DUMPFILE
để ghi đè lên một tệp hiện có, cũng như ghi vào một thư mục không tồn tại. Điều này ngăn chặn các cuộc tấn công như tạo.ssh
thư mục có khóa riêng trongmysql
thư mục chính của người dùng và sau đó SSHing vào hoặc ghi đèmysqld
nhị phân của chính nó với một phiên bản độc hại và đang đợi máy chủ khởi động lại. - Bất kỳ gói cài đặt phù hợp nào sẽ thiết lập một người dùng đặc biệt (thường được đặt tên là
mysql
) để chạymysqld
và chỉ cấp cho người dùng đó những quyền rất hạn chế. Như vậy, nó sẽ không thể ghi vào hầu hết các vị trí trên hệ thống tệp - và chắc chắn thông thường không thể thực hiện những việc như ghi vào webroot của ứng dụng web. - Các bản cài đặt MySQL hiện đại đi kèm với
--secure-file-priv
được đặt theo mặc định, ngăn MySQL ghi vào bất kỳ nơi nào khác ngoài thư mục xuất / nhập dữ liệu được chỉ định và do đó khiến cuộc tấn công này gần như bất lực hoàn toàn ... trừ khi chủ sở hữu máy chủ đã cố tình vô hiệu hóa nó. May mắn thay, không ai có thể vô hiệu hóa hoàn toàn một tính năng bảo mật như vậy vì điều đó rõ ràng là - ồ Đợi đã từng .
4. Gọi sys_exec()
hàm từ lib_mysqludf_sys
để chạy các lệnh shell tùy ý
Có một tiện ích mở rộng MySQL có tên là lib_mysqludf_sys
điều đó - đánh giá từ các ngôi sao của nó trên GitHub
và tìm kiếm nhanh Stack Overflow
- có ít nhất vài trăm người dùng. Nó thêm một chức năng được gọi là sys_exec
chạy các lệnh shell. Như đã lưu ý trong # 2, các hàm có thể được gọi từ bên trong SELECT
; những tác động hy vọng là rõ ràng. Trích dẫn từ nguồn
, chức năng này "có thể là một mối nguy hiểm về bảo mật" .
Giảm nhẹ
Hầu hết các hệ thống không được cài đặt tiện ích mở rộng này.