CTF-任意文件上传2(3)

题目—[第一章 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的值就行了

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值