NSS [SWPUCTF 2021 新生赛]PseudoProtocols
先看题目,题目要求我们先找到hint.php。
看这个get请求头,我们先用php://filter协议读一波
得到提示,让我们前往/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;
}
?>
代码分析:
ini_set("max_execution_time", "180");
将PHP脚本的最大执行时间设置为180秒。
if(isset($a)&&(file_get_contents($a,'r')) === 'I want flag')
如果“a”变量被设置,并且读取“a”变量的【文件】内容等于“I want flag”,则输出“success”和flag的值。
接下来有两种解法
1、php://input
此方法需要条件,即开启allow_url_include=On。
实际上这相当于一个远程包含的利用。
php://打开文件流后,我们直接在流里面写入我们的恶意代码,此时包含既可执行代码。
?a=php://input
// 然后在POST里传入I want flag,则成功读取Flag
2、data://
data://本身是数据流封装器,其原理和用法跟php://input类似,但是是发送GET请求参数。
?a=data://text/plain,I want flag
data协议:data协议是一种特殊的URL协议,可以将数据直接嵌入到URL中,而无需使用外部文件或数据源。data协议的语法如下:
data:[<media type>][;base64],<data>;前两个变量可以不要
HASKELL
具体用法就如下payload
payload=?a=data://text/666,I want flag
//正确用法text/后面跟的是plain我这里用的666,但flag也出来了。