Skip to content

Latest commit

 

History

History
92 lines (90 loc) · 8.73 KB

0x17|Server-Side_Template_Injection_Giriş-1.md

File metadata and controls

92 lines (90 loc) · 8.73 KB

Server-Side Template Injection

Template engine’ler sandbox yapısına sahiptirler genelde ve burda çalışırlar.

  • 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. image
  • 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.
    • User’dan template’in kendisini alıyorsun artık. image
  • Bu template’in içerisinde bir obje varsa ve fonksiyonları çağırmaya başlarsa neler olabilir? Sunucu içerisindeki fonksiyonlara erişirsin belki? image
  • Kaynak koda erişimimiz olmadan nasıl tespit edebiliriz? image

Lab: Basic server-side template injection

  • 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ş.

  • İlk olarak aklına reflected XSS gelebilir. image

  • 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ı: image image

  • 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.
  • Ruby ERB template injection araştırılıyor. image

  • Pek çok payload kodu var işte. image

  • Sistem komutu da çalıştırılabiliyormuş. Burdan sonra reverse shell’e gidersin. image

Lab: Basic server-side template injection (code context)

  • Kullanıcı girişi yapıyorsun, my account tarafında. image
  • 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. image
  • 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.

Lab: Server-side template injection using documentation

  • Rich-text’i kullanıcıdan alıyor, bu uygulama da java. image
  • Ö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. image
  • 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. image

image Gelen eposta içeriğini Server side render etmiş Uber. Tabiki render edecek ki oluşan içeriği mailin içerisine yazsın.

Lab: Server-side template injection with a custom exploit

  • 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. image
  • 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. image
  • 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ı. image
  • Bir resmi gidip o klasörün altına kaydetme fonksiyonuymuş bu ve gidip tekrardan çağırtıyor sonra image olarak kaydettiriyor. image
  • Sonra resim isteğini tekrar yollayınca asfasjagsjd{7*7} geliyor olmadı yani 🙂
  • Yine bir okumama vakası…
  • setAvatar’ı çağırmamıza gerek yok image
  • En son çözüme baktı :(