打开靶场发现这道题过滤了数字0-9和大量的符号,但是其中过滤的括号为中文状态下的括号这意味着我们不能使用变量,不能使用中括号索引数组,只能使用无参数函数嵌套的方法来获取数据
这里我们要想读取flag.php需要两个步骤
1.找到文件名
2.读取内容
所以我们要使用以下函数
1 localeconv() 返回一个包含本地化数字和货币格式信息的数组。
2 pos() 该函数返回数组中的当前单元(默认是第一个)。在 PHP 中,localeconv() 的第一个元素固定是 点号 .。
3 scandir('.') 扫描当前目录(即 . 目录)。由于 pos(localeconv()) 输出了 .,所以这里等价于 scandir('.'),它会返回当前目录下所有文件的数组。
4 array_reverse() 将文件数组顺序反转。在 ctf.show 的题目环境中,flag.php 通常在目录的倒数位置,反转后它会排在数组的前面。
5 next() 将数组内部指针向前移动一位。通常反转后的数组第一位是 . 或 ...,执行 next() 刚好可以指向 flag.php。
6 show_source() 读取并高亮显示文件内容。此时它的参数就是 next() 选中的 flag.php。
最后的payload如下:show_source(next(array_reverse(scandir(pos(localeconv())))));
