文件包含漏洞基本原理与简单利用

漏洞原理

文件包含:在通过服务器脚本的函数引入文件时,由于传入的文件名没有经过合理的校验,从而操作了预想之外的文件,导致意外的文件泄露甚至恶意的代码注入。

漏洞成因

几个造成文件包含的PHP 函数

require()
require_once()
include()
include_once()

require()include()的区别
include()在包含的过程中,如果出现错误,会抛出一个警告,然后继续执行。
require()包含出现错误时,直接报错,并退出程序执行。
include_once(),require_once()这两个函数,与前两个的不同之处在于这两个函数只包含一次,以防止函数重定义等问题。
漏洞形成原因
文件包含函数的参数在传递过程中,没有经过严格的过滤,并且参数用户可控。这样的话,用户就可以通过传递恶意的参数,包含其他恶意文件,导致一些非意料的情况发生。

漏洞分类及利用

本地包含漏洞LFI(Local File Inclusion)

本地文件包含漏洞,顾名思义,指的是能打开并包含本地文件的漏洞。大部分情况下遇到的文件包含漏洞都是LFI。

不受限制的本地文件包含漏洞 (DVWA 测试)

不受限制的本地文件包含漏洞可以通过目录遍历包含其他系统文件,或者包含PHP 木马获取webshell。这里以DVWA 进行演示。
low 等级源码分析
blob.jpg
page传参给变量$fileinclude包含变量$file,没有其他任何过滤,并且变量$file也是我们可以控制的。

读取系统文件

读取同目录下文件
blob.jpg
读取同盘符不同目录文件
绝对路径包含,需要知道文件的绝对路径
blob.jpg
相对路径包含,使用../回到盘符根目录下,再使用文件相对路径
blob.jpg
读取不同盘符的文件
blob.jpg
windows 下这里只能使用绝对路径进行包含,相对路径不能跨盘符包含,linux 没有测试。

包含PHP 一句话木马

文件包含获取webshell 通常要结合着文件上传等其他类型的漏洞,借助包含漏洞可以使非PHP 文件按PHP 的方式解析。
blob.jpg

受限制的本地文件包含

限制包含的文件类型
测试代码

<?php
$filename = $_GET['filename'];
include($filename.".html");
?>

%00截断绕过
使用00截断,PHP 版本小于5.3.4,并且PHP 配置文件中魔术方法magic_quotes_gpc = Off
blob.jpg
路径长度截断
windows 系统目录最大长度为256字节,多出的部分会被丢弃
linux 系统目录最大长度为4096字节,多出的部分会被丢弃
blob.jpg
但是这个却并没能复现,可能跟PHP 版本有关。
点号截断
只适用于windows 系统,并且点号长于256。
blob.jpg
这个也没能复现。

远程文件包含(Remote File Include)

远程文件包含,它也属于是“代码注入”的一种,其原理就是注入一段用户能控制的脚本或代码,并让服务端执行。换句话说就是能够包含远程服务器上的文件。
前提条件,在PHP 配置文件中

allow_url_fopen = On(是否允许打开远程文件)
allow_url_include = On(是否允许include/require远程文件)

无限制的远程文件包含

远程文件包含只能包含网站目录的文件,所以一般用于挂马,获取webshell,这里仅演示读取文本文件。
blob.jpg

有限制的远程文件包含

测试代码

<?php
$filename = $_GET['filename'];
include($filename.".html");
?>

问号绕过
blob.jpg
# 绕过
blob.jpg
%00 截断绕过
blob.jpg

常见系统敏感文件

windows

c:\boot.ini
c:\windows\systems32\inetsrv\MetaBase.xml
c:\windows\repair\sam
c:\windows\php.ini php配置文件
c:\windows\my.ini mysql配置文件

linux 普通权限

/etc/passwd
/usr/local/app/apache2/conf/http.conf
/usr/local/app/php5/lib/php.ini PHP相关设置
/etc/httpd/conf/http.conf apache配置文件
/etc/my.cnf
/etc/passwd
/var/log/apache/error.log
/proc/self/environ
/var/log/
/var/log/apache/access.log

linux root权限

/root/.ssh/authorized_keys
/root/.ssh/id_rsa
/root/.ssh/id_rsa.keystore
/root/.ssh/id_rsa.pub
/root/.ssh/known_hosts
/etc/shadow
/root/.bash_history
/root/.mysql_history
/var/log/wtmp
/var/run/utmp

代码块高亮请二次刷新页面
欢迎访问阿威的博客https://www.cnblogs.com/TWX521/
欢迎访问阿威的简书https://www.jianshu.com/u/316a5e2577c0
专注技术与交流,stay hungry stay foolish

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Do NOT follow this link or you will be banned from the site!