Lemon's blog

文件包含漏洞——DVWA练习

Record my learning process of File Include.

字数统计: 1.4k阅读时长: 5 min
2019/08/09 Share

前言:在学习文件上传时,制作的图片马需要我们手动去解析,而解析的方法就算用到了文件包含漏洞,所以这次就来学习一下文件包含漏洞。


文件包含漏洞简介

(一)文件包含可以分为本地文件包含远程文件包含两种。文件包含和文件上传一样本身并不是漏洞,而是攻击者利用了包含的特性加上了应用本身对文件控制不严格,对include进来的文件不可控,才导致了一系列危害。
(二)本地文件包含就是通过URL将服务器本地的其他文件include进来。远程文件包含就是将远程服务器的文件include进来。
(三)最主要的是,包含进来的文件都以当前脚本文件解析,例如,当前测试系统是Apache加php环境,那么被include进来的文件,不管是什么类型,例如图片,文本文档等,这些文件被包含以后,都会被当做php脚本来解析。

本地文件包含

通过浏览器包含web服务器上的文件,这种漏洞是因为浏览器包含文件时没有进行严格 的过滤允许遍历目录的字符注入浏览器并执行。
总的来说就是被包含的文件在服务器本地

远程文件包含

在远程服务器上预先设置好的脚本,然后攻击者利用该漏洞包含一个远程的文件,这种漏洞的出现是因为浏览器对用户的输入没有进行检查,导致不同程度的信息泄露、拒绝服务攻击 甚至在目标服务器上执行代码
简单的说就是被包含的文件在第三方服务器

文件包含常用函数

php为例,常用的文件包含函数有:

1
2
3
4
5
6
7
8
9
Include()
#当包含并运行指定文件时,包含的外部文件发生错误,系统会给出警告,但整个php文件还会继续执行。
Require()
/*require()与 include()的区别在于 require()执行如果发生错误,函数会输出
错误信息,并终止脚本的运行。*/
include_once()
/*和include没有什么区别,只是在导入函数之前先检测下该文件是否被include过,如果已经执行了一遍,那么就不在进行第二次的include操作。*/
require_once()
#功能与 require()相同,区别在于当重复调用同一文件时,程序只调用一次


DVWA练习

了解了一些文件包含漏洞的简介和常用函数,下面就通过万能的DVWA来进行文件包含漏洞的练习

1
2
注意:
使用远程包含需要开启allow_url_include

在此之前,先来了解一下./和../以及/

1
2
3
4
5
/ 		根目录
./ 是当前目录
../ 返回到上一级目录
../../ 返回了两级目录
.\ 、..\和./、../意义相同

low

在这里插入图片描述
观察源码发现直接是get方法进去,没有任何过滤,那么就来执行文件包含漏洞
输入

1
?page=../../phpinfo.php

发现在这里插入图片描述
本地文件包含成功

远程文件包含
这里就先在自己的服务器根目录(WWW目录下)下创建一个文件在这里插入图片描述
然后通过远程文件包含来执行
输入

1
?page=http://127.0.0.1/file.txt

发现远程包含成功
在这里插入图片描述
这里也可以用虚拟机和主机来进行远程文件包含漏洞的测试,不过这里就以本地的服务器来进行测试。

medium

在这里插入图片描述

1
str_replace() 函数以其他字符替换字符串中的一些字符(区分大小写)

发现medium已经过滤了http://../等,那么就来构造这样的方法来进行绕过

1
?page=..././..././phpinfo.php

源码中过滤了../,所以我们输入的经过过滤后变成

1
?page=../../phpinfo.php

这样依旧是没有过滤掉../,通过错位进行拼接成../

其实感觉绕过方法大多都是互通的,这种绕过在SQL注入、XSS攻击等都是出现过的
在这里插入图片描述
本地文件包含成功,接下来来尝试远程文件包含

源码中是过滤了http://https://,可以尝试大小写进行绕过,也可以通过双写进行绕过例如:httphttp://://

1
?page=Http://127.0.0.1/file.txt

即可绕过
在这里插入图片描述

High

在这里插入图片描述

1
fnmatch() 函数根据指定的模式来匹配文件名或字符串。

源码中限制了文件名来防止恶意文件包含,并且!fnmatch( "file*", $file )代码使用了fnmatch函数检查page参数,要求page参数的开头必须是file,服务器才会去包含相应的文件。所以就用到了file协议,就来了解一下file协议。

file协议

1
本地文件传输协议 ,file协议主要用于访问本地计算机中的文件.

file协议的基本格式

1
2
3
4
file:///文件路径
如打开D盘www文件下的PHPinfo文件
file:///D:/www/phpinfo
注意:后面必须是绝对路径:

了解了file协议,就构造相应的语句即可进行文件包含

1
?page=file:///D:/phpstuy/www/file.txt

impossible

在这里插入图片描述
分析一下源码

发现if( $file != "include.php" && $file != "file1.php" && $file != "file2.php" && $file != "file3.php" )这一句代码已经将page的参数限制成固定的值了,所以没有办法进行文件包含。


总结:这次算是大致了解了一些文件包含漏洞的知识,但是文件包含还有很多绕过姿势,接下来继续学习!

CATALOG
  1. 1. 文件包含漏洞简介
  2. 2. 本地文件包含
  3. 3. 远程文件包含
  4. 4. 文件包含常用函数
  • DVWA练习
    1. 1. low
    2. 2. medium
    3. 3. High
    4. 4. impossible