ping
VIP Members
-
19/06/2013
-
58
-
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ố:
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ó:
Và thực thi
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ố:
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
Upload.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
Khi đấy
Tuy nhiên
Thì
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.
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
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: