Phân tích lỗi CVE-2015-2348

ping

VIP Members
19/06/2013
57
101 bài viết
Phân tích lỗi CVE-2015-2348
Cách đây vài ngày, một lỗ hổng mới của php được nhà nghiên cứu Paulos Yibelo công bố với mã CVE-2015-2348 ảnh hưởng đến hàng loạt phiên bản PHP.
Lỗ hổng tồn tại trong hàm move_uploaded_file(), hàm này được dùng rất phổ biến khi lập trình các form upload trong php với mục đích chuyển file vào thư mục đích trên server.

Hàm này nhận vào 2 tham số:
PHP:
move_uploaded_file (String  $filename  , String  $destination  )

Vấn đề nằm ở tham số $destination, nếu đây là một string có chứa null byte (\x00) thì khi qua hàm này, đoạn phía sau null byte sẽ bị cắt bỏ (truncate)

Ví dụ nếu có:

PHP:
$filename  = “cmd.jpg”
$destination  = “cmd.php\x00jpg”

Và thực thi
PHP:
move_uploaded_file($filename,  $destination)

Trên lý thuyết thì file mới được ghi phải là “cmd.php\x00jpg” nhưng thực tế thì file chúng ta thu được trên server là “cmd.php”. Vấn đề nghiêm trọng chính là ở đây.

Trước đấy, php cũng đã được biết đến là tồn tại những lỗi null byte như thế này như CVE-2006-7243, CVE-2014-5120
Với lỗ hổng này, kẻ tấn công có thể vượt qua các cơ chế kiểm tra đuôi mở rộng, upload một file bất kỳ lên server. Dẫn đến việc tấn công thực thi code từ xa (Remote code execution)


Khai thác thực tế thì sao?

Như tôi đã phân tích ở trên, lỗi chỉ nằm ở hàm move_uploaded_file(). Và chúng ta chỉ có thể khai thác được khi có đủ 2 yếu tố:
  • Hàm move_uploaded_file() được gọi
  • Kiểm soát được biến $destination


Trong thực tế thì điều này không hẳn dễ dàng, chẳng hạn tôi có:

Index.html

PHP:
    Send this file:

Upload.php

PHP:

Giả sử chúng ta muốn upload một file backdoor là cmd.php lên server. Khi áp dụng kỹ thuật null byte này

14899399421.jpg


Khi đấy
PHP:
$file_name=“cmd.php\x00jpg”.

Tuy nhiên
PHP:
	$file_ext = substr($file_name, strpos($file_name, '.') + 1);

Thì
PHP:
 $file_ext = “php”

nên không thể qua được lệnh lọc đuôi mở rộng và không thể gọi được hàm move_uploaded_file().
==> Không thể khai thác trong trường hợp này

Từ đây có thể thấy, mặc dù lỗi với hàm move_uploaded_file() là nghiêm trọng, nhưng nếu lập trình an toàn, kiểm tra cẩn thận điều kiện gọi hàm thì vẫn chống được các hình thức tấn công. Đây cũng có thể là lý do mà điểm CVSS của lỗi này chỉ là 5.0, ở mức trung bình.
 
Chỉnh sửa lần cuối bởi người điều hành:
Mời các bạn tham gia Group WhiteHat để thảo luận và cập nhật tin tức an ninh mạng hàng ngày.
Lưu ý từ WhiteHat: Kiến thức an ninh mạng để phòng chống, không làm điều xấu. Luật pháp liên quan
Bên trên