[HarekazeCTF2019]Avatar Uploader 1 [HarekazeCTF2019]Avatar Uploader 1 参考文章点这
首先输入用户登录
要求上传小于256kB且小于256px*256px的PNG图片。 上传做头像
试着传🐎发现没用,没有任何回响
只能去看源码来了 最主要的还是upload.php
1 2 3 4 5 6 7 8 <?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);
文件包含
1 2 3 4 // check whether file is uploaded if (!file_exists($_FILES['file']['tmp_name']) || !is_uploaded_file($_FILES['file']['tmp_name'])) { error('No file was uploaded.'); }
判断是否上传文件
1 2 3 4 // check file size if ($_FILES['file']['size'] > 256000) { error('Uploaded file is too large.'); }
判断文件大小,不得大于256kB
1 2 3 4 5 6 7 // 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文件
1 2 3 4 5 // 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
1 2 3 4 5 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
1 2 3 4 5 6 $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文件头,宽度和高度可控 输出测试:
1 2 3 4 5 6 7 8 <?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
Author:
odiws
Permalink:
http://odiws.github.io/2024/08/04/HarekazeCTF2019-AvatarUploader1/
License:
Copyright (c) 2019 CC-BY-NC-4.0 LICENSE
Slogan:
Do you believe in DESTINY ?