CTF文件上传

一、CTF文件上传漏洞

CTF文件上传漏洞是指在网站文件上传功能中,未对用户上传的文件类型、大小、路径进行限制,或者对用户上传的文件没有做充分的过滤和检查,从而导致攻击者可以上传一些恶意文件(如WebShell)或进行目录遍历等攻击行为,最终达到获取系统权限、敏感信息或非法操作等目的。

攻击者可以通过上传恶意脚本实现以下攻击:

  • 网站借此被攻击者利用,例如进行DDoS攻击、挖矿等
  • 攻击者注入WebShell,窃取管理员密码或者直接控制服务器
  • 攻击者上传病毒文件,破坏服务器稳定性

在防范CTF文件上传漏洞的过程中,需要注意以下几点:

  • 在上传文件时,需要确保对文件的格式、大小、路径等进行正确的限制和过滤检查。
  • 服务端需要对上传文件的后缀名、文件类型进行检查,防止上传脚本或其他恶意文件。
  • 服务端需要设置上传目录,避免攻击者利用路径遍历漏洞上传文件到指定的目录。
  • 开启SELinux或者AppArmor,限制文件上传的权限。

二、CTF文件上传如何找路径

攻击者可以通过文件上传功能找到路径,这就需要进行一些黑盒测试。通过对目录遍历的理解,攻击者可以在上传文件时的文件名中携带一些相对路径或者绝对路径,从而绕过服务端的限制,访问到一些敏感目录。

以下是一些路径遍历的常用技巧示例:

..\\..\\..\\..\\..\\..\\..\\windows\win.ini
../../../../../windows/win.ini
../../../../../../../etc/passwd
..%2F..%2F..%2F..%2F..%2F..%2Fetc/passwd

如果上传路径存在漏洞,攻击者可以通过这种方式逐层遍历上级目录,进而获取到更敏感的信息。

三、CTF文件上传绕过JS

很多前端在文件上传时会检查一些文件的扩展名来做一层判断,避免上传不安全的文件。比如,常见的图片文件的扩展名包括jpg、gif、png等,如果用户上传的文件不是这些类型之一,前端会提示用户上传不合法。

攻击者可以通过绕过JS进行上传防护机制:“上传”按钮可禁用,但用户可以通过其他方式上传文件。

例如:在输入框中上传文件及上传后将文件内容复制进去,在本地端编写包涵图片链接的html文件,最后将html文件上传到服务器。这样,即使前端对图片格式做了限定,攻击者也可以通过反编译html代码获取图片链接,进而获取到敏感信息。

四、CTF文件上传绕过

除了JS限制外,还有其他一些方法可以绕过文件上传检测。例如,有些服务器会忽略文件名后缀而判断MIME类型,如果攻击者修改了文件的扩展名并禁止MIME类型检测,即可进行文件上传绕过。

此外,有时候攻击者会在上传时篡改Content-Type,并携带危险的文件类型。

以下是常见的上传绕过方式:

  • 修改文件后缀名
  • 篡改Content-Type
  • 使用Content-Disposition以替换文件名
  • 通过Content-Transfer-Encoding实现文件上传

五、CTF文件上传题目

CTF比赛中,文件上传题目是一个常见的考点。需要选手通过上传恶意文件来获取网站的flag,从而赢得比赛。

以下是一个简单的CTF文件上传题目的 PHP 代码:

<?php
   if(isset($_POST['submit'])){
      $target_dir = "uploads/";
      $target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
      $uploadOk = 1;
      $imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));
      if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"
      && $imageFileType != "gif" ) {
         echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed.";
         $uploadOk = 0;
      }
      if ($uploadOk == 0) {
         echo "Sorry, your file was not uploaded.";
      } else {
         if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
            echo "The file ". basename( $_FILES["fileToUpload"]["name"]). " has been uploaded.";
         } else {
            echo "Sorry, there was an error uploading your file.";
         }
      }
   }
?>

这个例子中,文件上传路径为uploads目录,仅允许上传JPG、PNG、JPEG和GIF格式的文件。如果上传成功,页面会提示上传成功信息,否则会提示上传失败。

六、CTF文件上传只能是图片

在有些情况下,只允许上传图片时,可以使用以下方式实现上传图片功能。

<?php
   if(isset($_POST['submit'])){
      $target_dir = "uploads/";
      $target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
      $uploadOk = 1;
      $imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));

      // Check if image file is a actual image or fake image
      if(isset($_POST["submit"])) {
         $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
         if($check !== false) {
            echo "File is an image - " . $check["mime"] . ".";
            $uploadOk = 1;
         } else {
            echo "File is not an image.";
            $uploadOk = 0;
         }
      }

      // Check if file already exists
      if (file_exists($target_file)) {
         echo "Sorry, file already exists.";
         $uploadOk = 0;
      }

      // Check file size
      if ($_FILES["fileToUpload"]["size"] > 500000) {
         echo "Sorry, your file is too large.";
         $uploadOk = 0;
      }

      // Allow certain file formats
      if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"
      && $imageFileType != "gif" ) {
         echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed.";
         $uploadOk = 0;
      }

      // Check if $uploadOk is set to 0 by an error
      if ($uploadOk == 0) {
         echo "Sorry, your file was not uploaded.";
      } else {
         if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
            echo "The file ". basename( $_FILES["fileToUpload"]["name"]). " has been uploaded.";
         } else {
            echo "Sorry, there was an error uploading your file.";
         }
      }
   }
?>

除了支持JPG、PNG、JPEG和GIF格式外,上面的代码还支持检查文件是否存在、文件大小限制等。在检查到上传文件不是图片时,前端会提示用户上传不合法。

七、CTF文件上传经典题目

以下是一个基于文件上传漏洞的CTF经典题目:上传并执行WebShell。

这个题目的思路是在文件上传的同时,通过一些漏洞透过文件系统进行WebShell注入,最终获取到服务器的权限。

以下是一个PHP代码示例:

<?php
$uploadfile=$_FILES["file"]["tmp_name"];
$target = "/uploads" . basename($_FILES['uploaded']['name']) ;
if(move_uploaded_file($_FILES['uploaded']['tmp_name'], $target)) {
  echo "The file has been uploaded.";
  exec($uploadfile);
} else{
  echo "Sorry, there was a problem uploading your file.";
}
?>

以上代码中,通过move_uploaded_file()将上传的文件移动到服务器的/uploads目录中,并利用exec()来执行上传的文件,即可在服务器上执行恶意代码(WebShell),攻击者可通过WebShell获取Web目录下文件、服务器系统信息和管理员权限等。

八、CTF文件上传无限制

如果服务器端不存在对上传文件的限制,那么攻击者将有机会上传一个超级大的文件,从而导致服务器出现拒绝服务(DOS)现象。

以下是PHP上传脚本无限制代码示例:

<?php
$folder = "uploads/";
move_uploaded_file($_FILES["file"]["tmp_name"], "$folder".$_FILES["file"]["name"]);
echo "File uploaded successfully.";
?>

如果在没有限制的情况下,可以使用关于“Part file upload”或“范围请求”之类的HTTP POST请求,将文件分块上传,从而上传非常大的文件。

九、CTF文件上传无限制找flag

以下是一种通用的无限制找flag的方法,设置PHP文件上传路径与上传flag,可以获取到服务器上的flag文件。

以下是PHP代码示例:

<?php
   if(isset($_POST['submit'])){
      $target_dir = "uploads/";
      $target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
      $uploadOk = 1;
      $imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));

      if ($uploadOk == 0) {
         echo "Sorry, your file was not uploaded.";
      } else {
         if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
            echo "The file ". basename( $_FILES["fileToUpload"]["name"]). " has been uploaded.";
            $content = file_get_contents('flag.txt');
            echo $content;
         } else {
            echo "Sorry, there was an error uploading your file.";
         }
      }
   }
?>

上述代码中,当上传文件成功时,会打印出flag文件的内容。这个方法完全依赖于服务器的漏洞,需要在存储flag的目录中加入php上传脚本,在提交文件时获取flag文件内容。

原创文章,作者:MPSHR,如若转载,请注明出处:https://www.506064.com/n/317677.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
MPSHRMPSHR
上一篇 2025-01-11 16:27
下一篇 2025-01-11 16:27

相关推荐

  • 使用 DRF 实现文件上传

    文件上传是 web 应用程序中最常见的需求之一,本文将介绍如何使用 Django Rest Framework (DRF) 来实现文件上传。通过本文,你将学习到如何使用 DRF 中…

    编程 2025-04-28
  • SpringBoot文件上传详解

    一、前言 随着互联网的发展,文件上传成为了必备的功能之一,而SpringBoot作为目前最流行的开发框架之一,为文件上传提供了便捷而强大的解决方案。 二、使用multipart/f…

    编程 2025-04-24
  • 从多个方面详细阐述postman文件上传的接口测试

    一、接口测试基础 了解接口测试的基础是进行postman文件上传接口测试的前提。 首先,需要了解什么是接口测试。 接口测试是对软件系统中接口的测试,包括接口的功能测试、性能测试、安…

    编程 2025-04-24
  • CTF 加载程序详解

    CTF (Capture the Flag) 比赛是信息安全领域的一种比赛形式,旨在检验参赛者在网络攻防、漏洞挖掘、密码破解等方面的技能。CTF 加载程序作为比赛的关键组成部分之一…

    编程 2025-04-23
  • 阿里云OSS文件上传详解

    一、OSS介绍 OSS,全称 Object Storage Service,是阿里云提供的一种海量、安全、低成本、高可靠的云存储服务。可以用来存储和处理各种非结构化数据(如图片、音…

    编程 2025-02-24
  • 微信小程序文件上传详解

    一、微信小程序文件上传和下载 微信小程序提供了上传和下载文件的API,可以方便地在开发中使用到。 文件上传使用wx.uploadFile()方法,文件下载使用wx.download…

    编程 2025-02-15
  • Vulnhub——CTF攻防比赛的平台

    Vulnhub是一款专门用于CTF攻防比赛的漏洞模拟测试平台,里面收录了大量的虚拟机镜像,镜像中包含了各种各样的漏洞,用于供安全从业者和安全爱好者进行攻防实践,提高安全技术水平。以…

    编程 2025-02-01
  • 基于Springboot的MultipartFile多文件上传

    一、MultipartFile简介 MultipartFile是Springframework中的接口,它代表了上传文件的数据类型。MultipartFile允许我们获取文件名、大…

    编程 2025-01-27
  • Flask文件上传指南

    一、Flask文件上传运行 Flask是一个基于Python的Web应用程序开发框架,其中包括文件上传功能。在使用Flask进行文件上传之前,需要安装Flask并创建Flask应用…

    编程 2025-01-24
  • 使用Spring Boot实现文件上传

    一、Spring Boot文件上传的介绍 在Web开发中,文件上传功能是一个比较基础且常见的功能,利用Spring Boot可以快速实现文件上传,并且可以实现大小、格式等限制。在本…

    编程 2025-01-21

发表回复

登录后才能评论