在网安领域,文件上传漏洞是Web和移动应用程序中最常见的漏洞之一,在大多数网站中几乎都有文件上传功能,它允许攻击者上传恶意文件到服务器,可能导致远程代码执行、数据泄露等严重后果。本文将详细介绍Web文件上传漏洞的攻击方法以及防御策略,旨在帮助网络安全从业者和爱好者加深对这一领域的理解。
特此声明: 本文章仅用于信息安全教学,请遵守相关法律法规,严禁用于非法途径。若阅读者因此作出任何危害网络安全的行为,后果自负,与UP主无关。遵纪守法做一个良好公民,切勿违法国家计算机安全法,以免牢底坐穿。
本文章将详细讲解文件上传漏洞的完整流程, 内容包含有:
文件上传漏洞(File upload attack)是web应用站点中允许用户上传图片、视频、文件资源到网站服务器中, 网站返回一个可以展示的链接到客户端.攻击者将编写一些恶意文件上传到网站服务器中, 从而对网站服务器进行恶意攻击、控制服务器以及盗取数据等等, 且难以排查出漏洞的文件. 这是一个比较严重的漏洞. 造成的影响大.
玩过dnf的不知道是否有过这样的经历, 在拍卖行发现便宜的装备购买时, 对方联系你让你加他. 以给你看装备等理由发一个图片给你, 你打开后,电脑就被对方控制进行交易所有金币等装备给到对方了.
这就是一个典型文件上传的案例, 我就是这个案例, 还好当初年轻手速快,立马关机.
在对一个文件上传漏洞攻击的流程为: 识别网站框架->制作攻击文件->漏洞将恶意文件上传->文件利用.
接下来我们根据演示整个文件上传漏洞流程, 我搭建了一个网站,以这个网站为靶机进行文件上传漏洞介绍
就如电脑木马一样, mac木马和win木马是不同的写法, 因此我们必须知道网站的框架,从而写对应的恶意攻击文件.
我们可以通过网站后缀识别网站使用的是什么语言, 例如后缀为: .php 的语言为php, asp的为asp语言, html 可能也是php语言, 如果你不清楚这些后缀对应的语言,可以复制这些后缀问问度娘,
当让并非所有后缀都是真的, 开发者可能会根据网站需求做个伪静态或为后缀进行伪装.
伪静态: 通常将服务器语言伪装成html后缀, 便于seo优化等等.
例如我们网站的后缀就没做处理,从后缀可以看出,是php开发的网站
如果无法识别或网站隐藏后缀,我们可以尝试使用 浏览器扩展:Wappalyzer 插件
进行指纹识别网站框架, 这个扩展可在火狐、谷歌中扩展插件市场中下载.
我们也可以打开浏览器f12查看网络响应内容也会得到一些网站指纹信息,例如这里返回了web服务器是nginx, 有的网站会返回服务端语言,
还有很多指纹工具, 在文章结尾会列出相关工具, 这里就单介绍一个常用的工具
当我们已经了解到网站框架时,我们就可以上传相同扩展名的文件进行文件上传漏洞测试了, 例如发现服务端语言是php, 那么我们可以测试上传一个php语言文件到服务端, 如果上传成功, 说明存在文件上传漏洞,我们就可以对该漏洞进行利用,
当我们发现漏洞时, 我们可以开始编写执行文件(小马),
通常, 文件上传攻击就和打电话一样, 我们打电话给别人时必须输入手机号码,然后进行拨号,告知对方.
小马通常为:接收方,大马为拨打方.
我们必须要上传一个木马作为接受方提供给我们交互的通道. 然后通过大马进行交互操作.
小马网上有很多种写法,在github上也有, 大家可自行去挖掘,这边展示几个作为例子,例如php, 我们可以在使用前辈写好的:phpbash
将这个文件上传到服务端访问就可以输入linux命令进行交互了. 这个小马的特别处在于,它不用大马控制了,它提供了一个交互页面, 可以直接在小马中控制服务端.
如果因程序原因无法上传这个文件或这个文件并不满足你的需求,我们可以自己写一个,当然网上有很多优秀的写法, 这里简单的解释一下
例如,对于PHP Web应用程序,我们可以使用system()函数来执行系统命令并打印其输出,并使用$_REQUEST['cmd']传递cmd参数,如下所示:
<?php system($_REQUEST['cmd']); ?>
// system() 函数 是php语言和服务器进行交互的一个方法, 可以通过参数允许linux命令
// $_REQUEST['cmd'] 是路径的参数, 例如我们上传后链接是: xxx/uploads/shell.php 通过访问xxx/uploads/shell.php?cmd=id 进行linux交互,
// 正如上方的例子, 拨打电话必须要输入对方手机号码, 这个 “cmd” 就是: “电话号码”
我们就先从phpbash尝试上传看看, 我们吧 phpbash.php 文件上传到头像中,
发现上传成功了:
我们拿这个链接去访问发现恶意文件能正常运行了:
然后我们就可以输入linux命令去控制着台电脑了, 这就是一个基本的文件上传漏洞流程, 但我们会发现这个示例在现实世界中,基本灭绝了, 开发者不会啥也不验证直接给你上传, 只有实习生开发者会写出这样的代码.
网安人员和开发者是两个斗智斗勇的敌对关系, 开发者通常都会做一些安全认证、比如文件白名单、黑名单、文件类型控制、过滤器等等对文件进行控制.
如何去绕过开发者做的这些验证和过滤器呢, 下面介绍一些方法, 可以参考一下.
很多网站程序因为老板要求:快!快!快!, 因此要快速上线, 一般后台都不做任何验证,而由前端进行验证所选文件.
然而,由于文件格式验证正在客户端进行,我们可以通过直接抓包来轻松绕过它,完全跳过前端验证。
我们还可以通过浏览器的开发工具修改前端代码,以禁用任何有效的验证。
简单的说下, 如何判断是否是前端过滤器, 可在上传时查看网络是否有新增一条网络记录,如没有,那么就是前端过滤器
我们打开f12查看源代码, 定位上传按钮,我们发现这个按钮有一些参数:
我们不必知道这些参数全部代表什么意思,我们已经知道时这个元素控制上传的, 那么我们到源代码中搜索错误描述,看看这个按钮执行的逻辑是什么:
我们搜索到,这个元素执行前会进行验证文件格式,根据参数:options.accept 这个参数进行判断文件类型的, 那只要我们修改这个参数为 file 格式就可以绕过这个验证了. 这个在哪里改呢?
正如上面定位元素节点时,我们发现了元素的属性: lay-data="{....}" 大概率这个就是配置了,我们编辑一下, 增加 options.accept 参数:
保存后,我们重新上传恶意文件试试:
这次成功上传了.
在上一节中,我们看到了一个Web应用程序的示例,该应用程序仅在前端(即客户端)上应用类型验证控件,这使得绕过这些控件变得微不足道。这就是为什么总是建议在后端服务器上实施所有与安全相关的控制,攻击者无法直接操作它。
尽管如此,如果后端服务器上的类型验证控件没有安全编码,攻击者可以利用多种技术来绕过它们并访问PHP文件上传。
5.2.1 文件扩展名验证绕过
经过前面被轻易的上传恶意文件, 小白已经加固了安全验证,这次小白在服务端加上了限制文件扩展名策略
这难不倒我们, 我们分析下小白的代码:
$blacklist = ['php', 'php7', 'phps']; if (in_array($nameArr[$num], $blacklist)) { return $this->errorType=2;//文件类型不符 }
从代码看到, 小白控制了php, php7, phps 后缀的都不能上传.
我们发现,这种验证方法有一个重大缺陷,因为许多其他扩展不包括在此列表中,如果上传,这些扩展仍然可用于在后端服务器上执行PHP代码。
同时,
上述比较也区分大小写,仅考虑小写扩展。在Windows服务器中,文件名不区分大小写,因此我们可以尝试上传带有混合大小写(例如pHp)的php,这也可能绕过黑名单,并且仍然应该作为PHP