DVWA实战篇--文件包含漏洞
File Inclusion
漏洞介绍
为了使代码更加灵活,通常会将被包含的文件设置为变量,用来进行动态调用,但正是由于这种灵活性,从而导致客户端可以调用一个恶意文件,造成文件包含漏洞。对一个简单的 PHP 小程序来说,在不同的 PHP 脚本之间剪切或复制某一函数不是大问题, 但是当进入项目开发时,函数的数量将会变得相当庞大,并且函数具有较强的复杂性,这时你就会把它们保存到一个便于随时调用的函数库中,以便于该函数在整个项目中可以随时被调用。通常情况下这个函数库是一个文件,我们称为代码库。当为特定领域的功能编写函数时,希望通过把自定义的这些函数组织到一起,并存放到 单独的代码文件中。当团队开发项目时,如果有统一的通用函数文件,则将大幅缩短项目的开发周期,并使 得项目的层次结构分明。
开发人员通常会把可重复使用的函数写到单个文件中,在使用某些函数时,直接调用此文件,而无需再次编写,这种调用文件的过程一般被称为包含。
形成条件
当服务器php配置中开启allow_ url include时,可以通过php的某些特性函数(include(),require(),include once()和 require once())利用url去动态包含文件。如果没有对文件来源进行严格审查,就会导致加载恶意文件。
文件包含漏洞分为本地文件包含漏洞和远程文件包含漏洞,远程文件包含漏洞是因为开启了php配置中的allow urlr fopen选项,该选项开启以后,服务器允许包含一个远程文件。
需要说明的一点是,包含文件时,不管文件后缀是不是php,都会尝试当做php文件执行,如果内容是php,会正常执行并打印结果,如果不是,则会原封不动地打印文件内容,所以文件包含漏洞常常会导致任意文件读取与任意命令执行。 include:包含并运行指定文件,当包含外部文件发生错误时,系统给出警告,但整个php.文件继续执行。require:跟include不同的是,当产生错误的时候,include 下面继续运行而require 停止运行了。
漏洞实践
Low
源码分析
从源码看到直接获取一个参数,没有任何安全过滤和验证
漏洞实践
通过多个.\不断地遍历目录
遍历到目录执行phpinfo.php
执行php.ini
运程包含读取robots.txt
Medium
源码分析
通过分析源码发现对"http://", "https://","../", "..\""替换为””,过滤了远程包含,对本地包含没有任何过滤。
漏洞实践
本地文件包含:….//….//绕过过滤
远程文件包含:httphttp://://
High
源码分析
分析源代码可知道将 str_replace
替换为 fnmatch
,保证服务器只能够通过 file
协议来获取文件。这里就无法使用http协议进行远程文件包含。
漏洞实践
这个级别需要利用file协议读取本地文件
impossible
源码分析
源码只允许四个文件名,有效的防止了文件的包含漏洞
防御方法及修复建议
1、严格判断包含中的参数是否外部可控
2、路径限制,限制被包含的文件只能在某一个文件夹内,特别是一定要禁止目录跳转字符,如:“../”
3、基于白名单的包含文件验证,验证被包含的文件是否在白名单中。设置类似白名单的方法,通过筛选固定文件名方法,一方面不必切断这个业务,另一方面又不会被轻易绕过
4、尽量不要使用动态包含,可以在需要包含的页面固定写好,如:“include("head.php")”
5、可以通过调用str_replace()函数实现相关敏感字符的过滤,一定程度上防御了远程文