0


文件上传漏洞详解

1.什么是文件上传漏洞

文件上传漏洞是指由于程序员在对用户文件上传部分的控制不足或者处理缺陷,而导致的用户可以越过其本身权限向服务器上上传可执行的动态脚本文件。这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等。这种攻击方式是最为直接和有效的,“文件上传”本身没有问题,有问题的是文件上传后,服务器怎么处理、解析文件。文件上传功能在web应用系统很常见,比如很多网站注册的时候需要上传头像、上传附件等等。当用户点击上传按钮后,后台会对上传的文件进行判断, 比如是否是指定的类型、后缀名、大小等等,然后将其按照设计的格式进行重命名后存储在指定的目录。 如果说后台对上传的文件没有进行任何的安全判断或者判断条件不够严谨,则攻击着可能会上传一些恶意的文件,比如一句话木马,从而导致后台服务器被webshell!

2.Webshell简介

webshell就是以asp、php、jsp或者cgi等网页文件形式存在的一种代码执行环境,也可以将其称做为一种网页后门。黑客在入侵了一个网站后,通常会将asp或php后门文件与网站服务器WEB目录下正常的网页文件混在一起,然后就可以使用浏览器来访问asp或者php后门,得到一个命令执行环境,以达到控制网站服务器的目的。

通俗来讲,Webshell是黑客经常使用的一种恶意脚本,其目的是获得对服务器的执行操作权限,比如执行系统命令、窃取用户数据、删除web页面、修改主页等,其危害不言而喻。黑客通常利用常见的漏洞,如SQL注入、远程文件包含(RFI)、FTP,甚至使用跨站点脚本攻击(XSS)等方式作为社会工程攻击的一部分,最终达到控制网站服务器的目的。

3.文件上传漏洞原理

1.文件上传漏洞是指用户上传了一个可执行的脚本文件(php、jsp、xml、cer等文件),而WEB系统没有进行检测或逻辑做的不够安全。

2.文件上传功能本身没有问题,问题在于上传后如何处理及解释文件。

3.一般情况下,Web应用都会允许用户上传一些文件,如头像、附件等信息,如果Web应用没有对用户上传的文件进行有效的检查过滤,那么恶意用户就会上传一句话木马等Webshell,从而达到控制Web网站的目的。

4.存在文件上传功能的地方都有可能存在文件上传漏洞,比如相册、头像上传,视频、照片分享。论坛发帖和邮箱等可以上传附件的地方也是上传漏阔的高危地带,另外像文件管理器这样的功能也有可能被攻击者所利用。

5.这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等

4.文件上传漏洞攻击详解

<1.前端检测

<1.1原理
在点击上传文件时,游览器还没有向服务器发送请求前对本地上传文件进行的检测,这种检测主要是通过JS代码来检测文件的扩展名是否符合上传要求,并且这种检测可有可无,因为检测代码在用户游览器上运行,非常容易绕过!

<1.2绕过方法

  • <1.2.1 删除或禁用JS检测代码 删除JS代码必须得能认识JS检测代码,不然怎么删?另外,这种办法不稳定!
  • <1.2.2 抓包改后缀名(最稳妥的方法)

<1.3攻击方法
先在php文件中写入一句话木马,例如:

<?phpeval($_REQUEST[666])?>

接着使用BURP抓包将文件后缀改为.php格式上传!
在这里插入图片描述
<2.黑名单机制
<2.1原理
将危险后缀名写入数组或文件中,当上传文件在黑名单中,则不允许上传!

<2.2绕过方法

  • 尝试修改后缀名 比如:黑名单中有.php/.jsp/.asp/.aspx等 可以抓包修改成jspf/asa/cer/php3~5/phtml/exee等;在默认情况下,这些都可以被解析为jsp/php格式!
  • 大小写绕过 我们可以通过后缀名大小写的方式绕过,除非非常老的Web容器版本会对后缀名大小写有检测,不然都不会区分大小写。 比如:要上传.php文件可以抓包修改为.pHp/.PHp等双写绕过 对于一些检测到你上传的文件名带有危险字符时,他会自动替换成空。 例如:会将php替换成空,我们可以抓包把后缀名改成pphphp!
  • 后缀点空绕过 我们在windows电脑上创建文件时,如果在文件名末尾加上 .或者是空格,它都是会自动忽略或者是删除,在文件上传时也是一样,但是在黑名单中.或者是空格则不会被忽略。 比如:上传.php文件抓包在后面加上点或空格,即可上传! 这里有个循环检测机制,黑名单中会循环检测文件末尾的点和空格,可以抓包加上 (‘.空格.’)或者是(‘空格.空格’)来绕过。windows文件流绕过 通俗的理解,就是其它文件可以”寄宿“在某一个文件里,而在资源管理器中却只能看到宿主文件!例如:在这里插入图片描述在这里插入图片描述 只有查看文件流才能知道2.txt! 所以利用这一特性,在上传文件后面加上::DATA即可绕过!
  • 解析漏洞 IIS6.0解析漏洞,实际上是IIS6.0的一些特性导致的;
IIS6.0 =&gt; windows server 2003 的全版本都默认安装自带IIS6.0(ASP)
.asp 会被当作asp文件处理
.jpg 会被当作jpg文件处理
   =&gt; 后缀调用的文件
asa cdx cer 都会当作asp执行(微软认为不是漏洞,是特殊的默认配置)
IIS6.0在处理含有特殊符号的文件路径时会出现逻辑漏洞
   例如:特殊符号影响:test.asp;.jpg   test.asp/123.jpg 
CGI解析漏洞(PHP和Web容器的通信方法)  任何文件后面加/.php

我们只需上传一个asp的一句话木马

<%eval request("cmd")%>

< 3.白名单机制
< 3.1原理
与黑名单机制正好相反,只有在规定条件下才能运行!但是相对而言,白名单机制更加安全些!
< 3.2绕过方法
解析漏洞
.htaccess文件解析漏洞
什么是htaccess?
全称是Hypetext.Assccess(超文本入口) .htaccess也被称为分布式配置文件,提供了针对目录改变配置的方法,在特定的文档目录中放置一个包含一个或多个指令文件,以作用于此目录及其所有子目录!这个功能默认是不开启的!但是伪静态的站一般都会开启这个功能!

AddType application/x-httpd-php .jpg

这条指令是指.jpg文件会被当作php来解析!攻击时,在上传一句话木马时将文件名改为.jpg上传后,紧接着上传这个文件,.htaccess文件与一句话木马文件上传的先后顺序无影响!
我们直接是无法将文件命名为.htaccess的,这里得使用cmd来命名,在cmd中输入ren 1.txt .htaccess
在这里插入图片描述

%00截断与00截断
在很多网站你上传文件后,会自动重命名,但是当读取到0x00时会认为文件已经结束!
比如:上传一个1.php不行,但是可以1.php%00jpg,读取文件是从前往后的,当读取到%00时就会结束!解析文件是从后往前的,所以它会认为我们上传的文件是jpg格式!
%00实际上和00截断原理是一样的,只不过%00是经过URL编码的,解码之后就是0x00

当上传时碰到POST传参,因为POST传参是不会URL解码的,可以上传1.phpajpg用burp抓包后将a的HEX值改为00即可达到同样的效果!

<4.Content-Type方式绕过(MIME绕过)
<4.1原理
部分Web应用系统判定文件类型是通过content-type字段,黑客可以通过抓包,将content-type字段改为常见的图片类型。

<4.2常见的MIME类型

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文档)

<4.3绕过方法
用BURP抓包将Content-Type改为允许的类型,如image/gif,从而绕过校验!

<5.文件头检测
<5.1原理
在每一个文件(包括图片,视频或其他的非ASCII文件)的开头(十六进制表示)实际上都有一片区域来显示这个文件的实际用法,这就是文件头标志。我们可以通过16进制编辑器打开文件,添加服务器允许的文件头以绕过检测。
<5.2常见的文件头

GIF:47 49 46 38 39 61 
png:89 50 4E 47 0D 0A 1A 0A 
JPG:FF D8 FF E0 00 10 4A 46 49 46
PDF: 25 50 44 46 2D 31 2E
ZIP: 50 4B 03 04

<5.3绕过方法
在我们编写一句话木马时,在开头处加上上面的文件头,即可绕过!

<6.图片马绕过
<6.1原理
一般文件内容验证使用getimagesize函数检测,会判断文件是否是一个有效的文件图片,如果是,则允许上传,否则的话不允许上传。
<6.2制作流程

copy 1.jpg/b + 1.php/a 2.jpg
/b:指定以二进制格式复制、合并文件,用于图像或者声音类文件
/a:指定以ascii格式复制、合并文件用于txt等文本类文件

新建文件夹,在文件夹中准备一张图片,再准备一个写有一句话木马的.php文件,最后在cmd中输入上述命令,即可生成图片马!
为了应对对图片内容的检测,可以使用图+马+图的方式生成图片马,这种更加隐蔽一些
例如:

copy 1.jpg/b + 1.php/a 2.jpg  图+马
copy 2.jpg/b + 1.jpg/b 3.jpg  图片马+图

因为这种合成的图片马一般都在尾部,如果有检测就会失效,而图+马+图则可以有效避开尾部检测!
在这里插入图片描述

<7.二次渲染
<7.1原理
在我们上传文件后,网站会对图片进行二次处理(格式、尺寸要求等),服务器会把里面的内容进行替换更新,处理完成后,根据我们原有的图片生成一个新的图片并放到网站对应的标签进行显示。
<7.2绕过方法
可以上传带有一句话木马的gif动图,因为gif比jpg和png的属性要多一些,而且一些基础属性无法改变的,但是在gif中插入一句话木马时要注意插入点,一些插入点会破坏图片!在这里插入图片描述
在这里插入图片描述
还有可以配合条件竞争来绕过,因为二次渲染是先让你的图片上传,之后再检测!
<7.3如何判断是二次渲染
先上传一张正常图片,上传成功后下载到本地,利用16进制编辑器进行对比,看哪些数据被改变,哪些数据改变了!

<8.条件竞争
<8.1原理
条件竞争漏洞是一种服务器端的漏洞,由于服务器端在处理不同用户的请求时是并发进行的,因此,如果并发处理不当或相关操作逻辑顺序设计的不合理时,将会导致此类问题的发生。
<8.2绕过方法
利用图+马生成图片马的方式

file_put_contens('a.php','<?php eval($_REQUEST[666])?>')

在这里插入图片描述
意思是在他将源文件删除前在网站根目录生成一个a.php文件。

5.防御方法

<1.文件上传的目录设置为不可执行。只要web容器无法解析该目录下面的文件,即使攻击者上传了脚本文件,服务器本身也不会受到影响。

<2.判断文件类型。在判断文件类型时,可以结合使用MIME Type、后缀检查等方式。在文件类型检查中,强烈推荐白名单方式,黑名单的方式已经无数次被证明是不可靠的。此外,对于图片的处理,可以使用压缩函数或者resize函数,在处理图片的同时破坏图片中可能包含的HTML代码。

< 3.使用随机数改写文件名和文件路径。文件上传如果要执行代码,则需要用户能够访问到这个文件。在某些环境中,用户能上传,但不能访问。如果应用了随机数改写了文件名和路径,将极大地增加攻击的成本。再来就是像shell.php.rar.rar和crossdomain.xml这种文件,都将因为重命名而无法攻击。

<4.使用安全设备防御。文件上传攻击的本质就是将恶意文件或者脚本上传到服务器,专业的安全设备防御此类漏洞主要是通过对漏洞的上传利用行为和恶意文件的上传过程进行检测。恶意文件千变万化,隐藏手法也不断推陈出新,对普通的系统管理员来说可以通过部署安全设备来帮助防御,例如:图床。

补充

1.windows忽略大小写,Linux并不会忽略大小写,比如访问一个网站,将URL里面文件夹得名字改一个小写字母为大写,如果正常访问那一般是windows,如果访问出现问题一般是linux(快速检测不一定准),另外像文件后缀添加点空来绕过的也仅限于Windows!

2.00截断在高版本php是不存在的!

3.CGI解析漏洞在IIS7.0/7.5中也存在,实战中IIS7.X的比较多一些!

4.图片马制作时尽量选择小的图片,一般做了一个好马可以用很久的!

5.动态脚本语言不同,他们的一句话木马也是不一样的,可以上网搜,一大堆!

6.黑盒测试最重要的是试!!


参考文献

有关Webshell的讲解:https://blog.csdn.net/Anakin6174/article/details/115658654

标签: 安全 web安全

本文转载自: https://blog.csdn.net/Y22Lee/article/details/130097724
版权归原作者 Y22Lee 所有, 如有侵权,请联系我们删除。

“文件上传漏洞详解”的评论:

还没有评论