Чтение переменной Flask из Javascript - PullRequest
0 голосов
/ 01 марта 2020

Я делаю вызов CTF, но мой вопрос не о том, как ее решить, а о синтаксисе. Задача состоит в том, чтобы прочитать секретный ключ в конфигурации Flask сервера. Он хранится в переменной app.secret_key, и я хочу сообщить об этом XSS на экране.

Вопрос: как я могу получить доступ к этой переменной в Flask коде из javascript и поместить его в <script>alert(variable)</script> фрагмент?

Я пытался <script type="text/javascript">let v="{{=app.secret_key}}"; alert(v); </script>, но он выдал Internal Server Error.

1 Ответ

0 голосов
/ 01 марта 2020

Во-первых, надо сказать, в общем, вы должны абсолютно не должны делать это . app.secret_key никогда не должно быть публично разоблачено и должно рассматриваться как тщательно охраняемый секрет. Отсюда и название. Но поскольку вы делаете это по вполне понятным причинам, связанным с вашей игрой, давайте продолжим.

Вероятно, самый простой способ выставить Python переменные для JavaScript непосредственно в шаблоне - выгрузить JSON. Рассмотрим следующий код:

import json

from flask import Flask, render_template

app = Flask(__name__)
app.secret_key = 'THIS IS SECRET'


@app.route('/')
def hello_world():
    server_vars = {
        'secretKey': app.secret_key,
        'favoriteFoods': ['Eggs', 'Spam']
    }

    return render_template(
        'hello.html',
        server_vars=json.dumps(server_vars)
    )


if __name__ == '__main__':
    app.run()

Мы визуализируем шаблон hello.html и отправляем ему переменную шаблона server_vars, представляющую собой строку JSON для той же серверной переменной, которая это словарь Это позволяет нам отправлять любое количество произвольных JSON -совместимых переменных в JavaScript. См. hello.html:

<!doctype html>
<html lang="en">
<head>
  <title>Document</title>
</head>
<body>
<script>
  window.serverVars = {{ server_vars | safe }};
  alert(window.serverVars.secretKey)
  console.log('btw, my favorite foods are', window.serverVars.favoriteFoods)
</script>
</body>
</html>

Обратите внимание, что в дополнение к отправке secretKey мы фактически отправили список Python, который был преобразован в массив в JavaScript.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...