记录一次文件包含的学习以及实战演练
本文最后更新于 2026年4月11日 下午
开篇(部分来源于PHP 文件包含功能的利用与绕过策略全解析 - yuccun’s blog)
首先了解php两种文件包含的形式:
require()和include()
require函数:找不到被包含的文件会产生致命错误,并停止脚本运行
而include函数只能输出报错信息
方法1:本地文件包含(LFI) 远程文件包含(RFI) 伪协议
1 | |
绕过
URL过滤绕过
域名/ip被过滤
- 大小写绕过(域名对大小写不敏感)
- 将自己的域名解析到 特定IP地址 并访问
- 使用hex百分号编码 yuccun.cn->%79%75%63%63%75%6e%2e%63%6e
(注:协议的一部分不能用hex编码,如http://以及之后的/?) - 使用IP(十进制 八进制 十六进制) 注:不同进制可以混用(只要用点号隔开)
https://www.metools.info/other/ipconvert162.html
https://www.xuhuhu.com/ip-to-octal-converter.html - 删除/增加ip中最前面的0
如 127.0.0.1 -> 127.000.000.001 -> 127.000.0.01 - 将点号换为句号
http过滤: 使用//替代 (html标签中用//可以代替http://)
若要求使用http://但想使用js伪协议,可将http://放最后然后用//注释掉
注:html中默认使用file://协议,所以要跳转网页必须加上http://等/过滤: 使用\ (//则使用\)
但是要注意在windows下\本身就有特殊用途,是一个path 的写法,
所以\在Windows下是file协议,在linux下才会是当前域的协议点过滤: 使用中文句号代替点号 浏览器会自动转换
localhost/127.0.0.1过滤
- 将自己的域名解析到127.0.0.1并访问
- 利用简写127.1 或全写 127.000.000.001等(任意删0增0)
- 使用0.0.0.0 或其简写 0(在linux会被解析为127.0.0.1,windows无效)
- 利用hex百分号编码, 或十进制
2130706433八进制0177.0.0.1十六进制0x7f.0.0.10x7F000001 - 将点号换为句号
文件名被过滤
- 切换为 绝对路径(/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 | |

好靶场刷题:我有一计,http
这题主要考察http协议
总结下来就一句话:在自己的vps上写🐎,然后输入http://IP/1.php即可