前言:在学习文件上传时,制作的图片马需要我们手动去解析,而解析的方法就算用到了文件包含漏洞,所以这次就来学习一下文件包含漏洞。
文件包含漏洞简介
(一)文件包含可以分为本地文件包含和远程文件包含两种。文件包含和文件上传一样本身并不是漏洞,而是攻击者利用了包含的特性加上了应用本身对文件控制不严格,对include进来的文件不可控,才导致了一系列危害。
(二)本地文件包含就是通过URL将服务器本地的其他文件include进来。远程文件包含就是将远程服务器的文件include进来。
(三)最主要的是,包含进来的文件都以当前脚本文件解析,例如,当前测试系统是Apache加php环境,那么被include进来的文件,不管是什么类型,例如图片,文本文档等,这些文件被包含以后,都会被当做php脚本来解析。
本地文件包含
通过浏览器包含web服务器上的文件,这种漏洞是因为浏览器包含文件时没有进行严格 的过滤允许遍历目录的字符注入浏览器并执行。
总的来说就是被包含的文件在服务器本地
远程文件包含
在远程服务器上预先设置好的脚本,然后攻击者利用该漏洞包含一个远程的文件,这种漏洞的出现是因为浏览器对用户的输入没有进行检查,导致不同程度的信息泄露、拒绝服务攻击 甚至在目标服务器上执行代码
简单的说就是被包含的文件在第三方服务器
文件包含常用函数
以php为例,常用的文件包含函数有:
Include()
#当包含并运行指定文件时,包含的外部文件发生错误,系统会给出警告,但整个php文件还会继续执行。
Require()
/*require()与 include()的区别在于 require()执行如果发生错误,函数会输出
错误信息,并终止脚本的运行。*/
include_once()
/*和include没有什么区别,只是在导入函数之前先检测下该文件是否被include过,如果已经执行了一遍,那么就不在进行第二次的include操作。*/
require_once()
#功能与 require()相同,区别在于当重复调用同一文件时,程序只调用一次
DVWA练习
了解了一些文件包含漏洞的简介和常用函数,下面就通过万能的DVWA来进行文件包含漏洞的练习
注意:
使用远程包含需要开启allow_url_include
在此之前,先来了解一下./和../以及/
/ 根目录
./ 是当前目录
../ 返回到上一级目录
../../ 返回了两级目录
.\ 、..\和./、../意义相同
low
观察源码发现直接是get方法进去,没有任何过滤,那么就来执行文件包含漏洞
输入
?page=../../phpinfo.php
发现
本地文件包含成功
远程文件包含
这里就先在自己的服务器根目录(WWW目录下)下创建一个文件
然后通过远程文件包含来执行
输入
?page=http://127.0.0.1/file.txt
发现远程包含成功
这里也可以用虚拟机和主机来进行远程文件包含漏洞的测试,不过这里就以本地的服务器来进行测试。
medium
str_replace() 函数以其他字符替换字符串中的一些字符(区分大小写)
发现medium已经过滤了http://
、../
等,那么就来构造这样的方法来进行绕过
?page=..././..././phpinfo.php
源码中过滤了../
,所以我们输入的经过过滤后变成
?page=../../phpinfo.php
这样依旧是没有过滤掉../
,通过错位进行拼接成../
其实感觉绕过方法大多都是互通的,这种绕过在SQL注入、XSS攻击等都是出现过的
本地文件包含成功,接下来来尝试远程文件包含
源码中是过滤了http://
、https://
,可以尝试大小写进行绕过,也可以通过双写进行绕过例如:httphttp://://
?page=Http://127.0.0.1/file.txt
即可绕过
High
fnmatch() 函数根据指定的模式来匹配文件名或字符串。
源码中限制了文件名来防止恶意文件包含,并且!fnmatch( "file*", $file )
代码使用了fnmatch
函数检查page参数,要求page参数的开头必须是file,服务器才会去包含相应的文件。所以就用到了file协议,就来了解一下file协议。
file协议
本地文件传输协议 ,file协议主要用于访问本地计算机中的文件.
file协议的基本格式
file:///文件路径
如打开D盘www文件下的PHPinfo文件
file:///D:/www/phpinfo
注意:后面必须是绝对路径:
了解了file协议,就构造相应的语句即可进行文件包含
?page=file:///D:/phpstuy/www/file.txt
impossible
分析一下源码
发现if( $file != "include.php" && $file != "file1.php" && $file != "file2.php" && $file != "file3.php" )
这一句代码已经将page的参数限制成固定的值了,所以没有办法进行文件包含。
总结:这次算是大致了解了一些文件包含漏洞的知识,但是文件包含还有很多绕过姿势,接下来继续学习!