Vấn đề xảy ra trong chức năng move_uploaded_files của php rất phổ biến được sử dụng để xử lý các tập tin được tải lên. Chức năng này kiểm tra để đảm bảo rằng các tập tin được chỉ định theo tên tập tin là một tập tin upload hợp lệ (nghĩa là nó đã được tải lên thông qua HTTP POST cơ chế upload PHP). Nếu tập tin có giá trị, nó sẽ được chuyển đến các tên tập tin đích.
Ví dụ:
move_uploaded_file ( string $filename , string $destination )Các vấn đề với nó là có một cách để chèn byts null để bypass, Sử dụng nullbytes một kẻ tấn công có thể thực hiện bypass upload, các tập tin là tương đối hợp lệ và tải lên các tập tin độc hại có thể gây ra RCE bằng cách sử dụng sử dụng các ký tự \ x00.
Tôi sẽ lấy một ví dụ với DVWA với mức cao nhất. Dưới đây là mã snippit từ https://github.com/RandomStorm/DVWA/blob/master/vulnerabilities/upload/source/high.php:
$uploaded_name = $_FILES['uploaded']['name'];Dự kiến hành vi bypass PHP để tạo ra:
$uploaded_ext = substr($uploaded_name, strrpos($uploaded_name, '.') + 1); $uploaded_size = $_FILES['uploaded']['size'];
if (($uploaded_ext == "jpg" || $uploaded_ext == "JPG" || $uploaded_ext == "jpeg" || $uploaded_ext == "JPEG") && ($uploaded_size < 100000)){ if(!move_uploaded_file($_FILES['uploaded']['tmp_name'], $target_path)) {
$html .= '';
$html .= 'Your image was not uploaded.';
$html .= ''; }
else {
$html .= $target_path . ' succesfully uploaded!';
.
.
move_uploaded_file ($ _ FILES ['name'] ['tmp_name'], "/ file.php \ x00.jpg")và đã tạo ra các tập tin "file.php \ x00.jpg"Thực tế thì nó tạo ra: file.php
Hầu hết các hình thức upload chạy PHP trước 5.4.39, 5.5.x trước 5.5.23, và 5.6.x trước 5.6.7 đều dính lỗi này.
Cách khắc phục
Lọc bỏ giá trị Nullbyte trong tên của tệp tin tải lên máy chủ ($_FILES[‘uploaded’][‘name’]) trước khi sử dụng hàm move_uploaded_file và cập nhật lên các bản PHP mới nhất đã vá lỗi.
Dịch từ: www.paulosyibelo.com
Đăng nhận xét Blogger Facebook