题目—[第一章 web入门]afr_3
来源BUUCTF
整个题目思路流程就是发现源码,尝试直接提交查询哪里模板注入,发现被禁,发现session,构造session。
思路
在该页面找信息比如F12,git源码,或者提交查询这个(一个思路)。
正确流程是在提交查询这里!
按照提示去
发现url出可能有目录穿越,测一下,…/…/…/…/…/…/etc/passwd
尝试直接读取flag,发信被禁止那么这里应该是有过滤。尝试php伪协议发现不行,应该不是php语言写的了。那就想着找环境变量等其他敏感文件。
发现有server.py文件是python语言。
知识点proc目录
访问.py文件试试
发现源码整理得
#!/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)
经过代码分析/n1page目录下存在模板注入
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)
代码大概意思是如果参数不为空,现对参数中数据的字符进行匹配并替换,然后如果n1code这个键不在在session中或者session[‘n1code’]这个值为空则将其内容进行一个替换,然后如果session[‘n1code’]的值不为空则将其内容拼接到template中。
知识点SSTI模板注入
如何判断ssti模板注入
接上述:
上面提到了session(cookie中),还有key.py这个文件
访问key这个文件得到密钥
利用flask-session-cookie-manager工具解密并构造playload
{{[].class.base.subclasses()40.read()}}
下面就是抓包改sesion的值就行了