Hướng dẫn chèn SQL: Cách học bằng ví dụ
Tiêm SQL là gì?
SQL Insert là một cuộc tấn công đầu độc các câu lệnh SQL động để nhận xét một số phần nhất định của câu lệnh hoặc thêm một điều kiện luôn đúng. Nó lợi dụng các lỗi thiết kế trong các ứng dụng web được thiết kế kém để khai thác các câu lệnh SQL nhằm thực thi mã SQL độc hại.
Dữ liệu là một trong những thành phần quan trọng nhất của hệ thống thông tin. Các ứng dụng web hỗ trợ cơ sở dữ liệu được tổ chức sử dụng để lấy dữ liệu từ khách hàng. SQL là từ viết tắt của Ngôn ngữ truy vấn có cấu trúc. Nó được sử dụng để truy xuất và thao tác dữ liệu trong cơ sở dữ liệu.
Cuộc tấn công tiêm nhiễm SQL hoạt động như thế nào?
Các loại tấn công có thể được thực hiện bằng cách sử dụng SQL SQL khác nhau tùy thuộc vào loại công cụ cơ sở dữ liệu. Cuộc tấn công hoạt động trên các câu lệnh SQL động. Câu lệnh động là câu lệnh được tạo trong thời gian chạy bằng cách sử dụng mật khẩu tham số từ biểu mẫu web hoặc chuỗi truy vấn URI.
Ví dụ về tiêm SQL
Hãy xem xét một ứng dụng web đơn giản có biểu mẫu đăng nhập. Mã cho biểu mẫu HTML được hiển thị bên dưới.
<form action=‘index.php’ method="post"> <input type="email" name="email" required="required"/> <input type="password" name="password"/> <input type="checkbox" name="remember_me" value="Remember me"/> <input type="submit" value="Submit"/> </form>
ĐÂY,
- Biểu mẫu trên chấp nhận địa chỉ email và mật khẩu sau đó gửi chúng đến PHP tập tin có tên là index.php.
- Nó có tùy chọn lưu trữ phiên đăng nhập trong cookie. Chúng tôi đã suy ra điều này từ hộp kiểm remember_me. Nó sử dụng phương thức post để gửi dữ liệu. Điều này có nghĩa là các giá trị không được hiển thị trong URL.
Giả sử câu lệnh ở phần phụ trợ để kiểm tra ID người dùng như sau
SELECT * FROM users WHERE email = $_POST['email'] AND password = md5($_POST['password']);
ĐÂY,
- Câu lệnh trên sử dụng các giá trị của
$_POST[]
array trực tiếp mà không vệ sinh chúng. - Mật khẩu được mã hóa bằng thuật toán MD5.
Chúng tôi sẽ minh họa cuộc tấn công tiêm nhiễm SQL bằng sqlfiddle. Mở URL http://sqlfiddle.com/ trong trình duyệt web của bạn. Bạn sẽ nhận được cửa sổ sau.
Lưu ý: bạn sẽ phải viết các câu lệnh SQL
Bước 1) Nhập mã này vào khung bên trái
CREATE TABLE `users` ( `id` INT NOT NULL AUTO_INCREMENT, `email` VARCHAR(45) NULL, `password` VARCHAR(45) NULL, PRIMARY KEY (`id`)); insert into users (email,password) values ('m@m.com',md5('abc'));
Bước 2) Nhấp vào Xây dựng lược đồ
Bước 3) Nhập mã này vào khung bên phải
select * from users;
Bước 4) Nhấp vào Chạy SQL. Bạn sẽ thấy kết quả sau
Giả sử người dùng cung cấp quản trị viên@admin.sys và 1234 như mật khẩu. Câu lệnh được thực thi đối với cơ sở dữ liệu sẽ là
SELECT * FROM users WHERE email = 'admin@admin.sys' AND password = md5('1234');
Mã trên có thể bị khai thác bằng cách bỏ phần mật khẩu và thêm một điều kiện luôn đúng. Giả sử kẻ tấn công cung cấp thông tin đầu vào sau vào trường địa chỉ email.
xxx@xxx.xxx' OR 1 = 1 LIMIT 1 -- ' ]
xxx để lấy mật khẩu.
Câu lệnh động được tạo sẽ như sau.
SELECT * FROM users WHERE email = 'xxx@xxx.xxx' OR 1 = 1 LIMIT 1 -- ' ] AND password = md5('1234');
ĐÂY,
- xxx@xxx.xxx kết thúc bằng một trích dẫn duy nhất để hoàn thành trích dẫn chuỗi
OR 1 = 1
GIỚI HẠN 1 là điều kiện luôn đúng và giới hạn kết quả trả về chỉ ở một bản ghi.- — ' AND … là một chú thích SQL loại bỏ phần mật khẩu.
Sao chép câu lệnh SQL trên và dán vào SQL FiddleChạy hộp văn bản SQL như hình dưới đây
Hoạt động hack: SQL Đưa vào một ứng dụng web
Chúng tôi có một ứng dụng web đơn giản tại http://www.techpanda.org/ dễ bị tấn công SQL Insert chỉ nhằm mục đích trình diễn. Mã biểu mẫu HTML ở trên được lấy từ trang đăng nhập. Ứng dụng cung cấp bảo mật cơ bản như khử trùng trường email. Điều này có nghĩa là mã ở trên của chúng tôi không thể được sử dụng để bỏ qua đăng nhập.
Để giải quyết vấn đề đó, thay vào đó chúng ta có thể khai thác trường mật khẩu. Sơ đồ dưới đây cho thấy các bước bạn phải tuân theo
Giả sử kẻ tấn công cung cấp thông tin đầu vào sau
- Bước 1: Nhập xxx@xxx.xxx làm địa chỉ email
- Bước 2: Nhập xxx') HOẶC 1 = 1 — ]
- Bấm vào nút Gửi
- Bạn sẽ được chuyển đến bảng điều khiển
Câu lệnh SQL được tạo sẽ như sau
SELECT * FROM users WHERE email = 'xxx@xxx.xxx' AND password = md5('xxx') OR 1 = 1 -- ]');
Sơ đồ dưới đây minh họa câu lệnh đã được tạo ra.
ĐÂY,
- Tuyên bố giả định một cách thông minh rằng mã hóa md5 được sử dụng
- Hoàn thành dấu ngoặc đơn và dấu ngoặc đơn đóng
- Thêm một điều kiện vào câu lệnh luôn đúng
Nói chung, một cuộc tấn công SQL Insert thành công sẽ thử một số kỹ thuật khác nhau như những kỹ thuật được trình bày ở trên để thực hiện một cuộc tấn công thành công.
Các kiểu tấn công tiêm nhiễm SQL khác
Việc tiêm SQL có thể gây hại nhiều hơn là chỉ chuyển các thuật toán đăng nhập. Một số cuộc tấn công bao gồm
- Xóa dữ liệu
- Cập nhật dữ liệu
- Chèn dữ liệu
- Thực thi các lệnh trên máy chủ có thể tải xuống và cài đặt các chương trình độc hại như Trojan
- Xuất dữ liệu có giá trị như thông tin chi tiết về thẻ tín dụng, email và mật khẩu tới máy chủ từ xa của kẻ tấn công
- Nhận thông tin đăng nhập của người dùng, v.v.
- Tiêm SQL dựa trên cookie
- SQL dựa trên lỗi
- Tiêm SQL mù
Danh sách trên không toàn diện; nó chỉ cung cấp cho bạn ý tưởng về SQL Tiêm
Công cụ tự động hóa để tiêm SQL
Trong ví dụ trên, chúng tôi đã sử dụng các kỹ thuật tấn công thủ công dựa trên kiến thức sâu rộng về SQL. Có những công cụ tự động có thể giúp bạn thực hiện các cuộc tấn công hiệu quả hơn và trong thời gian ngắn nhất. Những công cụ này bao gồm
- Bản đồ SQL – http://sqlmap.org/
- Tiêm JSON – https://tools.kali.org/vulnerability-analysis/jsql
Cách ngăn chặn các cuộc tấn công tiêm nhiễm SQL
Một tổ chức có thể áp dụng chính sách sau để bảo vệ mình khỏi các cuộc tấn công SQL Injection.
- Đầu vào của người dùng không bao giờ được tin cậy – Nó phải luôn được làm sạch trước khi được sử dụng trong các câu lệnh SQL động.
- Thủ tục lưu trữ – chúng có thể gói gọn các câu lệnh SQL và xử lý tất cả đầu vào dưới dạng tham số.
- Các tuyên bố đã được chuẩn bị – các câu lệnh đã chuẩn bị sẵn để hoạt động bằng cách tạo câu lệnh SQL trước, sau đó xử lý tất cả dữ liệu người dùng đã gửi dưới dạng tham số. Điều này không ảnh hưởng đến cú pháp của câu lệnh SQL.
- Biểu thức chính quy – chúng có thể được sử dụng để phát hiện mã có hại tiềm ẩn và xóa mã đó trước khi thực thi các câu lệnh SQL.
- Quyền truy cập của người dùng kết nối cơ sở dữ liệu – chỉ nên cấp quyền truy cập cần thiết cho các tài khoản được sử dụng để kết nối với cơ sở dữ liệu. Điều này có thể giúp giảm bớt những gì câu lệnh SQL có thể thực hiện trên máy chủ.
- Thông báo lỗi - những thông tin này không nên tiết lộ thông tin nhạy cảm và lỗi chính xác xảy ra ở đâu. Các thông báo lỗi tùy chỉnh đơn giản như “Rất tiếc, chúng tôi đang gặp lỗi kỹ thuật. Nhóm kỹ thuật đã được liên hệ. Vui lòng thử lại sau” có thể được sử dụng thay vì hiển thị các câu lệnh SQL gây ra lỗi.
Hoạt động hack: Sử dụng Havij để tiêm SQL
Trong kịch bản thực tế này, chúng tôi sẽ sử dụng chương trình Havij Advanced SQL Tiêm để quét một trang web để tìm lỗ hổng.
Lưu ý: của bạn chương trình chống vi rút có thể gắn cờ nó do tính chất của nó. Bạn nên thêm nó vào danh sách loại trừ hoặc tạm dừng phần mềm chống vi-rút của mình.
Hình ảnh bên dưới hiển thị cửa sổ chính của Havij
Công cụ trên có thể được sử dụng để đánh giá lỗ hổng của trang web/ứng dụng.
Tổng kết
- SQL Insert là kiểu tấn công khai thác các câu lệnh SQL xấu
- SQL SQL có thể được sử dụng để bỏ qua các thuật toán đăng nhập, truy xuất, chèn, cập nhật và xóa dữ liệu.
- Các công cụ tiêm SQL bao gồm SQLMap, SQLPing và SQLSmack, v.v.
- Một chính sách bảo mật tốt khi viết câu lệnh SQL có thể giúp giảm thiểu các cuộc tấn công SQL SQL.