原理:
网站Web应用都有一些文件上传功能,比如文档、图片、头像、视频上传,当上传功能的实现代码没有严格校验上传文件的后缀和文件类型,此时攻击者就可以上传一个webshell到一个Web可访问的目录上,并将恶意文件传递给如PHP解释器去执行,之后就可以在服务器上执行恶意代码,进行数据库执行、服务器文件管理,服务器命令执行等恶意操作。还有一部分是攻击者通过Web服务器的解析漏洞来突破Web应用程序的防护
文件上传如何防御
将上传文件与web服务隔离
使用白名单过滤、限制上传文件类型
文件上传路径设置为不可执行权限
检查文件上传路径
自带函数检测,自定义函数检测
图片渲染 对上传文件重命名
对文件内容压缩,重新生成文件内容 检查文件内容
文件上传漏洞绕过的方式有哪些
文件包含绕过
前端限制绕过
文件扩展名绕过
ashx上传绕过
特殊文件名绕过
00截断绕过上传
htaccess解析漏洞
突破MIME限制上传
解析漏洞绕过
条件竞争绕过
CONTENT-LENGTH绕过
第一关 client check
绕过方法:
(1)直接前端修改限制代码
找到限制代码checkfilext ,将“”中的内容改写为return ture
直接可注入木马
(2)浏览器禁用javascript
我是火狐浏览器(每个浏览器关闭的操作可能不一样,建议下载拓展一键关闭)操作如下:
先在地址栏输入about:config,进入该界面
然后搜索javascript.enabled,将值改为false即可
第二关MIME type
此关卡为后端验证需要用burp suite抓包修改类型
将content-type改为后缀为要求的格式类型即可
上传成功
问题分析
关于MIME类型的介绍可以看这个网页链接: MIME类型,在HTTP request报文中MIME类型在Content-Type字段体现。
本关的防护代码如下图所示
$mime是一个包含合法MIME类型的数组,也就是MIME类型白名单;然后将这个白名单作为参数传入了upload_sick()函数进行服务器端的检测。
第三关 getimagesize
尝试了一下抓包修改类型居然被发现了,也许后端代码会删掉原本的后缀名并根据一些规则替换新的后缀名
在图片中插入一行木马,就可以正常上传了, 需要结合文件包含漏洞或者中间件(如nginx)解析漏洞将图片以php格式执行即可