2013-05-03 45 views
7

Tôi đang giúp bạn tôi kết thúc mô-đun của mình cho một trang web. Từ ấn tượng đầu tiên của tôi nhìn vào các mô-đun của mình, tôi đã tìm thấy một số thứ rất nguy hiểm, nhưng anh ấy nói rằng phương pháp này là an toàn.Kiểm tra lỗ hổng byte rỗng

Một phần của mã:

session_start(); 

    if(isset($_POST['foo'])) 
    { 
    $_SESSION['foo'] = $_POST['foo']; 
    } 

    if(isset($_SESSION['foo'])) 
    { 
    $foo['foo'] = $_SESSION['foo']; 
    } 

    if(is_file("inc/". $foo['foo'] . "/bar.php")) { 
    // code 
    } 
    else { 
    // code 
    } 

Lưu ý: tập tin (inc/test/bar.php) tồn tại;

tôi muốn kiểm tra mã của mình, và tôi đã gửi các yêu cầu sau đây:

POST :: foo => kiểm tra/bar.php% 00

POST :: foo => kiểm tra/bar.php \ 0

curl_setopt ($ ch, CURLOPT_POSTFIELDS, 'foo = test/bar.php'. chr (0x00));

Nhưng không có phương pháp nào trong số này hoạt động. Mã đó có thực sự an toàn không? và làm thế nào ai đó có thể gửi một byte null để vượt qua nó an ninh. Tôi muốn chứng minh với bạn tôi rằng mã của anh ấy không an toàn.

+0

Tôi không phải là một chuyên gia php vì vậy tôi sẽ để lại điều này như một bình luận, nhưng bạn không thể vượt qua một cái gì đó như "../../. ./../ "và giành quyền truy cập tùy ý vào hệ thống tệp? –

+0

@ChrisThompson nó có "/bar.php" ở cuối để nó sẽ kiểm tra ../../../bar.php trong mọi trường hợp – John

+0

phải ok vì vậy nó chỉ là một mối đe dọa nếu bạn có khả năng truy cập _some other_ ' quán ba.Tệp php' mà bạn không được phép truy cập –

Trả lời

5

tôi đã tìm thấy giải pháp this, trong ngắn hạn, có vẻ như mã của bạn hơi dễ bị tổn thương, và các phương pháp khử trùng là thế này:

Có một số cách để ngăn chặn Poison tiêm Byte Null trong vòng PHP. Những bao gồm thoát byte NULL với một dấu gạch chéo, tuy nhiên, cách đề nghị nhất để làm như vậy là để loại bỏ hoàn toàn các byte bằng cách sử dụng mã tương tự như sau:

$foo['foo']= str_replace(chr(0), '', $foo['foo']); 

Tôi cũng không phải là một chuyên gia trong tấn công null-byte, nhưng điều này có ý nghĩa. Thậm chí biết thêm chi tiết here.

+1

OP thậm chí phải thay thế ký tự null-byte khi lưu giá trị từ '$ _POST' vào phiên! Điều đó ngăn cản việc tái sử dụng sau này và không an toàn của '$ _SESSION ['foo']'. – ComFreek

-3

Php rất khả dụng cho các byte Null .... vì php được xây dựng trên c. Trong c một byte Null có nghĩa là kết thúc chuỗi.

Bạn nên xóa các byte Null trên mọi chuỗi bạn sử dụng. Điều này thậm chí còn quan trọng hơn đối với các hàm dựa trên IO như bao gồm en move_uploaded_file.

Thậm chí (int) "1 \ 01" là vurnable vì nó phôi để int 1

chức năng Php có thể xử lý byte Null là ví dụ

str_replace strpos strlen

Thậm chí trên truy vấn cơ sở dữ liệu. Mysql là vurnable để cho Null byte trên char, varchar và văn bản cột

+1

Điều này không còn đúng đối với PHP 5.3.4 và sau đó. (Đó là tất cả các phiên bản hiện hành.) – duskwuff

+0

Thực ra, một loạt các công cụ theo dõi ở đây chỉ là sai. Các hàm xử lý chuỗi của PHP (như 'strlen()') hoạt động hoàn toàn tốt trên các chuỗi bao gồm các byte null, cũng như MySQL. – duskwuff

+0

Cảm ơn bạn đã truy cập -1 ngay cả php 5.4 chức năng bao gồm sẽ chia nhỏ với một byte Null và chạy SELECT "hello \ 0there", sau đó bạn sẽ thấy .. –

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