揭秘:如何攻破Web文件上传漏洞并巧妙绕过安全策略?
2024-10-14 18:21:54 Author: www.freebuf.com(查看原文) 阅读量:9 收藏

前言

在网安领域,文件上传漏洞是Web和移动应用程序中最常见的漏洞之一,在大多数网站中几乎都有文件上传功能,它允许攻击者上传恶意文件到服务器,可能导致远程代码执行、数据泄露等严重后果。本文将详细介绍Web文件上传漏洞的攻击方法以及防御策略,旨在帮助网络安全从业者和爱好者加深对这一领域的理解。

1728640948_6708f7b415dbfc99ae84a.png!small?1728640949125

特此声明: 本文章仅用于信息安全教学,请遵守相关法律法规,严禁用于非法途径。若阅读者因此作出任何危害网络安全的行为,后果自负,与UP主无关。遵纪守法做一个良好公民,切勿违法国家计算机安全法,以免牢底坐穿。

目录

本文章将详细讲解文件上传漏洞的完整流程, 内容包含有:

  • 文件漏洞生命周期
  • 1,识别网站框架
  • 2.漏洞发现
  • 3.制作/利用一句话小马
  • 4.文件漏洞深透测试
  • 5.绕过文件上传过滤器
    • 前端过滤器 
    • 黑名单绕过
    • 白名单绕过
    • 文件扩展名绕过
    • 双重后缀名绕过
    • 反向后缀名绕过
    • 字符注入绕过
    • 内容类型过滤器绕过
    • mime类型过滤器绕过
  • 其他类型文件上传攻击
    • xss 文件上传攻击
    • xxe 文件上传攻击
    • Dos 文件上传攻击
    • 文件名中的注射上传攻击
    • 上传目录报漏
    • window 特定文件上传攻击
    • 高级文件上传攻击
  • 如何预防上传漏洞
    • 扩展名验证
    • 文件内容验证
    • 上传目录隐藏
    • 进一步安全策略

简介

文件上传漏洞(File upload attack)是web应用站点中允许用户上传图片、视频、文件资源到网站服务器中, 网站返回一个可以展示的链接到客户端.攻击者将编写一些恶意文件上传到网站服务器中, 从而对网站服务器进行恶意攻击、控制服务器以及盗取数据等等, 且难以排查出漏洞的文件. 这是一个比较严重的漏洞. 造成的影响大.

玩过dnf的不知道是否有过这样的经历, 在拍卖行发现便宜的装备购买时, 对方联系你让你加他. 以给你看装备等理由发一个图片给你, 你打开后,电脑就被对方控制进行交易所有金币等装备给到对方了.

这就是一个典型文件上传的案例, 我就是这个案例, 还好当初年轻手速快,立马关机.

生命周期

在对一个文件上传漏洞攻击的流程为: 识别网站框架->制作攻击文件->漏洞将恶意文件上传->文件利用.

1728640190_6708f4be818cf4ec0e5f6.png!small?1728640190936

接下来我们根据演示整个文件上传漏洞流程, 我搭建了一个网站,以这个网站为靶机进行文件上传漏洞介绍

1728641089_6708f8412d1d27c3d74bc.png!small?1728641090585

1.识别网站框架

就如电脑木马一样, mac木马和win木马是不同的写法, 因此我们必须知道网站的框架,从而写对应的恶意攻击文件.

1.1 查看网站路径后缀识别

我们可以通过网站后缀识别网站使用的是什么语言, 例如后缀为: .php 的语言为php, asp的为asp语言, html 可能也是php语言, 如果你不清楚这些后缀对应的语言,可以复制这些后缀问问度娘,

当让并非所有后缀都是真的, 开发者可能会根据网站需求做个伪静态或为后缀进行伪装.

伪静态: 通常将服务器语言伪装成html后缀, 便于seo优化等等.

例如我们网站的后缀就没做处理,从后缀可以看出,是php开发的网站

1728641202_6708f8b288c5f9edaa323.png!small?1728641203795

1.2 使用Wappalyzer扩展

如果无法识别或网站隐藏后缀,我们可以尝试使用 浏览器扩展:Wappalyzer 插件

进行指纹识别网站框架, 这个扩展可在火狐、谷歌中扩展插件市场中下载.

1728639422_6708f1be35bdc9f5005d3.png!small?1728639422857

1.3 通过响应体

我们也可以打开浏览器f12查看网络响应内容也会得到一些网站指纹信息,例如这里返回了web服务器是nginx, 有的网站会返回服务端语言,

1728641335_6708f93768e7ba1f8e4df.png!small?1728641335982

1.4 更多网站指纹工具

还有很多指纹工具, 在文章结尾会列出相关工具, 这里就单介绍一个常用的工具

2.漏洞发现

当我们已经了解到网站框架时,我们就可以上传相同扩展名的文件进行文件上传漏洞测试了, 例如发现服务端语言是php, 那么我们可以测试上传一个php语言文件到服务端, 如果上传成功, 说明存在文件上传漏洞,我们就可以对该漏洞进行利用,

1728639766_6708f316bc07a109e23da.png!small?1728639767593

3.漏洞利用-制作/利用小马

当我们发现漏洞时, 我们可以开始编写执行文件(小马),

通常, 文件上传攻击就和打电话一样, 我们打电话给别人时必须输入手机号码,然后进行拨号,告知对方.

小马通常为:接收方,大马为拨打方.

我们必须要上传一个木马作为接受方提供给我们交互的通道. 然后通过大马进行交互操作.

小马网上有很多种写法,在github上也有, 大家可自行去挖掘,这边展示几个作为例子,例如php, 我们可以在使用前辈写好的:phpbash

将这个文件上传到服务端访问就可以输入linux命令进行交互了. 这个小马的特别处在于,它不用大马控制了,它提供了一个交互页面, 可以直接在小马中控制服务端.

1728641383_6708f967efd3d62b61d2d.png!small?1728641386190

3.1 制作一句话木马

如果因程序原因无法上传这个文件或这个文件并不满足你的需求,我们可以自己写一个,当然网上有很多优秀的写法, 这里简单的解释一下

例如,对于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” 就是: “电话号码”

1728381890_670503c27215c9dc5863a.png!small?1728381891391

4.文件上传漏洞渗透测试

我们就先从phpbash尝试上传看看, 我们吧 phpbash.php 文件上传到头像中,

1728721060_670a30a4c0d67f1fa0474.png!small?1728721067107

发现上传成功了:

1728721128_670a30e802f559e7a69d5.png!small?1728721128752

我们拿这个链接去访问发现恶意文件能正常运行了:

1728721196_670a312cd4f3c7e08d644.png!small?1728721197778

然后我们就可以输入linux命令去控制着台电脑了, 这就是一个基本的文件上传漏洞流程, 但我们会发现这个示例在现实世界中,基本灭绝了, 开发者不会啥也不验证直接给你上传,  只有实习生开发者会写出这样的代码.

5.绕过过滤器

网安人员和开发者是两个斗智斗勇的敌对关系, 开发者通常都会做一些安全认证、比如文件白名单、黑名单、文件类型控制、过滤器等等对文件进行控制.

如何去绕过开发者做的这些验证和过滤器呢, 下面介绍一些方法, 可以参考一下.

5.1 前端过滤器

很多网站程序因为老板要求:快!快!快!, 因此要快速上线, 一般后台都不做任何验证,而由前端进行验证所选文件.

然而,由于文件格式验证正在客户端进行,我们可以通过直接抓包来轻松绕过它,完全跳过前端验证。

我们还可以通过浏览器的开发工具修改前端代码,以禁用任何有效的验证。

1728721740_670a334cc3396b733ffbf.png!small?1728721741272

简单的说下, 如何判断是否是前端过滤器, 可在上传时查看网络是否有新增一条网络记录,如没有,那么就是前端过滤器

我们打开f12查看源代码, 定位上传按钮,我们发现这个按钮有一些参数:

1728722124_670a34cccc27bda283e3a.png!small?1728722126649

我们不必知道这些参数全部代表什么意思,我们已经知道时这个元素控制上传的, 那么我们到源代码中搜索错误描述,看看这个按钮执行的逻辑是什么:

1728722056_670a3488b9cf9db7cc7df.png!small?1728722058964

我们搜索到,这个元素执行前会进行验证文件格式,根据参数:options.accept 这个参数进行判断文件类型的, 那只要我们修改这个参数为 file 格式就可以绕过这个验证了. 这个在哪里改呢?

正如上面定位元素节点时,我们发现了元素的属性: lay-data="{....}" 大概率这个就是配置了,我们编辑一下, 增加 options.accept 参数:

1728722368_670a35c0c741af2a99539.png!small?1728722369547

保存后,我们重新上传恶意文件试试:

1728722399_670a35dfae7fa6165241e.png!small?1728722400674

这次成功上传了.

5.2 黑名单绕过

在上一节中,我们看到了一个Web应用程序的示例,该应用程序仅在前端(即客户端)上应用类型验证控件,这使得绕过这些控件变得微不足道。这就是为什么总是建议在后端服务器上实施所有与安全相关的控制,攻击者无法直接操作它。

尽管如此,如果后端服务器上的类型验证控件没有安全编码,攻击者可以利用多种技术来绕过它们并访问PHP文件上传。

5.2.1 文件扩展名验证绕过

经过前面被轻易的上传恶意文件, 小白已经加固了安全验证,这次小白在服务端加上了限制文件扩展名策略

1728722767_670a374f209675a4dbf99.png!small?1728722768536

这难不倒我们,  我们分析下小白的代码:

$blacklist = ['php', 'php7', 'phps'];
if (in_array($nameArr[$num], $blacklist)) {
   return $this->errorType=2;//文件类型不符
}

从代码看到, 小白控制了php, php7, phps 后缀的都不能上传.

我们发现,这种验证方法有一个重大缺陷,因为许多其他扩展不包括在此列表中,如果上传,这些扩展仍然可用于在后端服务器上执行PHP代码。

同时,

上述比较也区分大小写,仅考虑小写扩展。在Windows服务器中,文件名不区分大小写,因此我们可以尝试上传带有混合大小写(例如pHp​)的php​,这也可能绕过黑名单,并且仍然应该作为PHP


文章来源: https://www.freebuf.com/vuls/412816.html
如有侵权请联系:admin#unsafe.sh