it-swarm-vi.com

Khai thác nhân vật đa nhân - PHP / MySQL

Ai đó có thể vui lòng chỉ cho tôi một liên kết với một số thông tin về khai thác nhân vật đa nhân cho MySQL không? Một người bạn đã khiến họ chú ý, nhưng tôi không thể tìm thấy nhiều thông tin trên Internet.

20
Matthew S

Tóm tắt. Có, vấn đề là, trong một số mã hóa ký tự (như UTF-8), một ký tự đơn được biểu thị dưới dạng nhiều byte. Một cách mà một số lập trình viên cố gắng ngăn SQL tiêm là thoát tất cả các dấu ngoặc đơn trong đầu vào không tin cậy, trước khi chèn nó vào truy vấn SQL của họ. Tuy nhiên, nhiều hàm thoát trích dẫn tiêu chuẩn không biết gì về mã hóa ký tự mà cơ sở dữ liệu sẽ sử dụng và xử lý đầu vào của chúng dưới dạng một chuỗi byte, không biết rằng một ký tự có thể chứa nhiều byte. Điều này có nghĩa là hàm thoát trích dẫn đang diễn giải chuỗi khác với cơ sở dữ liệu. Kết quả là, có một số trường hợp hàm thoát trích dẫn có thể không thoát được các phần của chuỗi mà cơ sở dữ liệu sẽ hiểu là mã hóa nhiều byte của một trích dẫn; hoặc có thể vô tình phá vỡ một mã hóa ký tự nhiều byte theo cách giới thiệu một trích dẫn mà trước đó không có. Do đó, việc khai thác ký tự nhiều byte cung cấp cho kẻ tấn công một cách để thực hiện các cuộc tấn công SQL SQL ngay cả khi lập trình viên nghĩ rằng họ đã thoát đầy đủ các đầu vào của họ vào cơ sở dữ liệu.

Tác động. Nếu bạn sử dụng các câu lệnh được chuẩn bị/tham số để tạo thành tất cả các kết nối cơ sở dữ liệu, bạn an toàn. Các cuộc tấn công nhiều byte sẽ thất bại. (Tất nhiên, chặn các lỗi trong cơ sở dữ liệu và thư viện. Nhưng theo kinh nghiệm, chúng dường như rất hiếm.)

Tuy nhiên, nếu bạn cố gắng thoát các đầu vào không đáng tin cậy và sau đó hình thành một truy vấn SQL một cách linh hoạt bằng cách sử dụng nối chuỗi, bạn có thể dễ bị tấn công nhiều byte. Thực tế bạn có dễ bị tổn thương hay không phụ thuộc vào chi tiết cụ thể của chức năng thoát bạn sử dụng, cơ sở dữ liệu bạn sử dụng, mã hóa ký tự mà bạn đang sử dụng với cơ sở dữ liệu và có thể các yếu tố khác. Có thể khó dự đoán liệu các cuộc tấn công nhiều byte sẽ thành công. Kết quả là, hình thành các truy vấn SQL bằng cách sử dụng nối chuỗi là mong manh và không được khuyến nghị.

Chi tiết kỹ thuật. Nếu bạn muốn đọc về chi tiết của các cuộc tấn công, tôi có thể cung cấp cho bạn một số liên kết giải thích các cuộc tấn công tuyệt vời chi tiết. Có một số cuộc tấn công:

  • Các cuộc tấn công cơ bản vào, ví dụ, UTF-8 và mã hóa ký tự khác bằng cách ăn thêm dấu gạch chéo/trích dẫn được giới thiệu bởi chức năng trích dẫn: xem, ví dụ: tại đây .

  • Các cuộc tấn công lén lút vào, ví dụ GBK, hoạt động bằng cách đánh lừa chức năng trích dẫn để giới thiệu thêm một trích dẫn cho bạn: xem, ví dụ, blog của Chris Shiflett , tại đây , hoặc - ở đây .

  • Tấn công vào, ví dụ, UTF-8, che giấu sự hiện diện của trích dẫn bằng cách sử dụng mã hóa không hợp lệ (quá dài) của trích dẫn duy nhất: xem, ví dụ: tại đây . Về cơ bản, cách mã hóa thông thường của một trích dẫn có thể phù hợp với chuỗi byte đơn (cụ thể là 0x27). Tuy nhiên, cũng có các chuỗi nhiều byte mà cơ sở dữ liệu có thể giải mã dưới dạng một trích dẫn và không chứa 0x27 byte hoặc bất kỳ giá trị byte đáng ngờ nào khác. Do đó, các chức năng thoát trích dẫn tiêu chuẩn có thể không thoát khỏi các trích dẫn đó.

20
D.W.

Các cuộc tấn công Mutli-byte không giới hạn đối với SQL Injection. Nói chung, các cuộc tấn công nhiều byte dẫn đến tình trạng "tiêu thụ byte" trong đó kẻ tấn công đang loại bỏ các ký tự điều khiển. Điều này trái ngược với ' or 1=1-- Cổ điển, trong đó kẻ tấn công đang giới thiệu nhân vật điều khiển trích dẫn đơn. Đối với mysql có mysql_real_escape_string() được thiết kế để xử lý các vấn đề mã hóa ký tự. Các thư viện truy vấn tham số như PDO sẽ tự động sử dụng chức năng này. MySQLi thực sự gửi các tham số của truy vấn dưới dạng một phần tử riêng biệt trong một cấu trúc, điều này tránh hoàn toàn vấn đề.

Nếu một trang HTML được hiển thị thông qua Shift-JIS thì có thể sử dụng các ký tự điều khiển để lấy XSS. Một ví dụ tuyệt vời về điều này đã được cung cấp trong " Một trang web bị rối " (cuốn sách tuyệt vời!) Trên trang 207:

<img src="http://fuzzybunnies.com/[0xE0]">
...this is still a part of the mkarup...
...but the srever dosn't know...
" onload="alert('this will execute!')"
<div>
...page content continues...
</div>

Trong trường hợp này, 0xE0 là một byte đặc biệt biểu thị sự bắt đầu của ký hiệu 3 byte. Khi trình duyệt hiển thị html này, dòng chảy "> Sẽ bị tiêu tốn và biến thành một biểu tượng Shift-JIS duy nhất. Nếu kẻ tấn công kiểm soát đầu vào sau bằng một biến khác thì anh ta có thể giới thiệu một trình xử lý sự kiện để có được thực thi mã.

5
rook