【Web安全】文件上传漏洞

news/2024/11/28 3:29:41/

目录

1. 文件上传漏洞概述

1.1 FCKEditor文件上传漏洞

1.2 绕过文件上传检查功能

2. 功能还是漏洞

2.1 Apache文件解析

2.2 IIS文件解析

2.3 PHP CGI路径解析

2.4 利用上传文件钓鱼

 3. 设计安全的文件上传功能


1. 文件上传漏洞概述

文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务端命令的能力。

应用:例如上传一张图片、分享一段视频、论坛发帖时附带附件、发邮件时附带附件……

文件上传后导致的安全问题一般有:

  • 上传文件是Web脚本语言,服务器的Web容器解释并执行了用户上传的脚本,导致代码执行
  • 上传文件时Flash的策略文件crossdomain.xml,黑客用以控制Flash在该域下的行为
  • 上传文件时病毒、木马文件,黑客诱骗用户下载执行
  • 上传文件是钓鱼图片或为包含了脚本的图片,在某些版本的浏览器中会被作为脚本执行,被用于钓鱼和欺诈
  • 将上传文件作为一个入口,溢出服务器的后台处理程序,如图片解析模块
  • 上传一个合法的文本文件,其内容包含PHP脚本,再通过本地文件包含漏洞执行该脚本
  • ……

要实现webshell,要满足以下几个条件:

  1. 上传的文件能被Web容器解释执行,文件上传后的目录是Web容器所覆盖到的路径
  2. 用户能从Web上访问这个文件
  3. 文件不会被安全检查、格式化、图片压缩等功能改变内容而导致攻击不成功

1.1 FCKEditor文件上传漏洞

FCKEditor是一款非常流行的富文本编辑器,其上传文件的功能能将用户上传的文件保存在/UserFiles/all/目录下

在有漏洞的版本中,通过黑名单来确认文件的安全性

以上述黑名单为例,当我们上传后缀为php2、php4、inc、pwml、asa、cer等文件时就能绕过

1.2 绕过文件上传检查功能

  • %00截断

在 C、PHP等语言的常用字符串处理函数中,0x00被认为是终止符,因此在文件名后添加一个%00字节,可以截断某些函数对文件名的判断

例如只允许上传JPG图片,可以构造文件名xxx.php[\0].JPG,其中[\0]为十六进制的0x00字符,.JPG绕过了应用的上传文件类型判断,但对于服务器端来说,此文件因为0x00字符截断,会变成xxx.php

  • 伪造文件头

有的应用会通过文件头验证文件类型

 常见的攻击技巧是伪造一个合法的文件头,将真实的PHP等脚本代码附在文件头之后

但仍需要通过PHP来解释此图片文件才行,若上传的文件后缀是JPG,则Web Server可能会将此文件当作静态文件解析,不会调用PHP解释器,也就无法进行攻击 

2. 功能还是漏洞

2.1 Apache文件解析

Apache对于文件名的解析是从后往前解析的,直至遇见一个Apache认识的文件类型为止

例如:

phpshell.php.rar.rar.rar.rar.rar

Apache不认识.rar文件类型,会一直遍历到.php,认为这是一个PHP类型的文件

黑客就可以利用该特性绕过对后缀名的限制,实现php脚本的执行

(在Apache的mime.types文件中定义了它所认识的文件)

2.2 IIS文件解析

  • 分号“;”是截断字符

当文件名为abc.asp;xx.jpg时,IIS 6 会将此文件解析为abc.asp,从而导致脚本被执行

  • 曾经出现过因处理文件夹扩展名出错,导致将/*.asp/目录下的所有文件都作为ASP文件进行解析
  • PUT方法允许用户上传文件到指定目录下,结合MOVE方法可以将原本只允许上传文本文件改写为脚本文件,从而执行webshell

2.3 PHP CGI路径解析

Nginx作为代理把请求转发给fastcgi Server,PHP在后端处理。(使用Nginx作为Web Server时,一般使用fastcgi的方式调用脚本解释器。)

当访问

http://www.xxx.com/path/test.jpg/notexist.php

时,会将test.jpg当作PHP解析。notexist.php是不存在的文件。

如果在任何配置为 fastcgi的PHP应用里上传文件,其内容是PHP文件,则将导致代码执行。

原因:

PHP的配置文件中 cgi.fix_pathinfo=1默认开启

在上面的例子中,PATH_INFO=notexist.php,因为notexist.php不存在,会往前递归查询路径确认文件的合法性。此时SCRIPT_FILENAME检查文件是否存在,其值为/path/test.jpg,而此时PATH_INFO还是notexist.php,在最终执行时,test.jpg会被当作PHP解析。

2.4 利用上传文件钓鱼

利用文件上传功能,钓鱼者可以先将包含了HTML的文件(例如一张图片)上传到目标网站,然后通过传播这个文件的URL进行钓鱼,该URL中不会出现钓鱼地址。

 png是伪造的文件头绕过上传时的文件类型检查,后面的脚本控制浏览器跳向指定的钓鱼网站,骗子在传播钓鱼网站时,只需要传播合法图片的URL

 

 3. 设计安全的文件上传功能

  • 文件上传的目录设置为不可执行
  • 判断文件类型时可以结合MIME Type、后缀检查等方式,使用白名单
  • 对于图片的处理使用压缩函数或resize函数,在处理图片的同时破坏其中可能包含的HTML代码
  • 使用随机数改写文件名和文件路径
  • 单独设置文件服务器的域名

http://www.ppmy.cn/news/1710.html

相关文章

【gbase8a】docker搭建gbase8a,详细【图文】

docker搭建gbase8a安装docker安装GBase 8a查询安装的版本拉取镜像启动进入容器创建用户dbever测试安装docker 其中具有docker的搭建 搭建docker,docker搭建达梦数据库,详细【图文】 https://blog.csdn.net/weixin_44385419/article/details/127738868 d…

(十三) 共享模型之无锁【字段更新器、原子累加器、Unsafe】

一、字段更新器(P175) J.U.C 并发包提供了: AtomicReferenceFieldUpdater // 域 字段 AtomicIntegerFieldUpdater AtomicLongFieldUpdater 利用字段更新器,可以针对对象的某个域(Field)进行原子操作&#x…

计算机毕业设计Java基本web蓝桥杯名师工作室(源码+系统+mysql数据库+lw文档)

计算机毕业设计Java基本web蓝桥杯名师工作室(源码系统mysql数据库lw文档) 计算机毕业设计Java基本web蓝桥杯名师工作室(源码系统mysql数据库lw文档)本源码技术栈: 项目架构:B/S架构 开发语言:Java语言 开发软件:idea eclipse …

[附源码]Python计算机毕业设计SSM竞赛报名管理系统(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

用html做一个漂亮的网站【茶文化12页】期末网页制作 HTML+CSS网页设计实例 企业文化网站制作

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

Python中的全局变量与命名法

--------------------------------------------------------------------------------------------------------------------------------- 在本文章中,我们来讨论一下python中的全局变量,我们将学习如何定义全局变量,然后如何在函数中访问它…

多线程初阶(二)

目录 前言: synchronized 解析 可重入和不可重入问题 解析 Java中线程安全类 死锁问题 解析 解决死锁问题 解析 内存可见性 解析 volatile关键字 解析 wait,notify 解析 小结: 前言: 针对上篇文章讲到的线程安全…

【数据结构】二分搜索树

目录 一、二分搜索树 1.1什么是二分搜索树 1.2创建一个二分搜索树 (1)二分搜索树的内部构建 (2)插入操作 (3)判断一个val值是否存在 (4)按照节点的深度先序遍历打印BST &#…