传递一个参数,提示flag的文件名随意

这里就是要传递参数filename,其值随意

直接得到内部逻辑代码

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);

        }

        

    }

}

?> 

这里应该是一个命令指定漏洞 要想办法绕过过滤,让value中的恶意执行代码成功执行 常见的php命令执行函数有 system、exec、passthru等,这里已经禁止了部分,尝试passthru

这里的php版本为php5,值得一试 一定要注意,这里指定php代码时要将其用{}扩起来,表示这时php代码,不然执行不成功

直接得到所有当前目录下文件 直接查看这些文件,但是cat被过滤,所以不能使用linux命令,直接使用php函数进行查看

这里就是php文件读取的九大命令 因为这里对字段的过滤,带有file的都不行 选择show_source 挨个读取文件,有的文件没有回显,是空文件

将这些文件全部读取结束后,居然没有发现flag

命令执行语句

{passthru(ls)}

文件查看语句

{show_source()}

再细看这些没有反馈的文件名,你说有没有可能这写没有反馈和后缀的名称,是一个个文件夹 利用命令执行进行挨个查看

发现libs中包含大量文件

Autoloader.php Smarty.class.php SmartyBC.class.php debug.tpl plugins sysplugins

再次查看

果然这些文件包含大量信息

反之接下来就是整体电脑文件的全部查询了,直到找到flag文件的存放位置 最终在根目录下找到一个全是数字的文件

直接读取

得到flag

精彩链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: