Skip to content
Kurisu
Go back

文件包含的高阶玩法:从日志包含到 php://filter chain RCE 与一次高校内网实战

基础篇讲了 php://filter 读源码和日志包含 Getshell,这篇是进阶:当”经典三板斧”在真实环境失效时(Docker 日志重定向、没有上传点),文件包含怎么继续打。最后附上课堂复盘的一次完整高校实战,把”包含漏洞→内网→拿下全站”的链路走通。

0x01 四个包含函数与两个伪协议

include / include_once / require / require_once:once 保证同文件只包含一次(重复定义函数不报错),require 失败直接终止。漏洞视角它们的攻击面相同,区别只在报错行为

两个最常用的伪协议:

// php://filter:读源码(不执行),base64 输出绕过渲染
?file=php://filter/read=convert.base64-encode/resource=config.php

// php://input:把 POST 体当 PHP 执行(需 allow_url_include=On)
?file=php://input    POST: <?php system('whoami');?>

0x02 日志包含在 Docker 里为什么失效

经典路径:往 access.log 里注入 <?php eval($_POST[x]);?>(UA 头最干净),再包含日志文件拿 shell。但课堂靶场在 Docker 里全灭,两个原因:

  1. Docker 容器内日志被重定向到 stdout/stderr(/var/log/nginx/access.log -> /dev/stdout),文件里根本没有真实日志;
  2. 很多镜像不带 phpinfo,临时文件包含PHP_SESSION_UPLOAD_PROGRESS / PHP_VALUE 漏洞)需要的Knowing 临时文件名无从获取。

结论:日志包含依赖”日志落盘 + 路径可知”两个前提,Docker 化部署天然破坏第一个。真实环境打之前先判断容器化程度。

0x03 php://filter chain:不需要上传的 RCE

这是 LFI 最优雅的现代打法,课堂重点:利用 convert.iconv 字符集转换过滤器级联,把任意字符串逐层”变换”出 <?php ...; exit; ?>——LFI 只能包含不能执行的限制被绕开,全程无需写入任何文件:

?file=php://filter/convert.iconv.utf-8.utf-16|convert.iconv...|convert.base64-decode/resource=data:text/plain,<payload>

生成 chain 用现成工具(php_filter_chain_generator),原理记住一条:字符集编码的读写互换会产生字节层面的可控变换,级联后等价于任意字节序列构造。触发条件与 php://input 相同:allow_url_include 类配置允许包裹执行。

0x04 命令行参数注入(CLI 场景的 LFI 变体)

一个冷门但面试加分的点:PHP 以 CLI 运行时,$_SERVER['argv'] 会收集命令行参数;而按 RFC,GET 请求里不含 = 的参数(如 ?/config/create)会被某些框架当作 argv 传递。于是可以构造类似调用内部命令行工具的路径(config create 写文件一类)。这是”Web 参数影响 CLI 行为”的特例,遇到 PHP CLI 管理接口时值得测。同场加映:php -S 0.0.0.0:7788 起的内置服务器目录下没有 index.php 会直接 404——排错先看目录内容。

0x05 实战复盘:一次高校内网渗透

课上复盘的完整案例(已脱敏),链路值得背下来:

来宾网络(开放无认证)──发现──> 来宾网与内网未隔离
  → 密码喷洒(固定弱密码 + 批量用户名)攻破统一身份认证
  → 统一认证里捡到四字姓名未改密账号
  → 内网横扫(X-Scan/fscan 指纹):SQL Server 弱口令 / 永恒之蓝 / VCenter
  → SQL 注入点 os-shell:sa 被降到 network service(能跑 dir/ipconfig,传不了文件)
  → 找可写目录:ProgramData(默认隐藏 + Everyone 权限,Windows 全系标配)
  → 上传 C2 马:被 360/火绒拦截 → 换轻量免杀 loader(share code 加载)
  → 上线后导出哈希 → VCenter RCE 拿通杀密码 → 登录主站后台

几个实战细节的含金量很高:

相关旧文


Share this post:

Previous Post
寒假班实录:第一次对真实目标做 SQL 注入,用 100 万个字符打崩 WAF 正则
Next Post
SSRF 深入利用:gopher 打 Redis 三板斧与 Session 反序列化 RCE