SSTİ
Salamlar hər kəsə,bu blogda ən sevdiyim güvənlik açığı olan SSTİ güvənlik açığı haqqında məlumat verəcəm,güvənlik açığını sevməyimin səbəbi bu güvənlik açığının detection-un asan olmasıdı,SSTİ nədir?Nədən yaranır? Necə qarşısını ala bilərik? kimi sualların cavabını bu postda verməyə çalışacam,biraz uzun yazı olacaq amma ümid edirəm darıxdırıcı olmaz.
İlk olaraq əgər SSTİ-dan danışırıqsa ondan əvvəl bilməli olduğumuz bir neçə termin və anlayışlar var ki SSTİ-i anlaya bilək.Bunlardan ən əsası MVC adı verilən architectural patterndi ,MVC Model-View-Controller arxitekturasının abreviaturasıdı,MVC ümumiyyətlə nədir,nə işə yarayır ondan danışaq.MVC-nin əsas məqsədi qısa olaraq desək kod qarışıqlığının qarşısını almaqdı,bunu necə edir, gəlin ona nəzər salaq.
Şəkildə də gördüyünüz kimi MVC 3 layerdən ibarətdi.
İlk layer olan Model layerində database ilə bağlı proseslər gerçəkləşdirilir.
İkinci layer olan View-da adından təxmin etdiyiniz kimi istifadəçinin gördüyü HTML,CSS, JavaScript başqa sözlə desək frontenddən ibarətdir.
Üçüncü layer olan Controller layeri View ilə Model layeri arasında əlaqə yaratmaq işini yerinə yetirir,yəni View-da alınan istifadəçi datalarını və ya komandalarını Model layerinə ötürür.
Əvvəldə də yazdığım kimi MVCnin məqsədi qarışıq kodlardan qurtulmaqdı, əgər biz frontenddə dəyişiklik etmək istəsək onu sadəcə View layerində edəcəyik və bu da bizə həm vaxt qazandırır həm də işimizi asanlaşdırır.
Ümumi olaraq MVCnin çalışma məntiqini bir nümunə ilə izah edərək sizə bu arxitekturanı real case üzərində anlatmağa çalışacam.
Fərz edək ki https://site[.]com saytımız var və biz bu saytda "news" path-ni görmək istəyirik.
Yəni https://site[.]com/news səhifəsinə gedirik.Datalar databasedə tutulduğu üçün, bu vaxt Controller gedib Model layerindən bizə lazım olan dataları istəyir.Sonra isə Model layerindən gələn dataları parse edərək View layerinin oxuya biləcəyi formaya salır və göndərir View layerinə.View layeri də öz növbəsində gələn datanı HTML template içərisində lazımı yerlərə yerləşdirərək istifadəçiyə göstərir.
Bura qədər oxuyub MVC arxitekturasını anladınızsa Template Engines-lərin nə olduğuna nəzər salaq.
Template Engine-lər, MVC arxitekturasının View layerində çalışır və dinamik dataları istifadəçilərə təqdim etmək üçün istifadə olunur.Yəni yuxarıda verdiyim nümunədəki kimi Controllerin Modeldən gətirdiyi dataları işləyib HTML formasında göstərir.
Template Engine-lərə PHPdə Twig,Smarty, Pythonda Tornado,Jinja2 və digər proqramlaşdırma dillərinin Template Engine-lərini nümunə göstərə bilərik.
Artıq əsas məsələyə keçə bilərik,SSTİ ,yəni Server-Side Template İnjection.SSTİ XSS-ə bənzəsə də XSS ilə yalnız client-side prosesləri yerinə yetirə bilərik,amma,SSTİ birbaşa serverlə əlaqəli olduğu üçün RCE-ə çevirmək mümkün ola bilər.
SSTİ-i əvvəldə də dediyim kimi detection-u sadədi,sadəcə Template Engine-lərin sintaksisindən istifadə edərək müəyyən payloadlarla SSTİ detect etdikdən sonra hansı template-in istifadə olunduğunu detect etməliyik sonra isə ona uyğun olaraq rce payloadlarımızı yaza bilərik.Buna nümunə olaraq bəlkə də hər yerdə gördüyünüz bu şəkildən istifadə edə bilərsiz.
Yuxarıda SSTİ haqqında qısa nəzəri olaraq məlumat vermişəm,indi isə həm praktiki olaraq göstərmək həm də qarşısını necə ala bilərik onun haqqında yazacam.
Praktikanı Pythonda Flask ilə yazılmış bir sayt üzərində edəcəyik,praktikaya keçməzdən əvvəl kod nümunəsini yazacam və bu nümunə üzərində praltikanı edəcəyik,sonra isə güvənli kod necə olmalıdısa onu yazacam.
from flask import Flask, render_template_string app = Flask(__name__)
@app.route("/mesajlar/<mesaj>") def your_message(mesaj): template = f"<h1>Yazdığın mesaj: { mesaj }</h1>"
return render_template_string(template)
Kodumuz bu şəkildədi,kodu analiz etsək görürük ki, /mesajlar/ directorysindən sonrakı directory adını dəyər kimi götürür və render edərək səhifədə çap edir.
Gördüyünüz kimi nə yazsaq olduğu kimi çap etdirir,biz də adi mesaj yerinə SSTİ payloadı yazırıq,bizim proyekt Flaskda olduğu üçün sintaksisə uyğun olaraq {{}} payloadından istifadə edəcəyik, {{7*7}} yazırıq və görürük ki bunu olduğu kimi deyil,render edərək 49 kimi verdi.
biz artıq burda SSTİ vasitəsilə digər payloadları da çalışdıra bilərik,məsələn {{config}} payloadı kimi
Güvənli kod isə aşağıdakı kimi olmalıdır.
from flask import Flask, render_template_string from markupsafe import escape
@app.route("/mesajlar/<mesaj>") def your_message(mesaj): sanitized_mesaj = escape(mesaj) template = "<h1>Yazdığın mesaj: {{ mesaj }}</h1>"
return render_template_string(template, mesaj=mesaj)
Bu kod vasitəsilə artıq aldığı input escape funksiyası tərəfindən filterdən keçir və bizim yazdığımız payloadları flask funksiyası kimi deyil string kimi götürür,bununla da SSTİ-in həmçinin XSS-in qarşısını almış oluruq.