一.常见文件包含函数:
include()、require()、include_once()、require_once()
函数中包含的新文件会作为PHP代码执行
1.include():找不到包含的文件会产生警告,脚本继续执行
2.require():找不到包含的文件会产生错误并停止脚本,直接退出
3.include_once()、require_once():和include()、require()的区别是不会重复包含文件
二.文件包含漏洞类型:
1.本地文件包含
(1)目录遍历:通过…/…/读取任意文件内容(可以通过编码形式绕过)
(2)%00截断:php基于c语言,以0字符结尾,所以可以通过%00截断字符串
(3)长目录截断:利用最大目录长度的限制进行截断(windows目录最大长度为256字节,linux为4096字节)
2.远程文件包含:PHP的配置选项allow_url_include为On时,文件包含函数可以加载远程文件,可以在URL中写入目标文件地址,上传一句话木马,从而获取网站目录
<?php @eval($_POST['attack']) ?>
三.PHP伪协议
1.php://filter:过滤筛选文件
php://filter/resource=
(1)非PHP语法文件include失败,直接输出源码内容
(2)PHP语法文件需要先base64编码,使文件不被认为是PHP文件,输出文件内容的base64编码
php://filter/read=convert.base64-encode/resource=
2.php://input:访问原始数据,将post请求中的数据作为PHP代码执行
3.php:zip://:访问压缩文件中的子文件,并使用%23分隔分隔压缩包和压缩包里的内容,不管文件后缀是什么,都会当做压缩包来解压
(表格为转载)