文件包含漏洞的实验

文件包含漏洞是指服务器allow_url_once选项开启时,若未对文件来源进行彻底的审查会造成文件任意读取或者命令任意执行。

文件包含漏洞产生的原因:

1.外界能够指定文件名
2.能够使用绝对路径或相对路径等形式来指定其他目录的文件名
3.没有校验是否允许访问拼接后的文件名

在DVWA环境下进行实验,可以看到page参数的值情况,在简单的模式下

其核心的代码为:

<?php
$file = $_GET['page'];
?>

即使用PHP参数读取url中的page参数的数值,读取文件或者执行命令

修改page参数的数值:

报错,但在标红处出现绝对路径的暴露:可以修改参数读取系统中的配置文件

上图中,执行了phpinfo.php以及php.ini文件,在未设置过滤的情况下可以使用相对路径结合常用文件名猜解或配合其他漏洞进行入侵

中等难度下,对page参数的读取进行了过滤,其核心代码为:

<?php
$file = $_GET['page'];
$file=str_replace(array("http://","https://"),"",$file);
$file=str_replace(array("../","..\""),"",$file);
?>

此段代码对http://、https://进行了替代为空(及删除相应的字段),用以禁止跨站访问,../和..\同样进行了提换,用以针对相对路径的访问

此时通过复写的方式可绕过,经过str_replace的替换后重新构成了相对路径

高等难度下,核心代码:

<?php
$file=$_GET['page'];
if(!fnmatch("file*",$file)&&$file!="include.php")
{
echo"ERROR:Filenotfound!";
exit;
}
?>

代码中fnmatch函数限制了page的头部必须为file

由于设置的file恰好能够利用file协议进行绕过

完善代码的核心:

<?php
$file=$_GET['page'];
if($file!="include.php"&&$file!="file1.php"&&$file!="file2.php"&&$file!="file3.php"){
echo"ERROR:Filenotfound!";
exit;
}
?>

完善代码利用了白名单,即在白名单外的全部输出错误并且离开。如此一来URL中的page参数就不会被非法利用了

如果白名单不能满足程序功能上的需求,可以分开处理,先通过将空格去除(basename函数无法去除空格),之后通过basename函数将目录部分去除访问文件名,由此可以防止相对路径的文件包含攻击。

对于远程代码执行的问题可以使用一个过滤http://和https://的流程

1、对URL进行解码
2、将输入长度截断成小于等于50
3、删除http://和https://
4、如果3步骤删除任何字符,返回步骤1执行

按此步骤执行可以确保将需要删除字符组去除干净


 

 



 

 

 

 

posted on 2019-01-13 21:11  一盏清茶淡如水  阅读(617)  评论(0编辑  收藏  举报