FlawOpen

flawopen.com/Vulnerabilities/Server-Side Template Injection (SSTI)

Server-Side Template Injection (SSTI): कारण और समाधान

Impact depends on reachable template behavior CWE-1336 Template Engine Security
💡 सरल व्याख्या — डेटा या प्रिंटर के निर्देश

ऐसी कंपनी की कल्पना करें जो “नमस्ते, {{ name }}” वाले तय पत्र छापती है। सुरक्षित तरीके में प्रिंटर को स्थिर template और ग्राहक का नाम डेटा के रूप में अलग-अलग मिलता है। असुरक्षित तरीके में छापने से पहले ग्राहक का पाठ template निर्देशों में जोड़ दिया जाता है। यदि engine उस पाठ को template syntax समझे, तो Server-Side Template Injection होता है। प्रभाव engine, configuration, उपलब्ध objects और process privileges पर निर्भर करता है; expression का मूल्यांकन अपने आप OS command चलने का प्रमाण नहीं है।

लक्ष्य: Jinja, Twig, FreeMarker और ERB जैसे engines में template source बनाना और server-side rendering।
कमजोर सीमा: अविश्वसनीय input को trusted template में value की तरह देने के बजाय template source के रूप में compile या parse करना।
प्रभाव: template expression का मूल्यांकन; आगे का असर engine क्षमता, exposed objects, sandbox और process privileges पर निर्भर है।
उपाय: template source को trusted और static रखें; untrusted input केवल context data के रूप में दें। User-authored templates जरूरी हों तो rendering को isolate करें।

मुख्य अवधारणाएँ और subsystem शब्द

Template engine
Jinja या Twig जैसा server-side घटक जो template syntax parse कर, template और context data से output बनाता है।
Template-source injection
दोष जिसमें बाहरी text parsing से पहले template source में जुड़ जाता है और data के बजाय syntax माना जाता है।
Context data
विश्वसनीय fixed template को अलग से दिए गए values। सही अलगाव {{ 7 * 7 }} जैसे value को source की तरह फिर से parse होने से रोकता है।
CWE-1336
Template engine में विशेष elements का अनुचित neutralization। यह बाहरी input को template syntax के रूप में असुरक्षित ढंग से process करने का वर्णन करता है।

चरण-दर-चरण हमले का प्रवाह

Step 1

हमलावर का input template sink तक पहुँचता है

Form field, stored profile value या अन्य बाहरी string ऐसे code तक पहुँचती है जो template बनाता या compile करता है। दोष source बनाने में है, किसी value को सामान्य रूप से render करने में नहीं।

Step 2

ऐप data और template निर्देश मिलाता है

ऐप untrusted string को template source में interpolate करता है (जैसे f-string को render_template_string देना) और static template तथा अलग context value इस्तेमाल नहीं करता।

Step 3

Engine संयुक्त source को parse करता है

Engine अपनी भाषा और configuration के अनुसार expression समझता है। हानिरहित arithmetic expression evaluation दिखा सकता है; इससे file, secret या system command तक पहुँच सिद्ध नहीं होती।

Step 4

प्रभाव engine और deployment पर निर्भर है

आगे का असर उपलब्ध objects/functions, sandbox, engine प्रतिबंध और web process privileges पर निर्भर है। कुछ configurations में RCE संभव है, लेकिन हर SSTI का स्वचालित परिणाम नहीं।

तंत्र और मूल कारण

SSTI तब होता है जब application बाहरी input से प्रभावित text को parsing से पहले template program का हिस्सा बनने देती है। Flask/Jinja में vulnerable pattern request data से नया source string बनाकर render_template_string() को देना है; HTML escaping output context की रक्षा करता है, पर untrusted template source को data नहीं बनाता। सुधार है fixed template load करना और value को अलग context में देना। यदि users को templates लिखने देना जरूरी हो, तो न्यूनतम data model दें और resource limits वाले isolated worker में render करें। Sandbox अतिरिक्त सुरक्षा है, secrets या शक्तिशाली application objects खोलने का कारण नहीं।

flask_app.py (असुरक्षित पैटर्न)असुरक्षित
# VULNERABLE: request data becomes template source before parsing.
from flask import Flask, request, render_template_string
app = Flask(__name__)

@app.route("/greet")
def greet():
    name = request.args.get("name", "Guest")
    # A value such as {{ 7 * 7 }} is interpreted by the template engine.
    source = f"<h1>Welcome, {name}!</h1>"
    return render_template_string(source)
flask_app.py (सुरक्षित समाधान)सुरक्षित
# HARDENED: fixed template source; request data stays a context value.
from flask import Flask, request, render_template
app = Flask(__name__)

@app.route("/greet")
def greet():
    name = request.args.get("name", "Guest")
    return render_template("greet.html", name=name)

# templates/greet.html is trusted, static source:
# <h1>Welcome, {{ name }}!</h1>

हमले का क्रम और वैचारिक उदाहरण

इंजीनियरिंग सुरक्षा और रोकथाम नियम

प्राथमिक स्रोत और संबंधित सुरक्षा विषय:पूरा सुरक्षा निर्देशिका देखें →
CWE-1336: Template Engine Injection → OWASP WSTG: Server-Side Template Injection → Jinja: Sandbox और सुरक्षा विचार → Jinja API: Templates और loaders → Flask: Template rendering →