69 lines
5.5 KiB
HTML
Raw Normal View History

2025-04-10 00:23:44 +03:00
{% extends 'utils/_task.html' %}
2025-04-12 15:46:08 +03:00
2025-04-10 00:23:44 +03:00
{% block content %}
2025-04-12 15:46:08 +03:00
{% include 'utils/_forensicsidenav.html' %}
2025-04-10 00:23:44 +03:00
<div id="popup" class="sql-guide capsule-window">
2025-04-11 00:29:55 +03:00
<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>
2025-04-10 00:23:44 +03:00
<span class="close-btn usable-context" onclick="hidePopup()">скрыть</span>
</div>
<div class="container">
2025-04-10 18:03:10 +03:00
<div class="small capsule-window info1" style="height: auto;">
2025-04-11 00:29:55 +03:00
<p class="simpletext">Приветствую тебя, о сетевой путник! <br />
Прошу, оставь упоминание о себе здесь! Тут допускается всё: ничего страшного если твой комментарий будет <abbr class="hltext" title="Смотри подсказку(кнопка снизу слева)">немного странным</abbr></p>
2025-04-10 00:23:44 +03:00
<form action="/web/ssti" method="post" class="simpletext">
2025-04-11 00:29:55 +03:00
<div class="small-container" style="justify-content: space-between;"><p>Никнейм:</p> <input type="text" name="username" class="inpt" /></div>
2025-04-10 18:03:10 +03:00
<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">
2025-04-10 00:23:44 +03:00
</form>
<div class="comments">
2025-04-10 18:03:10 +03:00
<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>
2025-04-10 00:23:44 +03:00
</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') }}">
2025-04-12 17:18:03 +03:00
<a href="{{ url_for('web') }}" class="usable-context" style="text-align: canter; margin: 1rem; padding: 1rem;"> < Вернуться к заданиям > </a>
2025-04-10 00:23:44 +03:00
</div>
{% endif %}
{% endblock %}