Frameworkun public folderi — PHPUnit Remote Code Execution boşluğu

Murad Shukurlu
3 min readMar 10, 2022

Salamlar,

Bu yazıda qərara aldım ki, frameworkların arxitekturasında istifadə edilən public folderin niyə mövcud olması, olmasa hansı təhlükələrlə qarşılaşacağımız haqqında paylaşım edim , artıq bir neçə dəfə “community”-də public folderin silinib, kontentinin bir üst səviyyə folderə çıxarılmasının müzakirə edildiyinin şahidi olmuşam,bu o deməkdir ki, bu yol istifadə edilərək production layihələrdə işlədilir,

Bu səbəblə bu addımın təhlükəsini, qarşılaşa biləcəyiniz problemlərlə əlaqəli qısa yazmağı düşündüm.

Qeyd : Həmçinin qeyd etmək istərdim ki, bir neçə il əvvəl başqa postumda bu mövzu ilə əlaqəli qısaca yazmışdım (Bu linkdə — 3-cü topic) həmçinin Stack Overflow-da mövu ilə əlaqəli bir cavabım var : https://stackoverflow.com/a/52407342/8043667

Mövzuda ilkin olaraq istəyirəm ki, public folderin arxitekturadakı vəzifəsi haqqında qeyd edim.

public folderi adındanda göründüyü kimi public-ə açılan qovluqdur bu folderin altında static fayllar və lazımı hissələrə request göndərən routing sistemi yerləşdirilməlidir. Bunun əsas səbəbi frameworkun digər core hissələrinə əlçatanlığın qarşısını almaqdır.

Bir neçə dəfə bir sualla qarşılaşmışam public-folderini silib bir üst səviyyə folderə atmaq nə problemi yarada bilər ki?. Burda nə təhlükə ola bilər?

Əvvəla bu suala bu cür cavab verərdim ki, frameworkun qurucuları əgər ki, arxitekturada public folderinin olmasını nəzərdə tutublar mütləq ki, bir səbəbi var. Onu dəyişmək üçündə məntiqli bir səbəb lazımdır. Bu səbəb shared hostingdə layihəni install etməkdirsə bu yanaşmanı heç tövsiyyə etməzdim,çünki ən azından .htaccess faylı vasitəsi ilə public folderə yönəltmə verə bilirsiniz.

İndi isə public folderin dəyişdirilməsi zamanı yaranan təhlüləkələrə nümunələr göstərək.

Yuxarıda qeyd etdiyim kimi, public folderi statik faylları özündə saxlamalıdır, frameworkun digər komponentlərinə əlçatanlığı lazım olduğu halda təmin etməlidir.

Əgər public folderi olmasa ən adi halda layihənin sensetiv məlumatları olan .env faylını oxumaq mümkündür.

.env faylı layihə üçün xüsusi önəm daşıyır.

Bundan başqa layihənin vendor fayllarına request göndərmək mümkündür, composer.json,blade komponentləri xakerlər üçün layihəniz haqqında məlumat toplamağa yardımçı olacaq.

composer.json ilə layihədə işlənən vendorları öyrənib həmin liblərin boşluqlarını istifadə edə bilərlər.

vendor faylları vasitəsi ilə birbaşa vendor fayllarına request etmək mümkündür.

Qeyd etmək istəyərdim vendor fayllarının əlçatan olması ilə xakerlər, bir neçə il öncə aktiv şəkildə layihələri ələ keçirirdilər.

PhpUnitdə olan boşluğu (PHPUnit Remote Code Execution) istifadə edən xakerlər vendor fayllarına icazəsi olan istənilən sistemdə POST sorğu göndərərək öz kodlarını server tərəfdə icra edirdilər. Daha ətraflı link vasitəsi ilə baxa bilərsiniz.

Qeyd etdiyim boşluqları istifadə edən xakerlər botlar vasitəsi ilə public folderi olmayan saytları aşkar edib onların səlahiyyətlərini ələ keçirdərək coin maning edirdilər, email sistemini ələ keçirdib spam emaillərində istifadə edirdilər.

Şübhəsiz ki, PHPUnit kimi geniş şəkildə işlədilən paketdə mövcud olan boşluq digər paketlərdədə bu halın olmayacağını istisna etmir. Buna görədə paketlərə birbaşa accessin dayandırılmasına mütləq şəkildə ehtiyac var.

Bəzən yoldaşlar .env faylına və vendor fayllarına .htaccess vasitəsi ilə qadağa əlavə etməyin problemi həll etdiyi barədə bildirirlər.Lakin bu yenədə problem yaradır. Çünki layihənin bütün folderlərinə icazələr tətbiq etmək həm yorucudur həmdə bu funksionallıqlarda olan problemi hələ həll etmir.

Məsələn public folder olmasa Laravel frameworkda-

php artisan storage:link və php artisan serve

əmrləri işləməyəcək. Çünki frameworkun defaultları var bunları dəyişiriksə lazımlı digər hissələridə dəyişməyə ehtiyac yaranır.

Yuxarıda qeyd etdiklərim ümid edirəm ki, public folderini silməmək üçün kifayət edən səbəblərdir.

Bəs əgər daha əvvəlcədən public folderi silinibsə onu necə bərpa edə bilərik?.

Bunun üçün Stack Overflowda cavabıma baxa bilərsiniz.

Əgər public folderi öz layihənizdə gizlətmək istəyirsinizsə Root icazəsiniz olan servedə Nginx və ya Apache configləri ilə public folderinə yönəltmə verərək məsələni həll edə bilərsiniz.

Shared serverdə .htaccess faylı vasitəsi ilə (server admininiz ilədə danışa bilərsiniz) aşağıdakı kodu istifadə edə bilərsiniz.

<IfModule mod_rewrite.c>
RewriteEngine On

RewriteRule ^(.*)$ public/$1 [L]
</
IfModule>

RewriteRule ^/public/?(.*) https://%{SERVER_NAME}/$1 [R,L]

Ümid edirəm ki, yazı faydalı oldu.

Hər hansı bir şərhiniz olarsa xahiş edirəm mənimlə əlaqə saxlaya bilərsiniz.

--

--