WebShell上传漏洞是指攻击者能够绕过网站的安全限制,将恶意脚本文件(如PHP、ASP、JSP等)上传到服务器,从而获得服务器控制权限的一种高危漏洞。
// 允许上传的文件类型白名单
$allowedTypes = ['image/jpeg', 'image/png', 'application/pdf'];
$fileType = $_FILES['file']['type'];
if (!in_array($fileType, $allowedTypes)) {
die("不允许的文件类型");
}
// 使用白名单验证文件扩展名
String[] allowedExtensions = {".jpg", ".png", ".pdf"};
String fileName = uploadedFile.getOriginalFilename();
String extension = fileName.substring(fileName.lastIndexOf("."));
if (!Arrays.asList(allowedExtensions).contains(extension.toLowerCase())) {
throw new IllegalArgumentException("不允许的文件扩展名");
}
import magic
def validate_file_content(file_path):
# 使用libmagic检测实际文件类型
file_type = magic.from_file(file_path, mime=True)
allowed_types = ['image/jpeg', 'image/png']
if file_type not in allowed_types:
os.remove(file_path)
raise ValueError("文件内容类型不合法")
// 上传后重命名文件,避免执行风险
$uploadDir = '/var/www/uploads/';
$originalName = $_FILES['file']['name'];
$extension = pathinfo($originalName, PATHINFO_EXTENSION);
$newName = md5(uniqid()) . '.' . $extension;
if (move_uploaded_file($_FILES['file']['tmp_name'], $uploadDir . $newName)) {
// 文件保存成功
}
# 设置上传目录不可执行
chmod -R 755 /var/www/uploads/
find /var/www/uploads/ -type f -exec chmod 644 {} \;
location ^~ /uploads/ {
# 禁止上传目录执行脚本
location ~ \.php$ {
deny all;
}
}
// 对上传的图片进行重新生成,去除可能的恶意代码
function process_image($file_path) {
$image = imagecreatefromjpeg($file_path);
imagejpeg($image, $file_path, 90);
imagedestroy($image);
}
通过实施这些措施,可以显著降低WebShell上传漏洞的风险,保护网站安全。