目录
第1章 文件上传漏洞基础
1.1 漏洞概述
文件上传是很多站点常用的功能,比如上传图片、视频、文档等,常在评论功能区、头像修改、提交文档等场景下出现。
文件上传漏洞是指用户利用站点文件上传功能,上传了一个可执行的脚本文件(asp、aspx、php、jsp等),并通过执行此脚本文件获得了执行服务器端命令的能力。恶意脚本文件又称webshell(网页后门),具有强大的功能,如查看服务器目录/文件、执行系统命令等。
1.2 漏洞成因
- 站点开放了文件上传功能,但却对上传的文件没有进行足够的限制
- 程序开发部署时,没有考虑到系统特性、过滤不严格
- 站点服务器存在解析漏洞,被黑客利用后导致可以上传任意文件
1.3 漏洞危害
- 文件上传漏洞最直接的威胁就是上传任意文件,包括恶意脚本、可执行程序等
- 如果站点服务器用于保存上传文件的目录具有执行权限,恶意文件被执行后黑客可获取服务器命令执行能力,导致站点沦陷
- 如果攻击者通过其他漏洞进行提权操作,拿到系统管理员权限,那么直接导致服务器沦陷
- 同服务器下的其他网站无一幸免,均会被攻击者控制(旁站攻击)
1.4 漏洞利用姿势
- 直接上传可执行文件,如PHP、JSP、ASP等,然后利用webshell工具连接可执行文件,从而获取服务器命令执行权限,常见webshell工具有菜刀、蚁剑等。
- 配合文件包含漏洞写shell
第2章 文件上传漏洞检测与绕过
文件上传漏洞的检测,一般有两个思路,一是在web前端借助JavaScript来实现,二是在后台服务器进行检测,本章节将对这两种检测方式进行介绍,并讲解如何绕过这些检测来达到恶意文件上传的目的。
2.1 前端检测和绕过
1、检测原理
使用javascript脚本语言,先将上传的文件名转换成小写(toLowerCase()函数),然后通过substr()函数获取文件名的后缀,最后匹配预定义的白名单,如果后缀名在白名单之内,则允许上传,否则不允许上传。
一、上传表单
<form class="upload" method="post" enctype="multipart/form-data" action="">
<input class="uploadfile" type="file" name="uploadfile" onchange="checkFileExt(this.value)"/><br />
<input class="sub" type="submit" name="submit" value="开始上传" />
</form>
二、Javascript检测文件
<script>
function checkFileExt(filename)
{
var flag = false;
var arr = ["jpg","png","gif","jpeg"];
var index = filename.lastIndexOf(".");
var ext = filename.substr(index+1); //取出上传文件的扩展名
for(var i=0;i<arr.length;i++) //比较
{
if(ext == arr[i])
{
flag = true; //一旦找到合适的,立即退出循环
break;
}
}
if(!flag) //条件判断
{
alert("上传的文件不符合要求,请重新选择!");
location.reload(true);
}
}
</script>
2、绕过手段
由于服务器端没有对文件做任何检测,所以只要绕过前端JavaScript的校验就可以上传WebShell
- 禁用浏览器Javascript解析器:以FireFox为例,地址栏输about:config-->找到javascript.enabled并将其关闭(默认开启)