题目环境:http://8.129.4.24:20004/

打开题目,一个搜索框,输入1搜索试试,根据结果,推测是find命令查询文件位置

查询flag,得到位置/flag

想办法读取/flag,尝试命令拼接执行,提示字符非法,看来是被过滤了,尝试各种方法无果,对网站进行目录扫描,得到www.zip,下载读取源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
error_reporting(0);
$argv = $_GET["search"];
for ($i = 0; $i < strlen($argv); $i++) {
if (($argv[$i] == '&') ||
($argv[$i] == '>') ||
($argv[$i] == '<') ||
($argv[$i] == '(') ||
($argv[$i] == ';') ||
($argv[$i] == '|')
) {

if ($i == 0) {
goto error;
}
if (($i == 1) && ($argv[0] == '\\')) {
continue;
}
if (($argv[$i - 1] == '\\') && ($argv[$i - 2] != '\\')) {
continue;
}
error:
exit("Input contains prohibited characters!<br>");
}
}
echo "<h3>Search reslut:</h3><br>";
system("find / -iname " . $argv);
?>

发现过滤了;等字符,但允许存在\;,有些不知该如何进行下去,但是根据提示,查看find命令手册,发现find命令有一个参数-exec可以对查找的文件进行命令操作,语法为-exec 'command' {} \;,想要输出flag可以执行find / -iname flag -exec 'cat' {} \;
于是构造查询语句flag -exec 'cat' {} \;,查询成功得到flag