浅谈文件包含漏洞的利用与防御

#本篇文章会从文件包含漏洞的原理开始,大概描述这个漏洞的利用和防御#

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

程序开发人员通常会把可重复使用的函数或者语句写道单个文件中,他们都希望代码更加灵活,所以会把包含文件的路径设置成变量,来进行动态调用,如果被包含文件的路径客户端可控制,就造成了文件包含漏洞。
文件包含漏洞在php的web应用中居多,在jsp/asp/asp.net程序中比较少。

PHP中的文件包含语句。

include():多次包含,包含失败后产生警告并继续运行。
include_once():一次包含,包含失败后产生警告并继续运行。
require():多次包含,包含失败后产生警告并结束运行。
require_once():一次包含,包含失败后产生警告并结束运行。

文件包含是php的基本功能之一,由本地文件包含与远程文件包含之分。

可以通过php.ini中的选项进行配置:

allow_url_fopen = On/Off  # http://|ftp:// 访问远程文件
allow_url_include = On/Off  #require|include 访问本地文件

漏洞特点

1.无视文件扩展名读取文件。
可以直接读取图片,pdf等文件的源代码。
2.无条件解析PHP代码
当读取到被包含文件的源码,如果遇到符合php代码规范的内容,就会无条件执行。这也为图片木马提供了出路。

漏洞利用与防御

毫无防御的源代码

$file = $_GET['page'];

这是毫无防护的php源代码,我们可以直接传递已知的敏感文件路径来读取敏感文件。
在这里插入图片描述

远程包含:
浅谈文件包含漏洞的利用与防御_第1张图片

关键词过滤的源代码

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

可以看出这段代码屏蔽了一些关键词,可以用双写或者大写绕过的方式利用漏洞。
在这里插入图片描述
浅谈文件包含漏洞的利用与防御_第2张图片

限定文件路径起始字符的源代码

$file = $_GET['page'];
if( !fnmatch( "file*", $file != "include.php" )){
	echo "ERROR: File not found!";
	exit;
}

这段代码限制了文件路径的起始字符,直接用file://调用本地文件。
浅谈文件包含漏洞的利用与防御_第3张图片

图片木马的利用

首先在攻击方写好一个php文件,执行一个创建shell.php文件的命令,并写入一句话木马。
浅谈文件包含漏洞的利用与防御_第4张图片
将这个php文件与一张正常图片绑定。
浅谈文件包含漏洞的利用与防御_第5张图片
利用文件上传漏洞上传图片。
浅谈文件包含漏洞的利用与防御_第6张图片
再利用文件包含漏洞使隐藏在图片中的代码执行。
浅谈文件包含漏洞的利用与防御_第7张图片
可以看到shell.php已经成功创建并能成功运行。
浅谈文件包含漏洞的利用与防御_第8张图片
尝试蚁连接,发现可以成功连接,这样就成功植入了后门。
浅谈文件包含漏洞的利用与防御_第9张图片
浅谈文件包含漏洞的利用与防御_第10张图片
读取PHP文件源码
利用php://fileter/read读取php配置文件等的源码。
浅谈文件包含漏洞的利用与防御_第11张图片
浅谈文件包含漏洞的利用与防御_第12张图片
直接执行PHP命令
利用php://input可以直接执行php命令
浅谈文件包含漏洞的利用与防御_第13张图片
漏洞修复思路
1.尽量少的使用动态包含。
2.严格过滤被包含文件路径。
3.将参数allow_url_include设置为Off。
4.使用参数open_basedir限定文件访问范围。

你可能感兴趣的:(文件包含)