1. File Inclusion
主要是这4个函数:
include();
include_once();
// include遇到错误会生成警告,脚本继续执行. require则会停止运行.
require();
require_once();
<?php include $_POST["FILE"]; ?>
如果被包含的文件被写成了前端传来的变量,则可能会引发文件包含漏洞。
分为两种包含情况:本地文件包含漏洞和远程文件包含漏洞
-
本地文件包含漏洞LFI:仅包含服务器本地的文件,如果文件并不是攻击者所能够控制的,攻击者通常会包含一些固定的系统配置文件,从而读取系统敏感信息。如果攻击者能够控制本地文件,那结合文件上传漏洞,危害会更大。
-
远程文件包含漏洞RFI:即通过url地址对远程的文件进行包含。
防范
尽量不要让前端用户直接传变量给包含函数,否则一定要做严格的白名单策略进行过滤, 包括../, http://, https://
等
php.ini安全配置:
allow_url_fopen=off
allow_url_include=off
magic_quotes_gpc=on
magic_quotes_gpc会自动对引号、斜杠等进行转义。
2. 靶场练习
pikachu
File Inclusion(local)
随便选个球星提交抓包,是个get请求:
/pk/vul/fileinclude/fi_local.php?filename=file1.php&submit=Submit+Query
改成../file1.php
, 报错:
Failed opening 'include/../file1.php'
这里根据url猜几次,相对路径其实是../../fileinclude/include/file1.php
如果收集到了系统路径的详细信息,就可以通过..
包含一些系统配置文件,这里就会将文件内容显示出来,但也可能出现解析错误。
只要包含的文件里有代码,就可以执行。
看下源码:
if(isset($_GET['submit']) && $_GET['filename']!=null){
$filename=$_GET['filename'];
include "include/$filename";//变量传进来直接包含,没做任何的安全限制
// //安全的写法,使用白名单,严格指定包含的文件名
// if($filename=='file1.php' || $filename=='file2.php' || $filename=='file3.php' || $filename=='file4.php' || $filename=='file5.php'){
// include "include/$filename";
// }
}
File Inclusion(remote)
远程文件包含需要开启php.ini的两个配置:
; Whether to allow the treatment of URLs (like http:// or ftp://) as files.
; http://php.net/allow-url-fopen
allow_url_fopen=On ;默认开
; Whether to allow include/require to open URLs (like http:// or ftp://) as files.
; http://php.net/allow-url-include
allow_url_include=Off ;默认关
这里没开启allow_url_include
就直接提交远程url(如http://www.baidu.com
)的话,就会报错:
Warning: include(): http:// wrapper is disabled in the server configuration by allow_url_include=0 in C:\Program Files (x86)\phpstudy\PHPTutorial\WWW\pk\vul\fileinclude\fi_remote.php on line 38
看下源码:
$html1='';
if(!ini_get('allow_url_include')){
$html1.="<p style='color: red'>warning:你的allow_url_include没有打开,请在php.ini中打开了再测试该漏洞,记得修改后,重启中间件服务!</p>";
}
$html2='';
if(!ini_get('allow_url_fopen')){
$html2.="<p style='color: red;'>warning:你的allow_url_fopen没有打开,请在php.ini中打开了再测试该漏洞,重启中间件服务!</p>";
}
$html3='';
if(phpversion()<='5.3.0' && !ini_get('magic_quotes_gpc')){
$html3.="<p style='color: red;'>warning:你的magic_quotes_gpc打开了,请在php.ini中关闭了再测试该漏洞,重启中间件服务!</p>";
}
//远程文件包含漏洞,需要php.ini的配置文件符合相关的配置
$html='';
if(isset($_GET['submit']) && $_GET['filename']!=null){
$filename=$_GET['filename'];
echo $filename;
include "$filename";//变量传进来直接包含,没做任何的安全限制
}