66,【6】buuctf web [HarekazeCTF2019]Avatar Uploader 1

进入靶场

习惯性输入admin

还想用桌面上的123.png

发现不行

看看给的源码

php 复制代码
<?php
// 关闭错误报告,可能会隐藏一些错误信息,在开发阶段可考虑开启(例如 error_reporting(E_ALL))
error_reporting(0); 

// 引入配置文件,可能包含一些常量和配置信息
require_once('config.php'); 
// 引入工具类文件,可能包含一些常用的工具函数
require_once('lib/util.php'); 
// 引入会话管理类文件,可能包含安全会话相关的功能
require_once('lib/session.php'); 

// 创建一个新的 SecureClientSession 对象,使用预定义的 CLIENT_SESSION_ID 和 SECRET_KEY 作为参数
$session = new SecureClientSession(CLIENT_SESSION_ID, SECRET_KEY); 

// 检查是否有文件被上传,如果文件不存在或不是通过 HTTP POST 上传的文件,输出错误信息
if (!file_exists($_FILES['file']['tmp_name']) ||!is_uploaded_file($_FILES['file']['tmp_name'])) {
  error('No file was uploaded.');
}

// 检查文件大小,如果文件大小超过 256000 字节,输出错误信息
if ($_FILES['file']['size'] > 256000) {
  error('Uploaded file is too large.');
}

// 检查文件类型
$finfo = finfo_open(FILEINFO_MIME_TYPE);
// 获取文件的 MIME 类型
$type = finfo_file($finfo, $_FILES['file']['tmp_name']);
finfo_close($finfo);
// 如果文件类型不是 image/png,输出错误信息
if (!in_array($type, ['image/png'])) {
  error('Uploaded file is not PNG format.');
}

// 检查文件的宽高
$size = getimagesize($_FILES['file']['tmp_name']);
// 如果文件的宽度或高度大于 256 像素,输出错误信息
if ($size[0] > 256 || $size[1] > 256) {
  error('Uploaded image is too large.');
}
// 如果文件的类型不是 IMAGETYPE_PNG,输出错误信息并显示 FLAG1(可能是用于调试或意外情况)
if ($size[2]!== IMAGETYPE_PNG) {
  // I hope this never happens...
  error('What happened...? OK, the flag for part 1 is: <code>'. getenv('FLAG1'). '</code>');
}

// 生成一个随机的文件名,使用 bin2hex(random_bytes(4)) 生成一个 8 位的十六进制字符串并添加.png 后缀
$filename = bin2hex(random_bytes(4)). '.png';
// 将上传的文件移动到 UPLOAD_DIR 目录下,并使用生成的随机文件名
move_uploaded_file($_FILES['file']['tmp_name'], UPLOAD_DIR. '/'. $filename);

// 在会话中存储文件名
$session->set('avatar', $filename);
// 显示一个成功的消息
flash('info', 'Your avatar has been successfully updated!');
// 重定向到根目录
redirect('/');
  • 使用 finfo_open(FILEINFO_MIME_TYPE)finfo_file 函数获取文件的 MIME 类型,并使用 in_array 函数检查是否为 image/png 类型,确保只允许上传 PNG 图像。
  • if (!file_exists($_FILES['file']['tmp_name']) ||!is_uploaded_file($_FILES['file']['tmp_name'])):检查文件是否存在且是通过 HTTP POST 上传的文件,防止文件不存在或非法上传。

又能用到010了

只保留文件头就好

提交

flag{f54fa779-9db5-4743-a47a-6b67212736ff}

相关推荐
sheeta199818 小时前
LeetCode 每日一题笔记 日期:2025.11.24 题目:1018. 可被5整除的二进制前缀
笔记·算法·leetcode
LFly_ice18 小时前
学习React-24-路由传参
前端·学习·react.js
陈天伟教授19 小时前
基于学习的人工智能(3)机器学习基本框架
人工智能·学习·机器学习·知识图谱
毕设源码-钟学长19 小时前
【开题答辩全过程】以 高校课程学习评价系统设计与实现为例,包含答辩的问题和答案
学习
chinesegf19 小时前
图文并茂的笔记、便签是如何用py开发的
笔记·状态模式
fruge21 小时前
从第三方库中偷师:学习 Lodash 的函数封装技巧
学习
lingggggaaaa1 天前
免杀对抗——C2远控篇&C&C++&DLL注入&过内存核晶&镂空新增&白加黑链&签名程序劫持
c语言·c++·学习·安全·网络安全·免杀对抗
陈天伟教授1 天前
基于学习的人工智能(5)机器学习基本框架
人工智能·学习·机器学习
我先去打把游戏先1 天前
ESP32学习笔记(基于IDF):基于OneNet的ESP32的OTA功能
笔记·物联网·学习·云计算·iphone·aws
初願致夕霞1 天前
学习笔记——基础hash思想及其简单C++实现
笔记·学习·哈希算法