我正在执行CTF挑战,但是我的问题不是关于如何解决它,而是语法。挑战在于读取Flask服务器配置中的密钥。它存储在app.secret_key
变量中,我想通过XSS在屏幕上提醒它。
问题:如何从javascript中通过Flask代码访问该变量并将其放在<script>alert(variable)</script>
代码段中?
我尝试了<script type="text/javascript">let v="{{=app.secret_key}}"; alert(v); </script>
,但它给了内部服务器错误。
首先,必须说,通常您应该绝对不应这样做。 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中转换为数组。