一文解读文件上传漏洞

一、简介:

1.1、文件上传概念:

​ 文件上传这件事本身并没有问题,当网站没有对上传的文件进行处理,解释直接存放在可猜解目录下,攻击者就可以通过上传一个恶意文件,然后访问该恶意文件进行任意操作。

1.2、WebShell概念:

​ WebShell是一个网页后门,是以php,jsp,asp等网页文件形式存在的一种命令执行环境

​ 如php一句话木马

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

​ 攻击者通过上传一个php文件木马,攻击者通过POST请求上传cmd可以执行eval()函数下的任何操作

1.3、文件上传漏洞流程:

​ 攻击者在一个网站发现文件上传漏洞点后,上传一些恶意文件,将这些jsp或者php后门上传至网站服务器,将这些后门与网站正常网站文件混在一起去,然后获取网站文件存储路径进行访问恶意文件,得到命令执行环境,以达到控制网站服务器的目的(可以上传下载或者修改文件,操作数据库,执行任意命令等)。

1.4、文件上传漏洞产生原因:

  • ​ 对于上传文件的后缀名(扩展名)没有做较为严格的限制

  • ​ 对于上传文件的MIMETYPE(用于描述文件的类型的一种表述方法) 没有做检查

  • ​ 服务器配置不当,当服务器配置不当,在不需要上传页面的情况下便可导致任意文件上传,如开启HTTP PUT方法;

  • ​ 对于web server对于上传文件或者指定目录的行为没有做限制

  • ​ 文本文件上传限制被绕过,比如客户端做了限制,但服务器没有做,只要修改数据包即可绕过

  • ​ 文件解析漏洞导致文件执行存在此漏洞时,即使合法的文件名,但文件名中的恶意代码也有可能被执行。

  • ​ 文件路径截断

    1.5、文件上传漏洞判断:

二、文件上传常见绕过方式:

2.1:前端校验文件绕过

2.1.1:前端js代码校验后缀:

image-20230829104646423

绕过方式:

​ 1:修改文件文件后缀名,burp代理修改文件后缀名进行上传。

​ 2:禁用页面js。

​ 改包:

image-20230829105809250

​ 上传成功并存在文件保存路径:

image-20230829105918850

2.2、后端校验文件绕过:

​ 在文件被上传到服务端的时候,对文件名的扩展名,MIME type等信息进行检查,如果不合法,则拒绝这次上传并返回。

2.2.1、检查后缀:
2.2.1.1、黑名单:

​ 查看源码,发现黑名单禁用常见后缀

image-20230829113404823

​ 修改php后缀为phtml,php5等后缀绕过黑名单

(1)常见后缀绕过:

PHP:	php2,php3,php5,phtml,pht
JSP:	jsp,jspx,jspf
ASP:	asa,cer,cdx
ASPX:	ascx,ashx,asac

(2).htaccess绕过:

​ .htaccess文件(或者"分布式配置文件"),全称是Hypertext Access(超文本入口)。提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。管理员可以通过Apache的AllowOverride指令来设置。

​ 利用原理:

<FilesMatch "evil.gif">
SetHandler application/x-httpd-php   #在当前目录下,如果匹配到evil.gif文件,则被解析成PHP代码执行
AddHandler php5-script .gif          #在当前目录下,如果匹配到evil.gif文件,则被解析成PHP代码执行
</FilesMatch>

​ 利用方式:上传覆盖.htaccess文件,重写解析规则,将上传的带有脚本马的图片以脚本方式解析

2.2.1.2、白名单:

(1)MIME绕过(Content-Type):

​ MIME (Multipurpose Internet Mail Extensions) 是描述消息内容类型的标准,用来表示文档、文件或字节流的性质和格式。

​ MIME 消息能包含文本、图像、音频、视频以及其他应用程序专用的数据。

以text开头的媒体格式类型:

text/html: HTML格式。

text/plain:纯文本格式。

text/xml: XML格式。

以image开头的媒体格式类型:

image/gif:gif图片格式。

image/jpeg:jpg图片格式。

image/png:png图片格式。

以application开头的媒体格式类型:

application/xhtml+xml:XHTML格式。

application/xml: XML数据格式。

application/atom+xml:Atom XML聚合格式 。

application/json: JSON数据格式。

application/pdf:pdf格式 。

application/msword: Word文档格式。

application/octet-stream: 二进制流数据(如常见的文件下载)。

application/x-www-form-urlencoded: 中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)。

上传文件时类型:

multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式。

有些网站会校验文件的MIME形式是否与文件后缀相符,如果单一抓包修改文件后缀不修改MIME类型仍旧会上传文件失败。

image-20230829120628481

(2)%00截断:

​ %00截断是操作系统层的漏洞,由于操作系统是C语言或汇编语言编写的,这两种语言在定义字符串时,都是以\0(即0x00)作为字符串的结尾。操作系统在识别字符串时,当读取到\0字符时,就认为读取到了一个字符串的结束符号。因此,我们可以通过修改数据包,插入\0字符的方式,达到字符串截断的目的。00截断通常用来绕过web软waf的白名单限制
条件:

  • php版本小于5.3.29

  • magic_quotes_gpc = Off

    image-20230829123233673

2.2.2、检查内容:

​ 二次渲染绕过:

2.2.3、代码逻辑:

​ 条件竞争

三、文件上传常见防御措施:

  1. 上传文件的存储位置与服务器分离;
  2. 上传的文件重新修改文件名文件后缀名;(如何确定后缀名防止修改:前端传递,后端再校验)
  3. 文件上传的上传保存路径根据业务进行分离;下载时根据重新生成的文件名进行下载;
  4. 文件上传的目录设置为不可执行。只要web容器无法解析该目录下面的文件,即使攻击者上传了脚本文件,服务器本身也不会受到影响
  5. 判断文件类型。在判断文件类型时,可以结合使用MIME Type、后缀检查等方式。在文件类型检查中,最好推荐白名单方式,黑名单方式存在很大的风险被绕过。
  6. 单独设置文件服务器的域名。由于浏览器同源策略的关系,一系列客户端攻击将失效,比如上传crossdomain.xml、上传包含Javascript的XSS利用等问题将得到解决

参考资料:

文件上传绕过各种姿势_ChengggNo1的博客-CSDN博客

文件上传漏洞总结(含原因+防御措施)+白名单+黑名单+内容、头+解析漏洞/修补方案_南部余额的博客-CSDN博客

posted @ 2023-08-29 13:01  2xixi3  阅读(137)  评论(0编辑  收藏  举报