0%

[Zer0pts2020]Can you guess it

猜谜语吗

这题刚进去alt text有点东西,看看源码
alt text
上面一串和鹤城杯的easyp有点像,看看下面了,随机生成一串什么什么数,然后再一串一串的搞,反正很复杂,我看着也没什么问题,感觉从这里入手有点难
没回显,没cookie,通过提交字符串来得到flag应该是不可能的,这个时候看看wp
暴露了,这里由basename的特性和$_SERVER[‘PHP_SELF’]的特性来决定的
首先flag在config.php当中
然后看basename的那一行
$_SERVER[‘PHP_SELF’]会获取我们当前的访问路径,并且PHP在根据URI解析到对应文件后会忽略掉URL中多余的部分
那么这两种url格式都可以访问到index.php

1
2
/index.php
/index.php/dosent_exist.php

其实作用也很显然了,这里再来一个例子

1
2
3
4
$var1="/config.php/test"
basename($var1) => test
$var2="/config.php/%ff"
basename($var2) => config.php

懂区别所在?
basename可以理解为对传入的参数路径截取最后一段作为返回值,但是该函数发现最后一段为不可见字符时会退取上一层的目录
接下来就显然了,通过构造URI让其包含config.php这个文件名再让basename函数截取出来,之后通过请求参数source就能显示config.php的源码,也就能见到flag了
(源代码写的请求source)
这里要用到一点污染的手段
正则匹配的是路径的末尾,那么用个/config.php/%ff这种的,就可以直接绕过去了
接下来补充点知识

$_SERVER[‘PHP_SELF’]表示当前执行脚本的文件名,当使用了PATH_INFO时,这个值是可控的。所以可以尝试用/index.php/config.php?source来读取flag

basename函数的特性

1
2
var_dump(basename("xffconfig.php")); // => config.php
var_dump(basename("config.php/xff")); // => config.php

alt text