题目描述:
一群喜欢"打破传统"做事的学生搭了一个网络安全博客站。你被雇佣对他们的网络应用进行深入的白盒测试。
附件下载下来开始审计


这里找到一个flag相关的函数,深入搜索发现变量flag没给用户赋值的机会,,,
!routes.py! ↓@app.route("/save_feedback", methods=["POST"])
@login_required
def save_feedback():
data = json.loads(request.data)
feedback = Feedback()
# Because we want to dynamically grab the data and save it attributes we can merge it and it *should* create those attribs for the object.
merge(data, feedback)
save_feedback_to_disk(feedback)
return jsonify({"success": "true"}), 200
@app.route("/get_flag")目光移到save_feedback这个函数,注释写了会把接到的data里的属性全合并到feedback对象里,甚至包括feedback对象没有的属性,比如__class__.__init__.__global__.flag,这样就可以通过类污染来给flag赋值了。关于python类污染可以看这篇文章prototype pollution in python...
构建一个payload

再次访问/get_flag,此时ifflag=="true"已成立,触发
return"DUCTF{NOT_THE_REAL_FLAG}"
