Hướng dẫn php login injection - tiêm đăng nhập php
Nhiều nhà phát triển web không biết làm thế nào các truy vấn SQL có thể bị giả mạo và cho rằng truy vấn SQL là một lệnh đáng tin cậy. Điều đó có nghĩa là các truy vấn SQL có thể phá vỡ các điều khiển truy cập, do đó bỏ qua kiểm tra xác thực và ủy quyền tiêu chuẩn và đôi khi các truy vấn SQL thậm chí có thể cho phép truy cập vào các lệnh cấp hệ điều hành máy chủ. Tiêm lệnh SQL trực tiếp là một kỹ thuật mà kẻ tấn công tạo hoặc thay đổi các lệnh SQL hiện có để hiển thị dữ liệu ẩn hoặc ghi đè các lệnh có giá trị hoặc thậm chí để thực hiện các lệnh cấp hệ thống nguy hiểm trên máy chủ cơ sở dữ liệu. Điều này được thực hiện bằng ứng dụng lấy đầu vào của người dùng và kết hợp nó với các tham số tĩnh để xây dựng truy vấn SQL. Các ví dụ sau đây dựa trên những câu chuyện có thật, thật không may. Do thiếu xác thực đầu vào và kết nối với cơ sở dữ liệu thay mặt cho một siêu người dùng hoặc người có thể tạo người dùng, kẻ tấn công có thể tạo một siêu người dùng trong cơ sở dữ liệu của bạn. Ví dụ #1 chia kết quả được đặt thành các trang ... và tạo siêu người dùng (PostgreSQL)
= $argv[0]; // beware, no input validation! Người dùng bình thường Nhấp vào các liên kết 'tiếp theo', 'trước' trong đó $ offset được mã hóa vào URL. Kịch bản hy vọng rằng bù $ đến là một số thập phân. Tuy nhiên, điều gì sẽ xảy ra nếu ai đó cố gắng đột nhập bằng cách nối thêm một dạng urlencode () 'urlencode()'d form of the following to the URL 0; insert into pg_shadow(usename,usesysid,usesuper,usecatupd,passwd) select 'crack', usesysid, 't','t','crack' from pg_shadow where usename='postgres'; -- Nếu nó xảy ra, thì kịch bản sẽ trình bày một siêu người dùng truy cập vào anh ta. Lưu ý rằng
Một cách khả thi để có được mật khẩu là phá vỡ các trang kết quả tìm kiếm của bạn. Điều duy nhất mà kẻ tấn công cần làm là xem liệu có bất kỳ biến được gửi nào được sử dụng trong các câu lệnh SQL không được xử lý đúng cách không. Các bộ lọc này có thể được đặt phổ biến ở dạng trước để tùy chỉnh các điều khoản ' union select '1', concat(uname||'-'||passwd) as name, '1971-01-01', '0' from usertable; --0, kẻ tấn công có thể cố gắng nối toàn bộ truy vấn vào bản gốc để liệt kê mật khẩu từ một bảng tùy ý. Sử dụng các trường mật khẩu được mã hóa được khuyến khích mạnh mẽ. Ví dụ #2 Liệt kê các bài viết ... và một số mật khẩu (bất kỳ máy chủ cơ sở dữ liệu nào)
' union select '1', concat(uname||'-'||passwd) as name, '1971-01-01', '0' from usertable; --2 ' union select '1', concat(uname||'-'||passwd) as name, '1971-01-01', '0' from usertable; --3 Phần tĩnh của truy vấn có thể được kết hợp với một câu lệnh ' union select '1', concat(uname||'-'||passwd) as name, '1971-01-01', '0' from usertable; -- Nếu truy vấn này (chơi với ' union select '1', concat(uname||'-'||passwd) as name, '1971-01-01', '0' from usertable; --5 và -- ) được gán cho một trong các biến được sử dụng trong $ truy vấn, Truy vấn Beast Awakened.Cập nhật SQL cũng dễ bị tấn công. Các truy vấn này cũng bị đe dọa bằng cách cắt và nối một truy vấn hoàn toàn mới cho nó. Nhưng kẻ tấn công có thể fiddle với mệnh đề ' union select '1', concat(uname||'-'||passwd) as name, '1971-01-01', '0' from usertable; --7. Trong trường hợp này, một số thông tin lược đồ phải được sở hữu để thao túng truy vấn thành công. Điều này có thể có được bằng cách kiểm tra các tên biến biểu mẫu, hoặc chỉ đơn giản là cưỡng bức. Không có quá nhiều quy ước đặt tên cho các trường lưu trữ mật khẩu hoặc tên người dùng. Ví dụ #3 từ việc đặt lại mật khẩu ... để đạt được nhiều đặc quyền hơn (bất kỳ máy chủ cơ sở dữ liệu nào) ' union select '1', concat(uname||'-'||passwd) as name, '1971-01-01', '0' from usertable; --8 Nhưng nếu người dùng độc hại gửi giá trị ' union select '1', concat(uname||'-'||passwd) as name, '1971-01-01', '0' from usertable; --9 thành $ uid để thay đổi mật khẩu của quản trị viên hoặc chỉ cần đặt $ pwd thành
0 để đạt được nhiều đặc quyền hơn, thì truy vấn sẽ bị xoắn:
Một ví dụ đáng sợ về cách các lệnh cấp hệ điều hành có thể được truy cập trên một số máy chủ cơ sở dữ liệu. Ví dụ #4 Tấn công hệ điều hành của cơ sở dữ liệu (Máy chủ MSSQL)
' union select '1', concat(uname||'-'||passwd) as name, '1971-01-01', '0' from usertable; --2
4 Nếu kẻ tấn công gửi giá trị
' union select '1', concat(uname||'-'||passwd) as name, '1971-01-01', '0' from usertable; --2
8 Máy chủ MSSQL thực thi các câu lệnh SQL trong lô bao gồm một lệnh để thêm người dùng mới vào cơ sở dữ liệu tài khoản cục bộ. Nếu ứng dụng này đang chạy dưới dạng
Một cách khả thi để có được mật khẩu là phá vỡ các trang kết quả tìm kiếm của bạn. Điều duy nhất mà kẻ tấn công cần làm là xem liệu có bất kỳ biến được gửi nào được sử dụng trong các câu lệnh SQL không được xử lý đúng cách không. Các bộ lọc này có thể được đặt phổ biến ở dạng trước để tùy chỉnh các điều khoản ' union select '1', concat(uname||'-'||passwd) as name, '1971-01-01', '0' from usertable; --0, kẻ tấn công có thể cố gắng nối toàn bộ truy vấn vào bản gốc để liệt kê mật khẩu từ một bảng tùy ý. Sử dụng các trường mật khẩu được mã hóa được khuyến khích mạnh mẽ. Ví dụ #2 Liệt kê các bài viết ... và một số mật khẩu (bất kỳ máy chủ cơ sở dữ liệu nào) Phần tĩnh của truy vấn có thể được kết hợp với một câu lệnh Các cuộc tấn công này chủ yếu dựa trên việc khai thác mã không được viết với bảo mật. Không bao giờ tin tưởng bất kỳ loại đầu vào nào, đặc biệt là những thứ xuất phát từ phía máy khách, mặc dù nó đến từ một hộp chọn, trường đầu vào ẩn hoặc cookie. Ví dụ đầu tiên cho thấy rằng một truy vấn vô tình như vậy có thể gây ra thảm họa.
Bên cạnh đó, bạn được hưởng lợi từ các truy vấn ghi nhật ký trong tập lệnh của bạn hoặc chính cơ sở dữ liệu, nếu nó hỗ trợ ghi nhật ký. Rõ ràng, việc khai thác không thể ngăn chặn bất kỳ nỗ lực có hại nào, nhưng nó có thể hữu ích để truy tìm lại ứng dụng nào đã bị phá vỡ. Nhật ký không hữu ích, nhưng thông qua thông tin nó chứa. Chi tiết hơn thường tốt hơn ít hơn. |