2012-05-14 6 views
6

Chúng tôi có một ứng dụng Java IRC nơi người dùng được phép thực thi PHP tùy ý và nhận kết quả. Dưới đây là một ví dụ về những gì được sử dụng cho:PHP jailing mã tùy ý

btc: <php>$btc = json_decode(file_get_contents('https://btc-e.com/api/2/1/ticker'), true); $ticker = $btc['ticker']; echo "Current BTC Ticker: High: $".$ticker['high']." Low: $".$ticker['low']." Average: $" . $ticker['avg']; 

Chúng tôi cũng có cài đặt python, nhưng chúng tôi thích PHP vì PHP không yêu cầu dòng mới trong mã ở bất kỳ đâu. (Bởi vì đây là IRC, chúng tôi không thể cung cấp cho nó newlines trừ khi chúng tôi exec một file py web nạp)

Vấn đề là làm thế nào để ngăn chặn những người cố gắng để khai thác hệ thống, chẳng hạn như trong:

<php>echo readfile("/etc/passwd"); 

Mà sẽ, rõ ràng, đọc ra các tập tin passwd cho tất cả để xem.
Chúng tôi cũng đang gặp vấn đề này, sau khi chúng tôi đã cố gắng để ngăn chặn readfile():

<php>$rf = readfile; echo $rf("/etc/passwd"); 

Làm thế nào chúng ta nên đi về đảm bảo hệ thống này? (Mã đầy đủ là trên github, đối với bất kỳ quan tâm nào: https://github.com/clone1018/Shocky)

Như một sang một bên, không có thông tin nhạy cảm thực sự được phơi bày, vì toàn bộ nội dung trong máy ảo, vì vậy nó không phải là "timebomb" . Chúng tôi vẫn muốn khóa nó xuống.

+7

Tại sao máy chủ web của bạn có quyền đọc '/ etc/passwd'? Khóa người dùng web của bạn để bắt đầu. – afuzzyllama

+1

@afuzzyllama Điều đó không liên quan gì đến người dùng web; '/ etc/passwd' là thế giới có thể đọc được theo mặc định trên hầu hết các bản phân phối Linux.Một số chương trình yêu cầu quyền truy cập vào tệp đó để hoạt động và không chứa bất kỳ mật khẩu nào. –

+0

@Ryan P - Bởi "người dùng web" tôi có nghĩa là người dùng đang chạy apache, không phải người dùng trên trang web. – afuzzyllama

Trả lời

4

Điều đó nghe giống như cắm một lỗ vào một cái chao. Bảo mật hệ thống tập tin phải được xử lý bởi HĐH chứ không phải ứng dụng. Và như xa như /etc/passwd đi, hệ điều hành đã được bảo vệ nó.

Dưới đây là dòng đầu tiên của tôi /etc/passwd - vâng, tôi sẽ đăng nó công khai:

root:x:0:0:root:/root:/bin/bash 

Thông thường, mật khẩu không thực sự được lưu trữ trong /etc/passwd. Thông tin người dùng là, nhưng mật khẩu được thay thế bằng x, với mật khẩu thực chỉ có sẵn cho người dùng root.

Tuy nhiên, bạn nên khóa PHP ở một mức độ nào đó. Bạn có thể thay đổi nhiều tùy chọn PHP trong thời gian chạy với ini_set, bao gồm open_basedir. http://www.php.net/manual/en/ini.core.php#ini.open-basedir

+0

Chấp nhận vì đây là điều chúng tôi chưa làm. – Riking

+0

** @ Ryan P: ** Điều đó vẫn không khắc phục được vấn đề gốc, nếu chúng ta làm điều đó, họ vẫn có thể '$ a = 'include'; $ a ('sql.php'); 'hoặc tương tự. ** @ afuzzyllama: ** Điều đó cũng tránh được vấn đề gốc,/etc/passwd chỉ là một ví dụ. Ngay cả khi người dùng đang ở trong một enro chrooted họ vẫn có thể truy cập các tệp khác trong nhà tù đó, chúng tôi không muốn điều đó. – clone1018

+0

Nếu bạn đặt 'open_basedir' thành một thư mục không có tệp, thì bạn không thể mở bất kỳ thứ gì khác ngoài tập lệnh đang chạy. Phương pháp được sử dụng để mở tệp không liên quan; nó cũng ảnh hưởng đến 'include'. –

-4

Nếu bạn chỉ muốn giới hạn tệp đọc có lẽ đây có thể giúp http://www.php.net/manual/en/ini.core.php#ini.open-basedir

Nếu bạn đang sử dụng một phiên bản cũ của php < 5.4 bạn có thể xem xét sử dụng php safe mode

http://php.net/manual/en/ini.sect.safe-mode.php

Đặt các chế độ an toàn sau để hạn chế php

safe_mode_exec_dir 
disable_functions = readfile,system 

và nhiều khác

Ngoài ra, người dùng sẽ không thể đọc bất kỳ tệp nào khác với uid, ví dụ:/etc/password. Lưu ý rằng chế độ an toàn được khấu hao/xóa khỏi phiên bản php

+1

Bạn không nên đề xuất bất kỳ ai sử dụng chức năng không dùng nữa, đặc biệt là khi nó đã bị xóa trong phiên bản hiện tại. –

+0

Booo nói người đàn ông khôn ngoan cũ :-P. Trong trường hợp này, chế độ an toàn có vẻ là đặt cược tốt hơn ngay cả khi khấu hao, hơn là câu trả lời không được trả lời từ người khôn ngoan cũ (thậm chí không cố gắng chạm vào giải pháp cho các câu hỏi mà vẫn nhận được +2). – APZ

+0

Một giải pháp cho một vấn đề và câu trả lời cho một câu hỏi không giống nhau. Tôi cố gắng đưa ra các giải pháp cho các vấn đề hơn là trả lời một cách mù quáng các câu hỏi, như trước đây thường thích hợp hơn với câu hỏi sau. –