安全测试 WEB 安全测试总结篇- 文件上传漏洞

耗子 · 2021年07月08日 · 3555 次阅读

引言

第一次发帖,轻喷!以前用 GitHub 注册 TesterHome 后一直没有发过帖子,在 TesterHome 也扮演着学习者的角色。直到昨天想发帖时才火急火燎的绑定了微信度过了一天的新人期。个人维护有一个公众号,后面会在时间充裕的情况下同步到 TesterHome,各位朋友想了解关注的可在文章后微信扫描关注。
回到正题,在一个 WEB 应用程序中,文件上传是一个比较常见的功能,比如上传图片、文件、视频等等。假设文件上传存在漏洞,我们可以通过文件上传将可执行脚本上传到服务器中,进一步获取到网站、服务器的权限。
在一个应用程序中,给用户提供的功能越多,就意味着受到攻击的风险就越大,这是相对的。那么,什么时候存在文件上传漏洞呢?让我们来看看~

漏洞解析

上传文件时,如果服务端代码未对上传文件类型进行验证和过滤,也就是说可以上传任意文件,这时候攻击者就可以通过上传 asp、aspx、php、jsp 等格式的脚本控制整个网站或服务器。这种恶意的脚本文件,我们称为 webshell,这种脚本上传后我们可以通过它查看服务器的目录、文件甚至执行服务器命令。

DEMO

介绍完之后我们通过靶机在来看看 OWASP 安全级别分别为低、中、高情况下文件上传漏洞的 DEMO。首先我们打开服务器运行 OWASP 后进入 OWASP 靶机首页。具体如下:


我们点击 DamnVulnerableWebApplication 进行登陆,账号密码均为 admin 。该页面提供了一般安全测试常见的攻击方式的示例,不过需要我们自己去发现它。具体如下:

我们先开低安全级别,然后进入 upload 页看看后台的验证方式。我们可以看到后台是没有对文件类型进行限制的。具体如下:

之后我们新建一个 shell.php 文件进行上传,文件代码示例及截图如下:

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


上传成功后这里显示了图片的路径信息,我们在原地址的基础上拼接上去访问看看成功了没有。因为是 php 文件,所以可能访问会显示空白。具体如下:

http://192.168.49.129/dvwa/vulnerabilities/upload/../../hackable/uploads/shell.php

成功后我们下载中国菜刀软件,不知道菜刀是什么的可以点击下面链接了解下:

https://baike.baidu.com/item/%E4%B8%AD%E5%9B%BD%E8%8F%9C%E5%88%80/3963062?fr=aladdin

下载好后我们可以直接通过菜刀连接服务器,甚至可以对服务器进行操作。这里提示一下,建议安装 windows10 的虚拟机进行安装测试,避免本机在下载软件的过程中被人留后门。我们可以通过上传的 php 文件地址加上自己设置的密码进行远程连接。具体如下:


我们可以看到,通过脚本我们非常简单的连接到了服务器。甚至在后期我们可以通过 SQL 注入拿到数据库权限,提权后在通过菜刀或其它工具连接操作数据库。

下面我们来看看 OWASP 为中级情况下的 DEMO。通过修改设置把等级设置为中级后我们来看看相关的后台代码,具体如下:

我们可以看到,在设置为中级后 后台的代码对上传文件的请求类型做了限制。那么,这种情况下我们还可以上传 webshell 脚本文件吗?答案是可以的,我们只需要对该网站请求进行代理,在上传文件后通过代理把请求类型的 type 修改为图片类型也是可以上传成功的。这里我选择的代理工具是 Burp Suite,具体如下:




我们可以看到,上传成功了。那么现在我们在用菜刀远程连接下服务器看看效果。

在这种情况下我们也是可以通过 webshell 进行远程连接的,效果与第一个 DEMO 是一样的。那么,在安全级别是高的情况下我们还可以上传 webshell 脚本吗?让我们来看看高级别情况下的后台验证。

在高级别的情况下,我们发现后台代码通过截取后缀的方式验证了上传文件的类型。在这种情况下,代理也没有了意义,如果不是图片类型,毫无疑问是会报错的。那么,这种情况下我们还可以上传 webshell 脚本吗?这种情况下也是可以的,但是这里有一个前提条件,网站的 URL 是存在包含的。这里先留个悬念,在这种情况下的脚本上传计划在下篇文章包含漏洞进行概述。

说了几个 DEMO,是不是对上传漏洞有了比较清晰的认知。下面我们就来看看常见的几种绕过进行攻击的方式。这里需要重点说明的是 webshell 不是本系列的重点,想了解 webshell 脚本及脚本隐藏方式的小伙伴可以自行在相关网站进行了解。

绕过攻击

在上面的 DEMO 中都是通过后台去校验文件上传的类型。那么,在实际场景中,还有其它的校验方式吗?下面让我们来看看常见的几种校验方式及在这几种校验方式的情况下怎么绕过校验上传文件。

JS 检测

在一些网站上传时,网站的检测是在前端限制的。如果上传文件的后缀不被允许,则会弹出一个弹出框提示用户,这个时候数据是没有发送请求的,只是在前端 JS 做了检测,这种叫 JS 检测。碰到这种我们有二种方法绕过检测。一种是 F12 删除相关的检测代码上传,第二种是通过上面 DEMO2 所演示的方式:修改符合上传文件规则的后缀,上传后通过代理或者抓包软件修改回来。

文件后缀检测

文件后缀就是我上面 DEMO3 的验证风格,限制了某些后缀或某些后缀之外的文件不能上传,这种绕过的方式涉及到了 URL 包含,会在下一篇文章进行说明。不过安全测试我也只是了解阶段,可能还会有其它的绕过方法。

文件类型检测

文件类型就是我上面 DEMO2 的验证风格,限制了请求接口中的文件类型。绕过的方式可以使用代理修改类型后在请求到服务器。

竞争条件攻击

一些网站上传时是允许上传任意类型的文件,成功后在检查上传的文件是否包含 webshell 脚本,如果包含则删除。那么,在上传到检查上传文件之间是有一个比较短的时间差的,我们可以利用时间差通过上传的 webshell 脚本生成一个新的 webshell 脚本。脚本如:

<?php fputs(fopen('../shell.php','w'),'<?php @eval($_POST['pass']);?>');?>

我们上传脚本成功后通过 URL 马上运行该脚本。该脚本会在当前目录下自动生成 shell.php,这时我们就通过检测的这个时间差生成了一个新的脚本。

其它及建议

除了这些攻击方式还有其它的攻击方式,比如我没了解过的文件截断等。所以在做上传文件功能时,建议对上传的文件重新命名或设置白名单的方式去尽量避免它。

尾巴

在写之前感觉后面每篇都会有很多内容,但是今天在写上传漏洞时却发现内容没有想象的多,真是人生一大错觉。本篇文章就说到这里,下一篇文章计划聊下 URL 包含的漏洞,算是本篇文章的一个扩展。
有兴趣的可以关注下本人的公众号:测试小哥进阶,TesterHome 会不定时的更新。哈哈~ 对了,最近想建个学习的测试群,有好的资源可以分享、有问题也可以在群里提问、也可以互相监督学习,欢迎软件测试的各位小伙伴的加入!公众号二维码和群二维码会放在评论区

共收到 0 条回复 时间 点赞
2楼 已删除
1楼 已删除
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册