从0到1的ctfer--任意文件读取

任意文件读取



afr_1


【考点】:文件包含,伪协议读取

【思路】:php://伪协议读取文件

【解析】:

​ 观察url:127.0.0.1/?p=hello,猜测p指向某个文件并存在文件包含

​ 尝试输入flag,返回"no no no",说明存在flag.php,并且过滤了flag。

​ 利用php://伪协议读取:php://filter/read=convert.base64-encode/resource=flag,读取到信息:

base64解密得到:

<?php
die('no no no');
//n1book{afr_1_solved}

拿到flag




afr_2

【考点】:文件包含、nginx路径穿越漏洞

【思路】:利用nginx漏洞返回上级目录读取flag信息。

【解析】:

​ 打开题目为一个放着gif图的页面,没有发现有用信息。

​ 随便输入一个目录(如:127.0.0.1/flag),根据报错信息得知这是nginx

​ 观察图片路径:


尝试进入img文件夹:127.0.0.1/img

​ 成功:


​ 尝试进入上一级目录:127.0.0.1/img/../,失败

(然后就卡住了)

​ 去搜,才知道这是个nginx路径穿越漏洞

nginx路径穿越漏洞

​ 在如下配置中设置目录别名时/files时,那么当我们访问/files../时,nginx实际处理的路径时/file/../,从而实现了穿越目录。

![image-20250420162507528]

​ 修复:将file后的/闭合,即变成:location /files/ {



​ 输入url:127.0.0.1/img../,成功进入上一级目录。

​ 在flag文件夹即可看到flag信息。

flag:n1book{afr_2_solved}




afr_3

【考点】:任意文件读取、proc/flask session伪造

【思路】:发现能返回上级目录,尝试读取敏感目录(proc/),获取到密钥结合题目为flask框架进行session伪造拿去flag。

【解析】:

​ 进入题目为如下页面


随便输,发现会跳转到article/目录

​ 观察url:127.0.0.1:5000/article?name=以及页面可以判断存在文件包含。

​ 尝试读取flag:?name=flag,回显:"no permission!"。

​ 尝试读取passwd:?name=../../../../../etc/passwd,成功。etc目录下没有有用的东西,读取proc文件夹内容。

/proc/[pid]/cmdline:指向该进程对应的终端命令。

/proc/[pid]/cwd:指向该进程的运行目录。

/proc/[pid]/environ:指向该进程所对应的环境变量。




​ 在?name../../../../../../proc/cmdline中发现:”pythonserver.py“的信息。由于cmdline指向的是终端命令,所以这里应该是python server.py


​ 那我们就读取server.py文件:?name=../../../../../proc/self/cwd/server.py

​ 在里面发现了flag.py和key.py,以及这是个flask框架。

​ 尝试读取flag.py:?name=../../../../proc/self/cwd/flag.py,被过滤。同理读取key.py,得到密钥:Drmhze6EPcv0fN_81Bj-nA


​ 然后是flask伪造session问题:

flask session伪造:

  • session的作用?

    由于在 Web 应用中,Session 用于维持用户状态(如登录态)。用户登录后,服务器创建一个唯一的 Session ID,并将用户数据(如 user_id)存储在服务端(内存/数据库)。服务器通过 Cookie 或 URL 参数将 Session ID 返回给客户端。客户端每次请求携带 Session ID,服务端校验其合法性后返回对应数据。

  • flask的session格式

    一般是由base64加密的Session数据(经过了json、zlib压缩处理的字符串) . 时间戳 . 签名组成的。

    • 时间戳:用来告诉服务端数据最后一次更新的时间,超过31天的会话,将会过期,变为无效会话
    • 签名:利用Hmac算法将session数据和时间戳加上secret_key加密而成。
  • flask session伪造

    flask session是利用hmac算法将session数据,时间戳加上secert_key成的,那么我们要进行session伪造就要先得到secret_key,当我们得到secret_key我们就可以很轻松的进行session伪造。



使用工具flask-session-cookie-manager工具,在其目录下执行命令: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()}}'}",执行后即可得到加密过的session。


​ 返回127.0.0.1主页,抓包将session修改为我们刚才所得到的。

​ 拿到flag。

posted @ 2025-04-20 21:32  埃克斯X  阅读(27)  评论(0)    收藏  举报