WebSec-File Inclusion

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";//变量传进来直接包含,没做任何的安全限制
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值