文件上传漏洞模拟
模拟不安全的文件上传漏洞,演示攻击者如何上传 Webshell 控制服务器
[X] 漏洞代码
// 危险:无验证直接保存
move_uploaded_file(
$_FILES['file']['tmp_name'],
'uploads/' . $_FILES['file']['name']
);[OK] 安全代码
// 安全:白名单 + 重命名
$allowed = ['jpg','png','pdf'];
$ext = pathinfo($name, PATHINFO_EXTENSION);
if (!in_array(strtolower($ext), $allowed)) {
die('非法文件类型');
}
$newName = uniqid() . '.' . $ext;
move_uploaded_file($tmp, $dir . $newName);
[TIP] 攻击演示:切换到漏洞模式,上传以下内容的 PHP 文件:
<?php system($_GET['cmd']); ?>保存为
shell.php 后上传,即可执行任意命令!
[DEFENSE] 防御措施
- 文件类型白名单:只允许 jpg, png, pdf 等安全类型
- MIME 类型验证:检查文件的 Content-Type
- 文件内容检测:使用 getimagesize() 验证图片头
- 文件重命名:使用随机名称,避免可预测路径
- 存储位置隔离:上传目录禁止执行脚本
- 大小限制:防止上传超大文件耗尽磁盘