# [HarekazeCTF2019]Avatar Uploader 1
[HarekazeCTF2019]Avatar Uploader 1
参考文章点这
首先输入用户登录
要求上传小于 256kB 且小于 256px*256px 的 PNG 图片。
上传做头像
试着传🐎发现没用,没有任何回响
只能去看源码来了
最主要的还是 upload.php
<?php
error_reporting(0);
require_once('config.php');
require_once('lib/util.php');
require_once('lib/session.php');
$session = new SecureClientSession(CLIENT_SESSION_ID, SECRET_KEY);
文件包含
// check whether file is uploaded
if (!file_exists($_FILES['file']['tmp_name']) || !is_uploaded_file($_FILES['file']['tmp_name'])) {
error('No file was uploaded.');
}
判断是否上传文件
// check file size
if ($_FILES['file']['size'] > 256000) {
error('Uploaded file is too large.');
}
判断文件大小,不得大于 256kB
// check file type
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$type = finfo_file($finfo, $_FILES['file']['tmp_name']);
finfo_close($finfo);
if (!in_array($type, ['image/png'])) {
error('Uploaded file is not PNG format.');
}
判断是否上传 png 文件
// check file width/height
$size = getimagesize($_FILES['file']['tmp_name']);
if ($size[0] > 256 || $size[1] > 256) {
error('Uploaded image is too large.');
}
getimagesize () 函数用于获取图像大小及相关信息,成功将返回一个数组
判断图像宽度 (0) 小于 256px,高度 (1) 也小于 256px
getimagesize () 函数用于获取图像大小及相关信息,成功将返回一个数组,
判断图像宽度 (0) 小于 256px,高度 (1) 也小于 256px
if ($size[2] !== IMAGETYPE_PNG) {
// I hope this never happens...
error('What happened...? OK, the flag for part 1 is: <code>' . getenv('FLAG1') . '</code>');
}
$size [2] 不是 PNG 文件,将输出 part 1 的 flag
getenv — 获取一个环境变量的值
这个 if 应该就是突破点
// ok
$filename = bin2hex(random_bytes(4)) . '.png';
move_uploaded_file($_FILES['file']['tmp_name'], UPLOAD_DIR . '/' . $filename);
$session->set('avatar', $filename);
flash('info', 'Your avatar has been successfully updated!');
redirect('/');
根据源码分析,想要得到 flag 就要执行第五个 if 语句
图片要求为 png 文件头且不得大于 256kB,宽度 (0) 小于 256px,高度 (1) 也小于 256px
$size [2] 不是 PNG 文件,将输出 part 1 的 flag
png 文件头,宽度和高度可控
输出测试:
根据源码分析,想要得到 flag 就要执行第五个 if 语句
图片要求为 png 文件头且不得大于 256kB,宽度 (0) 小于 256px,高度 (1) 也小于 256px
$size [2] 不是 PNG 文件,将输出 part 1 的 flag
png 文件头,宽度和高度可控
输出测试:
根据源码分析,想要得到 flag 就要执行第五个 if 语句
图片要求为 png 文件头且不得大于 256kB,宽度 (0) 小于 256px,高度 (1) 也小于 256px
$size [2] 不是 PNG 文件,将输出 part 1 的 flag
png 文件头,宽度和高度可控
输出测试:
<?php
list($width, $height, $type, $attr) = getimagesize("444.png");
echo "宽度为:" . $width;
echo "高度为:" . $height;
echo "类型为:" . $type;
echo "属性:" . $attr;
var_dump(getimagesize("444.png"));
?>
$size [2] 不是 PNG 文件,将输出 part 1 的 flag 与前几项要求产生矛盾
所以只能上传一个有 png 文件头,但是又不是 png 文件的图片
这样在第五个 if 语句时就满足条件输出 flag