Web安全之业务安全:短信轰炸漏洞原理与防护详解
字数 971 2025-11-22 07:11:49
Web安全之业务安全:短信轰炸漏洞原理与防护详解
一、漏洞描述
短信轰炸(SMS Flooding)是一种针对业务逻辑的拒绝服务攻击,攻击者利用系统短信接口的缺陷,在短时间内向同一手机号或不同手机号批量发送大量验证短信,导致用户被骚扰或运营商资源被耗尽。该漏洞的核心问题是短信接口缺乏有效的频率控制和身份验证机制。
二、攻击原理分析
- 接口暴露:系统未对短信发送接口做访问控制,攻击者可直接调用接口。
- 无频率限制:未对同一手机号的请求频率(如每分钟/每小时上限)进行限制。
- 无图形验证码:未在发送短信前要求用户完成人机验证(如滑块、点选等)。
- 参数可篡改:攻击者可通过工具篡改手机号参数,实现批量攻击。
- 业务逻辑缺陷:例如注册时重复请求验证码不校验手机号是否已注册。
三、攻击步骤演示
- 攻击者通过浏览器开发者工具捕获短信发送请求(通常为HTTP POST请求)。
- 使用工具(如Postman、Burp Suite)重放该请求,修改手机号参数为攻击目标。
- 通过脚本自动化循环调用接口,实现高频发送:
import requests for i in range(100): requests.post("https://api.example.com/send-sms", data={"phone": "目标手机号"})
四、防护方案设计
- 频率限制:
- 同一手机号:每分钟≤1次,每小时≤5次,每天≤10次。
- 同一IP地址:每小时≤100次。
- 使用Redis记录请求时间戳,通过滑动窗口算法实现计数。
- 人机验证:
- 在发送短信前强制要求完成图形验证码或行为验证(如腾讯云验证码)。
- 验证码需与服务端Session绑定,防止绕过。
- 业务逻辑加固:
- 注册场景下,若手机号已注册则禁止发送验证码。
- 验证码有效期缩短至5-10分钟,减少泄露风险。
- 安全编码:
- 对手机号格式做正则校验(如
/^1[3-9]\d{9}$/)。 - 接口添加Token机制,防止CSRF攻击。
- 对手机号格式做正则校验(如
五、技术实现示例(Node.js)
const rateLimit = require("express-rate-limit");
const redis = require("redis");
// 手机号频率限制(1次/分钟)
const phoneLimiter = rateLimit({
store: new RedisStore(redis.createClient()),
keyGenerator: (req) => req.body.phone, // 按手机号区分
windowMs: 60 * 1000,
max: 1,
message: "请求过于频繁"
});
app.post("/send-sms", phoneLimiter, async (req, res) => {
const { phone, captcha } = req.body;
// 校验图形验证码
if (!verifyCaptcha(req.session.captcha, captcha)) {
return res.status(400).json({ error: "验证码错误" });
}
// 发送短信逻辑
await sendSMS(phone);
});
六、进阶防护策略
- 设备指纹:通过浏览器指纹或APP设备ID识别唯一设备,限制单设备请求量。
- 行为分析:检测异常行为(如连续请求不同手机号),触发动态验证。
- 运营商合作:对接运营商风控系统,识别虚拟号码和异常号段。
七、测试验证方法
使用自动化工具模拟攻击,检查防护是否生效:
- 尝试连续请求同一手机号,观察是否被拦截。
- 修改IP地址或User-Agent后重试,验证设备指纹机制。
通过以上多层防护,可有效降低短信轰炸风险,平衡用户体验与安全性。