← 返回文件上传漏洞

📝 实验一:后缀名绕过

⚠️ 漏洞场景

服务器只检查文件扩展名,可通过多种方式绕过

🎮 攻击演示

模拟上传

🎯 常用绕过 Payload

点击上传查看结果...

💀 漏洞代码

// ❌ 只检查最后的扩展名
const ext = filename.substring(filename.lastIndexOf('.'))

if (!ALLOWED_EXTENSIONS.includes(ext.toLowerCase())) {
  return res.status(400).json({ error: '不允许的文件类型' })
}

// 问题:shell.php.jpg 的 ext 是 .jpg,通过检查!

🛡️ 正确做法

// ✅ 检查所有扩展名
const parts = filename.split('.')
const dangerousExts = ['.php', '.jsp', '.asp', '.exe']

for (const part of parts) {
  if (dangerousExts.some(e => e.includes(part.toLowerCase()))) {
    return res.status(400).json({ error: '检测到危险扩展名' })
  }
}