文件包含(大纲)
文件包含(总结or大纲)
导致原因
include(),include_once(),require(),require_once(),fopen(),readfile()
使用前4个函数包含新的文件时,只要文件内容包含符合php语法规范,任意扩展名都可以被php解析,当包含非php语法规范时,将会暴露其源代码。后两个函数会造成敏感文件读取。
如何利用:
- include()等函数通过动态变量的方式引入需要包含的文件。
- 攻击者可以控制该动态变量。
总的来说,就是有可以传入include()等函数的可控变量。
本地文件包含
ex:
<?php
$file=$_GET['file'];
if(file_exists('/home/wwwrun'.$file.'cat'));
include '/home/wwwerun'.$file.'.cat';
?>
- 在以上代码中,假设构造http://123123/?file=../../flag,经过上面的代码后则变为,include '/home/wwwrun/../../flag.cat',flag.cat这个文件是不存在的,所以无法读取,但如果构造成?file=../../flag%00,则可以读取。
原理:php内核由c语言实现,所以使用了c语言的一些字符串处理函数。在c语言中,0字节为字符串结束符,所以在后面加入0字节可以截断flag后面的字符串,代码变成'/home/wwwrun/../../flag\0cat',由于\0时字符串已经结束,则include()函数不读取cat。
- 而因为url不支持\,所以通过urlencode编码,变成%00。
同时,由代码看出路径会跳到/home/wwwrun下,可以使用../../跳出目录
原理:在文件系统中,../
是用于表示上级目录的相对路径符号。当在文件路径中使用 ../
时,实际上是在告诉系统向上跳转到上一级目录。因此,连续使用 ../
就可以一级一级地向上跳转,直到达到所需的目录位置。
远程文件包含漏洞
如果php配置选项allow_url_include为ON,则include与require函数都可以加载远程漏洞,这种漏洞被称为远程文件包含漏洞
ex:
<?php
$param=$_GET['param'];
require_once $param.'/cat';
同样如果构造http://123123/?param=http://123456/flag,txt,经过代码会变为
require_once http://123456/flag.txt/cat
相同这也可以使用%00来截断。
远程和本地的区别
本地文件包含漏洞是加载服务器本地的文件,远程文件包含是加载一个远程的资源,比如使用http协议加载远程文件。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具