2016-07-27 15 views
6

Là một quản trị viên web, tôi cần phải xác định các tập lệnh nguy hiểm.

Tôi luôn viết mã php lọc đầu vào của người dùng. Tôi không bao giờ tin vào đầu vào của người dùng, chọn ký tự nào hợp lệ (so với việc không sử dụng một số), sử dụng chức năng lọc gốc của php (filter_input) hoặc sử dụng các tiện ích lib/frameworks.

Hôm nay, tôi đã tìm kiếm lỗ hổng bảo mật trong các module tải về và tìm thấy mã này:

if (isset($_GET['css_file_name'])) {   
    $cssFileName = _PS_MODULE_DIR_ . DS . "xxxx" . DS . "css" . DS . $_GET['css_file_name'] . ".css"; 
    echo file_get_contents($cssFileName); 
} 
echo ""; 

Tôi nghĩ đó là không an toàn, nó không tôn trọng các quy tắc cơ bản bao giờ tin tưởng người dùng nhập vào. Vì vậy, tôi quyết định chứng minh điều đó, tôi đã cố gắng thêm các ký tự DEL ascii để xóa .css và có thể tìm thấy bất kỳ tệp nào (tệp php có thông tin đăng nhập chẳng hạn) nhưng tôi đã không thành công.

Vì vậy, câu hỏi của tôi là: mã này có thực sự không an toàn không? Có thể lấy một file php với nó (bạn có thể chứng minh điều đó?)

+0

Nếu chúng ta không thể khai thác được thì có an toàn không? Câu hỏi của bạn là thú vị, nhưng an ninh là một cách suy nghĩ, và bản thân bạn đang nghi ngờ liệu điều này có an toàn hay không. Đây là một dấu hiệu rõ ràng, rằng một danh sách trắng sẽ là thích hợp trong trường hợp này, bởi vì rất khó để chứng minh rằng nó là an toàn. – martinstoeckli

Trả lời

1

tấn công có thể xảy ra: Những vụ ngộ độc byte null của hàm file_get_contents có thể tiết lộ hoặc bao gồm các nội dung của các file không đúng:

$ ls 
file.php nullbyte.php 
$ cat file.php 
I am the contents. 
$ cat nullbyte.php 
<?php 
$input = "file.php\0.jpg"; 
echo file_get_contents($input); 
echo "\n"; 
?> 
$ php nullbyte.php 
I am the contents. 

này thông tin chỉ phù hợp với các phiên bản cũ hơn (không được hỗ trợ) của PHP.

ngộ độc byte byte đã được sửa trong PHP 5.3.4 (bản thân nó đã là phiên bản PHP cũ và không được hỗ trợ): https://bugs.php.net/bug.php?id=39863.

có thể sửa chữa cho các phiên bản PHP cũ:

<?php 
    $clean = str_replace(chr(0), '', $input); 
?> 

Tuy nhiên, những kẻ tấn công có thể liệt kê tất cả các file CSS có thể của hệ thống tập tin toàn bộ trong ví dụ của bạn, nó có thể để thoát ra khỏi gốc rễ web.

Các vấn đề liên quan