2025-04-12 17:23:53 +03:00

69 lines
5.5 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{% extends 'utils/_task.html' %}
{% block content %}
{% include 'utils/_forensicsidenav.html' %}
<div id="popup" class="sql-guide capsule-window">
<p class="simpletext" style="text-align: left"><a href="https://portswigger.net/web-security/server-side-template-injection" class="hltext">SSTI (Server-side template injection)</a> - уязвимость, позволяющая внедрить код в шаблон, выполнив его на стороне сервера.</p>
<p class="simpletext" style="text-align: left">Как это работает? Если пользователь ввёдет где-либо на сайте не просто текст, а команду, вставляемую в шаблонизатор, то сервер может выполнить её и вернуть пользователю результат, если не стоит должных защит. Примерно так это выглядит на сервере:<span class="context" style="font-size: 0.9rem">(пример кода ниже)</span></p>
<pre><code class="codefont python">if request.method == 'POST':
comment = request.form['user_comment']
# В HTML комментарий вставляется через вызов переменной: {% raw %} &lt;p&gt; {{ comment }} &lt;/p&gt; {% endraw %}</code></pre>
<p class="simpletext" style="text-align: left">Можно заметить, что {% raw %} {{ }} {% endraw %} передают переменную. Т.е пользователь может просто написать команду такого же вида в поле ввода и она будет выполнена. </p>
<p class="simpletext" style="text-align: left">В нашем случае можем ввести в комментарии:</p>
<pre><code class="codefont python">{% raw %} {{ flag }} {% endraw %}</code></pre>
<p class="simpletext" style="text-align: left">На доске же вместо нашего "комментария" отобразится введённая переменная, т.е флаг</p>
<p class="simpletext" style="text-align: left">Однако можно в {% raw %} {{ }} {% endraw %} вписать любую команду и она будет выполнена с одним "но": Современные шаблонизаторы неохотно обрабатывают в принципе всё, что в них суют и даже здесь уязвимость создана искусственно</p>
<span class="close-btn usable-context" onclick="hidePopup()">скрыть</span>
</div>
<div class="container">
<div class="small capsule-window info1" style="height: auto;">
<p class="simpletext">Приветствую тебя, о сетевой путник! <br />
Прошу, оставь упоминание о себе здесь! Тут допускается всё: ничего страшного если твой комментарий будет <abbr class="hltext" title="Смотри подсказку(кнопка снизу слева)">немного странным</abbr></p>
<form action="/web/ssti" method="post" class="simpletext">
<div class="small-container" style="justify-content: space-between;"><p>Никнейм:</p> <input type="text" name="username" class="inpt" /></div>
<div class="small-container" style="justify-content: space-between;"><p>Комментарий:</p> <input type="text" name="user_comment" class="inpt"/></div>
<input type="submit" value="Отправить" class="btn1" style="margin-top: 1.25rem">
</form>
<div class="comments">
<div class="comment">
{% for (username, comment) in comments -%}
<p class="header" style="text-align: left">{{ username }}</p>
<p class="mono">{{ render_template_string(comment) }}</p>
{% endfor -%}
</div>
<div class="comment">
<p class="header" style="text-align: left">Sup3r_C4t</p>
<p class="mono">Мяу-мяу Мяу-мяу</p>
</div>
<div class="comment">
<p class="header" style="text-align: left">Herobrine</p>
<p class="mono">▓▒░(°◡°)░▒▓</p>
</div>
<div class="comment">
<p class="header" style="text-align: left">0MegaCTF++</p>
<p class="mono">Выходи сюда, глупый Админ! Отдавай флаг!!!!(╮°-°)╮┳━━┳ ( ╯°□°)╯ ┻━━┻</p>
</div>
</div>
</div>
<div class="flag-input">
<h3 class="header" style="text-align:left">Введите ответ:</h3>
<form action="/web/ssti" method="post" class="simpletext">
<input class="inpt" type="text" name="user_flag" style="width: 100%; height: 1.25rem; margin: 0">
<input type="submit" value="Submit" class="btn1" style="margin-top: 1.25rem">
</form>
</div>
</div>
{% if error %}
<div id="error"> <p>{{ error }}</p> </div>
{% elif success_flag %}
<div class="task-done">
<h1 class="header">Вы прошли задание!</h1>
<img class="done" src="{{ url_for('static', filename='imgs/done_icon.png') }}">
<a href="{{ url_for('web') }}" class="usable-context" style="text-align: canter; margin: 1rem; padding: 1rem;"> < Вернуться к заданиям > </a>
</div>
{% endif %}
{% endblock %}