基础篇讲了 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 里全灭,两个原因:
- Docker 容器内日志被重定向到 stdout/stderr(
/var/log/nginx/access.log -> /dev/stdout),文件里根本没有真实日志; - 很多镜像不带 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 拿通杀密码 → 登录主站后台
几个实战细节的含金量很高:
- 杀软确认技巧:上传 txt 成功、上传马消失——由此反推存在杀软,再针对性找免杀方案(而不是盲目换马);
- 权限继承:即使注入点传上去马,进程权限继承 network service,还是要 CS/提权,“注入拿到的权限 ≠ 服务器权限”;
- 内部系统不打补丁是普遍现象:WordPress 最新 RCE 打内网站屡试不爽;用友/金蝶这类老系统的历史 RCE 也常未修;
- WAF 识别:主站扫描返回 412 是创宇盾系 WAF 的特征,识破后果断换突破面,不死磕;
- 法律红线同场强调:查到的师生敏感数据只证明不带走,查询日志会留痕。
相关旧文
- 文件包含漏洞(LFI/RFI)
- SSRF 深入利用(同为”借服务器说话”的打法)
- 渗透测试 Skills 体系(内网阶段的编排)