网安基础学习之“文件上传漏洞原理与实现”
近期新闻头条上报出了“长沙市场监管局网站被上传了黄色页面”,经过长沙市公安局网技支队的排查,该门户网站后台编辑器存在**“文件上传漏洞”!**
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rdBn0pQm-1675957564676)(https://p3-sign.toutiaoimg.com/pgc-image/c48932e9031a421e94c46d1b650294f7~noop.image?_iz=58558&from=article.pc_detail&x-expires=1675753861&x-signature=j%2BZ9AMxm%2F%2F%2FCvCbSt8dg5l1f5o8%3D)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3QNNCp2g-1675957564677)(https://p3-sign.toutiaoimg.com/pgc-image/c48157d02a8b4398bac24235884e006d~noop.image?_iz=58558&from=article.pc_detail&x-expires=1675753861&x-signature=MlbMVSDfAkBLiWC39xrw%2FT%2BDaF0%3D)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Cd3EQOwo-1675957564678)(https://p3-sign.toutiaoimg.com/pgc-image/edcd9ac4f2d8422aa0c47531cfb5a052~noop.image?_iz=58558&from=article.pc_detail&x-expires=1675753861&x-signature=PeBfgYfV%2BVkFUWgtcruPXq%2F%2FGlo%3D)]
通过数据可以显示,文件上传漏洞,对网站的负面影响还是很大的,那么究竟"什么是文件上传漏洞?技术原理是什么?如何防范该漏洞?
今天小编我就以本篇文章内容给大家分享一下"文件上传漏洞的技术原理与实现,以及我们该如何防御该漏洞"。
一、 "文件上传漏洞"是什么
Web应用程序通常会有文件上传的功能, 例如在 BBS发布图片 , 在个人网站发布ZIP 压缩包, 在办公平台发布DOC文件等 , 只要 Web应用程序允许上传文件, 就有可能存在文件上传漏洞。
由于程序员在对用户文件上传部分的控制不足或者处理缺陷,而导致的用户可以越过其本身权限向服务器上上传可执行的动态脚本文件。这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等。这种攻击方式是最为直接和有效的,**"文件上传"本身没有问题,有问题的是文件上传后,服务器怎么处理、解释文件。**如果服务器的处理逻辑做的不够安全,则会导致严重的后果。
二、 文件上传后导致的安全问题
上传的文件是web脚本语言,服务器的web容器解释并执行了文件上传的web脚本,导致了代码的执行。
上传文件是flash的策略文件,黑客可以通过控制flash在该域下的行为,来进行其他攻击。上传文件是病毒,木马文件,那攻击者可以诱使文件中其他的人员下载执行。
文件上传也有可能是钓鱼图片,或者包含了脚本文件的图片,在某些版本的浏览器中,这些脚本文件会被执行,可以用来做钓鱼攻击。
除此以外,还有一些不常见的利用方法,比如将一个文件作为一个入口,溢出服务器的后台处理程序,如图片解析模块,或者上传一个合法的文件,其内容包含了php的代码,再通过文件包含,来执行这个脚本。
三、造成文件上传漏洞的原因
(1)对于上传文件的后缀名(扩展名)没有做较为严格的限制
(2)对于上传文件的MIMETYPE 没有做检查
(3)权限上没有对于上传的文件的文件权限,(尤其是对于shebang类型的文件)
(4)对于web server对于上传文件或者指定目录的行为没有做限制
四、文件上传漏洞攻击方式
1.前端限制
function check(){
var filename=document.getElementById("file");
var str=filename.value.split(".");
var ext=str[str.length-1];
if(ext=='jpg'||ext=='png'||ext=='jpeg'||ext=='gif'){
return true;
}else{
alert("这不是图片!")
return false;
}
return false;
}
在表单中使用onsumbit=check()调用js函数来检查上传文件的扩展名。这种限制实际上没有任何用处,任何攻击者都可以轻而易举的破解。只能用于对于用户完全信任的情况下,很难称之为一种安全措施只能称之是一种防止用户误操作上传的措施。
**原理:**当用户在客户端选择文件点击上传的时候,客户端还没有向服务器发送任何消息,就对本地文件进行检测来判断是否是可以上传的类型,这种方式称为前台脚本检测扩展名。
绕过方法:
**1).**绕过前台脚本检测扩展名,就是将所要上传文件的扩展名更改为符合脚本检测规则的扩展名,通过BurpSuite工具,截取数据包,并将数据包中文件扩展名更改回原来的,达到绕过的目的。例如:文件名本来为【evil.jpg】,上传时,用BurpSuite截包后,将数据包中的名字改为【evil.php】(或其它脚本类型)即可。
**2).**如果是JS脚本检测,在本地浏览器客户端禁用JS即可。可使用火狐浏览器的NoScript插件、IE中禁用掉JS等方式实现。
2.检查扩展名
就是在文件被上传到服务端的时候,对于文件名的扩展名进行检查,如果不合法,则拒绝这次上传在检查扩展名是否合法的时候,有两种策略:
1).黑名单策略,文件扩展名在黑名单中的为不合法:
p o s t f i x = e n d ( e x p l o d e ( ′ . ′ , ′ postfix = end(explode('.',' postfix=end(explode(′.′,