https://www.secpulse.com/archives/116338.html
1、漏洞简介
文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。常见场景是web服务器允许用户上传图片或者普通文本文件保存,而用户绕过上传机制上传恶意代码并执行从而控制服务器。显然这种漏洞是getshell最快最直接的方法之一,需要说明的是上传文件操作本身是没有问题的,问题在于文件上传到服务器后,服务器怎么处理和解释文件。
原理如下图所示:
2、漏洞危害
上传漏洞与SQL注入或者XSS相比,危害更大。
如果Web应用程序存在上传漏洞,攻击者上传的文件是Web脚本语言,服务器的Web容器解释并执行了用户上传的脚本,导致代码执行。
如果上传的文件是Flash的策略文件crossdomain.xml,那么攻击者就可以控制Flash在该域下的行为。
如果上传的文件是病毒、木马,攻击者可以诱骗用户或者管理员下载执行。
如果上传的文件是钓鱼图片或者包含了脚本的图片,在某些版本的浏览器中会被作为脚本执行,被用于钓鱼和欺诈。
如果上传的文件是webshell,那么攻击者就可以完全控制系统或致使系统瘫痪。
3、文件上传校验
3.1、客户端校验
这类检测通常在上传页面里含有专门检测文件上传的JavaScript代码,通过JavaScript来校验上传文件的后缀是否合法。可以采用白名单,也可以采用黑名单的方式。
判断方式:在浏览加载文件,但还未点击上传按钮时便弹出对话框,内容如:只允许上传.jpg / .jpeg / .png后缀名的文件,而此时并没有发送数据包。
进一步确定可以通过配置浏览器HTTP代理(没有流量经过代理就可以证明是客户端JavaScript检测)
3.2、服务器端校验
(1)MIME类型检测
MIME是描述消息内容类型的因特网标准。浏览器通常使用MIME类型(而不是文件扩展名)来确定如何处理URL。如果MIME配置不正确,浏览器可能会曲解文件内容,网站将无法正常工作。
也就是对请求包中的content-type字段进行校验,常见MIMETYPE
audio/mpeg ----> .mp3
application/msword ----> .doc
application/octet-stream ----> .exe
application/pdf ----> .pdf
application/x-javascript ----> .js
application/x-rar ----> .rar
application/zip ----> .zip
image/gif ----> .gif
image/png ----> .png
text/plain ----> .txt
text/html ----> .html
video/mp4 ----> .mp4
(2)目录路径校验
上传的数据包中,如果存在path(或者其他跟路径有关的名称)等能够操作上传路径的参数,修改该参数配合解析漏洞可以get webshell。
(3)文件幻数(文件头)校验
文件幻数,可以用来标记文件或者协议的格式。很多文件都有幻数标志来表明该文件的格式。
(4)文件扩展名校验
(1)黑名单检测:
服务端会有一个blacklist文件,包含了常见的危险脚本类型,例如:php,asp,js等。
(2)白名单检测:
仅允许指定的文件类型上传,比如仅允许上传jpg,doc等文件,其他全部禁止。
检测跟文件extension相关的内容
(5)自定义正则校验
4、绕过文件校验
5、经典漏洞剖析
6.1、解析漏洞
(一)IIS解析漏洞
(1)IIS <= 6.0
原理:
使用iis5.x-6.x版本的服务器,大多为Windows server 2003 ,网站比较古老,开发语句一般为asp;该解析漏洞也只能解析asp文件,而不能解析aspx文件。
(1)目录解析(6.0)
形式:www.xxx.com/xx.asp/xx.jpg
原理:服务器默认会把.asp目录下的文件(即使非asp格式)都解析成asp文件。
(2)分号文件解析
形式:www.xxx.com/xx.asp;.jpg
原理:服务器默认不解析;号后面的内容,因此xx.asp;.jpg便被解析成asp文件了。默认的可执行文件后缀还有三个 “ .asa ”,“ .cer ”,“ .cdx ” ,可以绕过黑名单。
(2)IIS 7.0 & 7.5畸形解析漏洞
默认fast-cgi开启状况下,在一个文件路径后面加上/xx.php会将原来的文件解析为php文件。
例如:
将shell语句写在文本xx.txt中,
<?PHP fputs(fopen('shell.php','w'),'<?php eval($_POST[cmd])?>');?>
然后用命令将shell语句附加在正常图片xx.jpg后
copy xx.jpg/b + xx.txt/a test.jpg
上传test.jpg后,访问test.jpg/.php或者test.jpg/abc.php当前目录下就会生成一句话木马shell.php。
(二)Apache解析漏洞
(1)文件名解析
与Windows不同,Apache解析文件的规则是从右到左开始判断解析,如果最右边后缀名为不可识别文件,就会向左判断后缀,直到遇到自己能解析的文件名为止。
比如:test.php.abc中.abc后缀apache不可识别,apache就会把文件解析成test.php文件。
Apache的文件名扩展名定义写在conf/mime.types文件中。
我们这里测试
将文件名修改为test.php.xxx上传,当访问时可以正常执行。
但是,也有不正常的时候。
既然可以正常解析,那么我们可以利用它绕过一些规则,比如上传文件的黑名单,并使其正常解析,但是这里我自己测试,并没有像网上的资料一样正常解析: