文件包含漏洞就是使用函数去包含任意文件的时候,当包含的文件来源过滤不严谨的时候,当存在包含恶意文件后,就可以通过这个恶意的文件来达到相应的目的。
1.2.文件包含漏洞原理其实原理就是由于在代码开发的过程中,有时候会遇到相同的代码,不想重复输入,就将代码单独写在一个文件里面,当遇到的时候就直接调用该文件进行运行,而这种方式就会导致客户端可以调用其他的恶意文件,通过恶意文件造成文件包含漏洞。
但是前提也是当文件包含的代码文件被当作一个变量来使用,并且能够被用户传入参数,如果没有对该变量做相应的安全防护,就可能会引发出文件包含漏洞。
1.3.文件包含的函数1.3.1.常见的文件包含函数PHP:include() 、include_once()、require()、require_once()
JSP/Servlet:ava.io.file()、java.io.filereader()
ASP:include file、include virtual
1.3.2.PHP函数区别:
文件包含漏洞在PHP中是比较多的,像JSP、ASP这方面的漏洞是比较少的,但这并不是说就不存在。
include:包含并运行指定的文件,包含文件发生错误时,程序警告,但会继续执行。
include_once:和 include 类似,不同处在于 include_once 会检查这个文件是否已经被导入,如果已导入,下文便不会再导入,直面 once 理解就是只导入一次。
require:包含并运行指定的文件,包含文件发生错误时,程序直接终止执行。
require_once:和 require 类似,不同处在于 require_once 只导入一次。
1.4.文件包含漏洞特征其实在文件包含在URL中能够明显的看出来,但是不代表含有这些特征就一定有文件包含漏洞。只不过有这些特征可以进行判断是存在文件包含的,但是能不能利用是另一方面。
比如:
http://www.xxx.com/index.php/?name=x.php
http://www.xxx.com/index.php/?file=index2
1.5.文件包含漏洞分类1.5.1.本地文件包含漏洞
本地文件包含,通过意思就能够理解,就是在条件允许的情况下,所谓的条件允许也就是安全防护没做到位,通过这个条件对文件路径加 载文件,就形成了本地文件包含。
1.5.1.1.本地文件包含漏洞案例例如php代码:
<?php
$filename=$_GET[name];
include($filename);
?>
在我网站根目录下面有一个index.php,通过文件包含进行执行,就形成了本地文件包含,若这个name参数能够被用户控制,那么就形成了本地文件包含漏洞。
1.5.2.远程文件包含漏洞远程文件包含漏洞导致的原因和本地文件包含漏洞造成的原因是一样的,只不过远程文件包含漏洞是利用外部的服务器中的文件进行执行,就形成了远程文件包含漏洞。
但是前提是需要在php.ini中的配置选项中allow_url_fopen和allow_url_include为ON。
1.5.2.1.远程文件包含漏洞案例 准备两台虚拟机,一台做网站服务器,另外一台做攻击者主机。
网站服务器:192.168.10.150
攻击者主机:192.168.10.50
网站服务器php代码:
<?php
$filename=$_GET[name];
include($filename);
?>
攻击者主机php代码:
<?php phpinfo();?>
攻击者访问服务器网站,并把主机上的本地文件进行远程文件包含。
1.6.文件包含漏洞危害读取WEB服务器上的配置文件以及WEB服务器上的敏感文件,并且若和webshell联动,并将恶意代码执行将造成更大的危害,通常来说远程文件包含漏洞危害更大。
1.7.文件包含漏洞特点1.7.1.无视文件扩展名在PHP中当使用上面的一些函数的时候,这个文件就会被当作PHP代码进行执行,PHP内核并不会在意包含的文件是什么类型的,也就是说当发过来的是.png的文件也会被当作PHP执行。
1.7.1.1.无视文件扩展名案例例如这里将原来含有<?php phpinfo();?>代码的php文件后缀名修改为jpg的时候,依旧执行了php代码。