从Java读取Flask变量

问题描述 投票:0回答:1

我正在执行CTF挑战,但是我的问题不是关于如何解决它,而是语法。挑战在于读取Flask服务器配置中的密钥。它存储在app.secret_key变量中,我想通过XSS在屏幕上提醒它。

问题:如何从javascript中通过Flask代码访问该变量并将其放在<script>alert(variable)</script>代码段中?

我尝试了<script type="text/javascript">let v="{{=app.secret_key}}"; alert(v); </script>,但它给了内部服务器错误。

javascript flask xss
1个回答
0
投票

首先,必须说,通常您应该绝对不应这样做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字符串。这使我们能够向JavaScript发送任意数量的任意JSON兼容变量。参见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中转换为数组。

© www.soinside.com 2019 - 2024. All rights reserved.