理论基础
注:本靶场环境基于Python,以下内容根据PHP/Java/Python等WEB环境进行总结,部分内容可能不适用于本题。
-
文件上传漏洞介绍
文件上传漏洞,字如其意,就是可能出现在一切允许上传文件的功能点。
它是指由于程序员未对上传的文件进行严格的验证和过滤,而导致的用户可以越过其本身权限向服务器上上传可执行的动态脚本文件。这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等。这种攻击方式是最为直接和有效的,“文件上传”本身没有问题,有问题的是文件上传后,服务器怎么处理、解释文件。如果服务器的处理逻辑做的不够安全,则会导致严重的后果。
- 漏洞分类
- 前端绕过
- 后端绕过—后缀校验
- 后端绕过—黑白名单校验
- 后端绕过—文件类型校验
- 后端绕过—文件头检测
- 后端绕过—WAF绕过
- 其他绕过
- 漏洞产生原因
- 服务器配置不当
- 文件上传过滤缺陷
- 服务器权限管理不当
- 文件和服务器隔离不当
- 上传功能开发缺陷
- 开源编辑器或上传组件存在漏洞
- 文件上传漏洞利用条件
- 上传的文件能够被web容器解释执行
- 用户能够从web访问这个文件
- 上传的文件内容完整
- 文件上传漏洞利用点
- 允许上传脚本语言文件且解析 ==> getshell
- 允许上传html ==> xss、csrf、登陆劫持…
- 允许上传压缩包 ==> 压缩包DOS、解压文件getshell
- 允许上传pdf ==> pdf xss
- 允许上传swf ==> swf xss
- 允许上传excel、docx ==> xxe
-
测试流程
图自:https://github.com/c0ny1/upload-labs/raw/master/doc/sum_up.png
-
上传绕过思路
图自:https://github.com/c0ny1/upload-labs/blob/master/doc/mind-map.png
-
后端绕过之后缀替换
后缀 可替换(部分后缀为特定情况下可用) asp/aspx asa,asax,ascx,ashx,asmx,cer,aSp,aSpx,aSa,aSax,aScx,aShx,aSmx,cEr php php5,php4,php3,php2,pHp,pHp5,pHp4,pHp3,pHp2, jsp jsp,jspa,jspx,jsw,jsv,jspf,jtml,jSp,jSpx,jSpa,jSw,jSv,jSpf html htm,phtml,pht,Html,Htm,pHtml,HTML,jHtml
-
后端绕过之Content-Type介绍
文件类型 Content-type 超文本标记语言文本 .html,.html text/html 普通文本 .txt text/plain RTF文本 .txt text/plain GIF图形 .gif image/gif JPEG图形 .jpeg,.jpg image/jpeg au声音文件 .au audio/basic MIDI音乐文件 .mid,.midi audio/midi,audio/x-midi RealAudio音乐文件 .ra, .ram audio/x-pn-realaudio MPEG文件 .mpg,.mpeg video/mpeg AVI文件 .avi video/x-msvideo GZIP文件 .gz application/x-gzip TAR文件 .tar application/x-tar
-
后端绕过之文件头
.jpg Value = FF D8 FF E0 .gif Value = 47 49 46 38 ==> GIF89a .png Value = 89 50 4E 47 .html Value = 68 74 6D 6C 3E 10 .xml Value = 3C 3F 78 6D 6C
- 漏洞防御
- 后缀白名单,只允许上传jpg、jpeg、png、gif
- 内容完整性检测
- 文件和服务器分离
- 文件名加密,不暴露文件路径
- 使用安全的上传框架、组件
- 使用WAF拦截
实践学习
漏洞环境以Pilot靶场为例:下载地址与部署教程
-
进入漏洞页面,发现只能上传图片;准备一个可造成XSS的HTML文件或PDF文件:
- 例如在HTML文件中写入
<img src=1 onerror=alert(1)>
- 例如在HTML文件中写入
-
通过F12找到上传检查的代码,发现并无限制。选择文件,抓包上传:
-
发现后端加入了文件类型判断,考虑进行绕过。
-
绕过方式1:尝试未被屏蔽的其他后缀替代,如
html->htm
、php->php5
、docx->doc
-
绕过方式2:尝试使用大小写绕过,如
html->Html
-
除此之外,还有一些绕过方式不适合本题(代码写法和Linux系统原因):双写绕过、后缀加
.
、后缀加空格或其他非法字符、::$DATA
绕过、%00截断绕过等。