[Zer0pts2020]Can you guess it?

image-20240524204834081

主要是几个函数不认得

basename

random_bytes

hash_equals

一个个查一下

basename

image-20240524204859064

random_bytes

image-20240524210052173

这个就是随机生成字符串

hash_equals

image-20240524210034240

这个就是比较两个字符串是否相等

但是后面的好像没什么用吧

因为返回的flag都不知道是什么…

所以看看之前的

if (preg_match('/config\.php\/*$/i', $_SERVER['PHP_SELF'])) {
exit("I don't know what you are thinking, but I won't let you read it :)");
}

if (isset($_GET['source'])) {
highlight_file(basename($_SERVER['PHP_SELF']));
exit();
}

也就是说查询的网址不能有config.php

还一定要传一个source上去

所以要找一找就是这么绕过一下

在这里,就是正则匹配

if (preg_match('/config\.php\/*$/i', $_SERVER['PHP_SELF'])) {
echo "匹配尾部"."<br>";
}
if (preg_match('/config\.php\//i', $_SERVER['PHP_SELF'])) {
echo "匹配字符串"."<br>";
}

所以前者,如果在末尾加上一个没用的字符不就可以绕过了?

找到了!!!%ff

经过测试%aa到%ff都可以用,之后就不行了

这个是因为,basename函数会过滤文件开头中的非ascii值

嘻嘻,如果是%ff之后的就不是ascii码可以识别的了

所以最后的payload:

/index.php/config.php/%ff?source

为什么一定前面要加index,我不太懂,有大佬可以说说不