传递一个参数,提示flag的文件名随意
这里就是要传递参数filename,其值随意
直接得到内部逻辑代码
<?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);
}
}
}
?>
这里应该是一个命令指定漏洞
要想办法绕过过滤,让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