文件上传功能是大部分WEB应用的必备功能,网站允许用户自行上传头像、一些社交类网站允许用户上传照片、一些服务类网站需要用户上传证明材料的电子档、电商类网站允许用户上传图片展示商品情况等。然而,看似不起眼的文件上传功能如果没有做好安全防护措施,就存在巨大的安全风险。
当用户在在文件上传的功能模块处上传文件时,如果WEB应用在文件上传过程中没有对文件的安全性进行有效的校验,攻击者可以通过上传WEBshell等恶意文件对服务器进行攻击,这种情况下认为系统存在文件上传漏洞。
最常见的文件上传漏洞的方法是上传网站木马(webshell)文件,WEBSHELL又称网页木马文件,根据开发语言的不同又分为ASP木马、PHP木马、JSP木马等,该类木马利用了脚本语言中的系统命令执行、文件读写等函数的功能,一旦上传到服务器被脚本引擎解析,攻击者就可以实现对服务器的控制。
网站木马(webshell)文件又分为大马和小马(一句话木马)、图片马等
大马:功能比较善,配合浏览器使用;代码量通常较大;隐蔽性相对较弱,代码量大,通常需要通过加密等方式来隐藏特征。
小马:功能简单,需要配合客户端使用;代码量通常较小;隐蔽性相对较强,容易通过变形隐藏特征,绕过过滤,通常与cknife工具一起使用。
图片马:当网站限制只能上传图片相关格式的时候,攻击者无法绕过限制即可尝试利用图片马来实现webshell操作。
一句话木马类似于<?php eval($_POST['v']); ?>,将该木马文件通过文件上传模块上传到服务器。$_POST['v']里面的参数v就是我们的可以利用的参数,我们将我们要执行的指令通过参数v传到服务器来执行;或者利用cknife工具来实现操作目标服务器。
(一)该网页上传形式收到限制,需要符合jpg、jpeg、JPG、JPEG这几个类型格式,所以将原来的格式改为1.jpg格式(服务端校验)
打开burp suite软件拦截数据包,将文件名改为1.php,这样才能运行php脚本,不然jpg后缀的文件虽然能够上传,但是没用运行的功能。
在hackbar插件中定义v=phpinfo();可以查看php当前状态的大量信息
(二)这个页面限制了上传的格式(MIME),需要将文件格式改为JPEG或者PNG(服务端校验)
用burp suite拦截信息,将content-Type改为image/png
用hackbar工具定义参数v=phoinfo();查看php状态信息
(三)该页面对文件后缀进行了筛选,对php类型的文件不进行接受(服务端校验)
打开burp suite软件拦截信息,将文件名改为1.PHp,绕开web服务器的识别
用hackbar定义v=system(ipconfig);
(四)使用截断的方式将jpg截断。1.php%00.jpg,%00用ctrl+shift+u来编译。
1.php%00.jpg,%00用ctrl+shift+u来编译
用hackbar工具定义参数v=phoinfo();查看php状态信息(五)该网页只允许上传图片,修改后缀名无效
上传b374k.jpg图片马,登入的密码为b374k
利用浏览器即可使用图片马进行webshell操作
(六)该网页允许上传的类型有jpg,jpeg,png,gif,7z。可以利用apach识别不了后缀名时,从后往前识别扩展名的方式,将1.jpg通过burp改为1.php.7z,则变成压缩形式的文件。
通过burp软件抓包将1.jpg通过burp改为1.php.7z,则变成压缩形式的文件。
用hackbar工具定义参数v=phoinfo();查看php状态信息
总结:文件上传漏洞在web安全里面算是比较常见且危害较大的漏洞,建站厂商可以在此方面增加防范力度:如加强文件后缀名黑名单的范围;对上传文件的名字进行随机修改;上传文件的临时目录和保存目录不允许执行权限等。