- Uygulamalarda MVC(Model View Controller) yaklaşımı işin içerisine girdiği zaman, elimizde bir controller() var ve bunun da return(view) edeceği bir view var.
- View yeni bir atak vektörü oluşturmuş oluyor bize.
- HTML implementasyonu değil de, bir template implementasyonu yapmaya başlıyoruz. Özelleşmiş HTML gibi.
- Backend DB’den veya kullanıcıdan gelen bir inputu name olarak buraya yerleştiriyor. Burda bir dinamik kullanım oluşuyor.
- Ama bu konu ise, dinamik olarak bir HTML oluşturmanı gerektiren bir konu. Mesela sahibinden’de ilanların açıklama kısımları gibi. Ya da “sendgrid” gibi.
- Bu template’in içerisinde bir obje varsa ve fonksiyonları çağırmaya başlarsa neler olabilir? Sunucu içerisindeki fonksiyonlara erişirsin belki?
- Kaynak koda erişimimiz olmadan nasıl tespit edebiliriz?
-
Zafiyetin nerde olduğunu tespit edebilmek için gezindi. Sonra bir ürün listeleme isteğine baktı, 1.satıdaki parametreyi kurcalamaya başladı.
- Geçerli olmayan bir integer değer girdi “Not found” hatası geldi.
- String ifade yazdı, bu sefer de invalid hatası geldi. Demek ki buna göre kontrol ediyor.
-
Sonra gitti 1 yazdı productId olarak. 302 döndü ve follow deyince bir sayfa geldi, parametre olarak da bizden “Unfortunately… “ mesajı almış ve cevaptaki sitede de bu mesajı yerleştirmiş.
-
Template’e bizden gelen parametreleri koyuyor olabilir django, laravel gibi kütüphanelerde render methodu oluyormuş. Arkadaki Template Engine’i tespit etmek için ise, XSS taglarinin peşinden
- { {xx} } % {yyy} %${zzz}
- Ya da { {7*7} } deneyip sonuçta da 49 olarak görmeyi beklersin. Kesin olarak Template Injection var diyebilirsin.
- Bunun aynısı geliyor ise birtakım problemler var demektir.
-
Bilmediği bir template engine var. Lab sayfasında ERB template yazıyor. Araştrma zamanı:
-
Artık ERB ile bir işletim sistemi komutu çalıştırabilir miyiz?
- Backend’de komut çalıştırabildiğin zaman, sunucuda da komut çalıştırabiliyorsun zaten en büyük etki de böyle oluyor.
-
Sistem komutu da çalıştırılabiliyormuş. Burdan sonra reverse shell’e gidersin.
- Kullanıcı girişi yapıyorsun, my account tarafında.
- Ayarlarda kullanıcının hangi ismiyle forumda gözükeceğeine karar veriyorsun.
- Tonardo engine {{}} şeklinde kullanıyor diye öyle yazdı ama adam zaten onun içerisine koyuyor parametreyi o yüzden gerek yok.
- object yazınca objeyi direkt bastı yoruma. Objeyi enumerate edebilir
- python komutları denedi, code evaluation var diyor.
- asfasjhd yazınca da hata aldı buna da normal dedi çünkü string bir şey oluşturuyor, sonra gitti kaynak koda baktı.
- import os yapmaya çalışıyor, \n falan denedi, {%import os%}
- importun farklı bir yöntemini bulmak lazım.
- doğrudan bir python kodu yazmak lazım.
- en son şunu yazdı: import(”os”)
- farklı bir import şekli
- import(”os”).system(”rm -rf
- /home/carlos/morale.txt”)
- Bu template engine, oluşacak template’i satır satır ayırıyor ve aldığı inputu string olarak evaluate ediyor ama sandbox içinde çalışmıyor sorun orda.
- Rich-text’i kullanıcıdan alıyor, bu uygulama da java.
- Öncelikle ${Object} deniyor hepsinde. Bu örnekte FreeMarker template engine varmış.
- illa gidip ${asfsa} bu şekilde devam etmen gerekmiyor. Bütün taglere, macrolara falan erişim var.
- İnternetten bu template injectionu için döküman inceliyor.
- Kendi localinde böyle bir ortam oluşturmak lazım, break point markerlar ile dökümantasyondan inceleyerek ilerlersin. Bir sınıf nasıl initiate(oluşturulur) edilir ona bakmak lazım. Bu iş öyle ilerliyor.
- Exec class’ını oluşturmayı öğrenmek lazım sonra exec fonksiyonlarını kullanarak çözecek.
- Backend’de objectconstructor set edilmiş. Sonra assign edilmiş bu obje.
- Google’dan da bakıp çözülebilir ama bakış açısını göstermek için sağ sol yapıyor. Class oluşturma yöntemlerine bakıyordu.
- Bir rapordan bunu buldu. Execute adında bir sınıf var(full ismini yazmışlar oraya) yeni bir sınıf oluşturuluyor ondan. İşletim sisteminde komut execute ediyor bu sınıf.
Gelen eposta içeriğini Server side render etmiş Uber. Tabiki render edecek ki oluşan içeriği mailin içerisine yazsın.
- Giriş yapıldı, avatar gelmiş bu sefer.
- Resim yükledikten sonra kaynak koda baktı bu resim nerden geliyor gibisinden.
- Böyle bir path’den çekiyormuş avatarı. Weiner’ı değiştirse orada bir template injection olabilir.
- Bir gönderiye gidip yorum yazdı ve orada da kaynak koda baktı.
- Change email kısmında template injection denedi.
- Avatar yüklediği paketi inceliyor. Resim olarak göndermeyeyim dedi sonra username’i bizden aldığını gördü şunu denedi ve “Unauthorized” hatası geldi.
- Resim yerine asfasfas yazdı ve istek gitti. Resim isteğini çağırınca asfasjagsjd{7*7} falan geldi çok saçma…
- resim yükleme paketinde Content-Type’ı text/html yaptı. Önceden image/jpeg di ve response olarak da text/html döndüğünü görünce kafası karıştı sonra resim paketine bakınca kafası yerine geldi.
- text/html yazınca php kodu geldi oraya evalution yapmaya çalışıyor. Şunu denedi ama başaramadı.
- Bir resmi gidip o klasörün altına kaydetme fonksiyonuymuş bu ve gidip tekrardan çağırtıyor sonra image olarak kaydettiriyor.
- Sonra resim isteğini tekrar yollayınca asfasjagsjd{7*7} geliyor olmadı yani 🙂
- Yine bir okumama vakası…
- setAvatar’ı çağırmamıza gerek yok
- En son çözüme baktı :(