PHP - Deserialization + Autoload Classes
Last updated
Last updated
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE) GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Öncelikle, Autoloading Classes nedir kontrol etmelisiniz.
Bir web uygulamasında PHP deserialization bulduğumuz bir durumdayız ve phpggc
içinde gadget'a karşı savunmasız bir kütüphane yok. Ancak, aynı konteynerde savunmasız kütüphanelere sahip farklı bir composer web uygulaması vardı. Bu nedenle, hedef diğer web uygulamasının composer yükleyicisini yüklemek ve bunu deserialization'a karşı savunmasız web uygulamasından bir gadget ile o kütüphaneyi istismar etmek için kullanmaktı.
Adımlar:
Bir deserialization buldunuz ve mevcut uygulama kodunda herhangi bir gadget yok
Aşağıdaki gibi bir spl_autoload_register
fonksiyonunu kullanarak herhangi bir yerel .php
uzantılı dosyayı yükleyebilirsiniz
Bunun için, sınıf adının $name
içinde olacağı bir deserialization kullanıyorsunuz. Serileştirilmiş bir nesnede sınıf adında "/" veya "." kullanamazsınız, ancak kod alt çizgileri ("_") eğik çizgilerle ("/") değiştiriyor. Yani tmp_passwd
gibi bir sınıf adı /tmp/passwd.php
'ye dönüştürülecek ve kod bunu yüklemeye çalışacak.
Bir gadget örneği şöyle olacaktır: O:10:"tmp_passwd":0:{}
Eğer bir dosya yükleme alanınız varsa ve .php uzantılı
bir dosya yükleyebiliyorsanız, bu işlevselliği doğrudan kötüye kullanabilir ve zaten RCE elde edebilirsiniz.
Benim durumumda, böyle bir şeyim yoktu, ama aynı konteynerin içinde phpggc
gadget'ına karşı savunmasız bir kütüphane olan başka bir composer web sayfası vardı.
Bu diğer kütüphaneyi yüklemek için, önce o diğer web uygulamasının composer yükleyicisini yüklemeniz gerekiyor (çünkü mevcut uygulamanın yükleyicisi diğerinin kütüphanelerine erişmeyecek). Uygulamanın yolunu bilerek, bunu çok kolay bir şekilde elde edebilirsiniz: O:28:"www_frontend_vendor_autoload":0:{}
(Benim durumumda, composer yükleyicisi /www/frontend/vendor/autoload.php
içindeydi)
Şimdi, diğer uygulamanın composer yükleyicisini yükleyebilirsiniz, bu yüzden kullanmak için phpgcc
payload'unu oluşturma zamanı. Benim durumumda, Guzzle/FW1
kullandım, bu da dosya sisteminin içine herhangi bir dosya yazmamı sağladı.
NOT: Oluşturulan gadget çalışmıyordu, çalışması için o payload'u chain.php
dosyasını phpggc'den değiştirip tüm sınıf niteliklerini özelden genel olarak ayarladım. Aksi takdirde, dizilimi çözülen dizeden sonra oluşturulan nesnelerin niteliklerinin hiçbir değeri yoktu.
Artık diğer uygulamanın composer yükleyicisini yükleme yoluna sahibiz ve çalışan bir phpggc payload'u var, ama gadget kullanıldığında yükleyicinin yüklenmesi için BUNU AYNI İSTEĞİN İÇİNDE yapmamız gerekiyor. Bunun için, her iki nesne ile birlikte bir dizilmiş dizi gönderdim:
Önce yükleyicinin yüklendiğini ve sonra payload'unu görebilirsiniz
Artık bir dosya oluşturup yazabiliriz, ancak kullanıcı web sunucusundaki herhangi bir klasöre yazamaz. Yani, yüklemede görebileceğiniz gibi, PHP system
çağrısı ile bazı base64'ler /tmp/a.php
içinde oluşturuluyor. Ardından, oluşturulan /tmp/a.php
dosyasını yüklemek için diğer web uygulamasının composer yükleyicisini yüklemek üzere kullandığımız ilk tür yüklemeyi yeniden kullanabiliriz. Bunu deserialization gadget'ına ekleyin:
Yüklemenin Özeti
Aynı konteynerdeki farklı bir web uygulamasının composer autoload'unu yükle
Başka bir web uygulamasından bir kütüphaneyi kötüye kullanmak için bir phpggc gadget'ı yükle (deserialization'a karşı savunmasız olan ilk web uygulamasında herhangi bir gadget yoktu)
Gadget, /tmp/a.php dosyasında kötü niyetli komutlarla birlikte bir PHP yüklemesi olan bir dosya oluşturacak (web uygulaması kullanıcısı, herhangi bir web uygulamasının herhangi bir klasörüne yazamaz)
Yüklememizin son kısmı, oluşturulan php dosyasını yükleyecek ve komutları çalıştıracak
Bu deserialization'ı iki kez çağırmam gerekti. Testlerimde, ilk seferde /tmp/a.php
dosyası oluşturuldu ama yüklenmedi, ikinci seferde ise doğru bir şekilde yüklendi.
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE) GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)