猜谜语吗
这题刚进去有点东西,看看源码
上面一串和鹤城杯的easyp有点像,看看下面了,随机生成一串什么什么数,然后再一串一串的搞,反正很复杂,我看着也没什么问题,感觉从这里入手有点难
没回显,没cookie,通过提交字符串来得到flag应该是不可能的,这个时候看看wp
暴露了,这里由basename的特性和$_SERVER[‘PHP_SELF’]的特性来决定的
首先flag在config.php当中
然后看basename的那一行
$_SERVER[‘PHP_SELF’]会获取我们当前的访问路径,并且PHP在根据URI解析到对应文件后会忽略掉URL中多余的部分
那么这两种url格式都可以访问到index.php
1 | /index.php |
其实作用也很显然了,这里再来一个例子
1 | $var1="/config.php/test" |
懂区别所在?
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 | var_dump(basename("xffconfig.php")); // => config.php |