|
凌晨两点十七分,登录我盯着后台日志里那串连续七次的异常疑登录失败记录,后背有点发凉。攻击 IP地址来自海外,登录User-Agent却是异常疑一台老旧的Windows 7机器——这种组合本身就透着古怪。更蹊跷的攻击是,每次请求的登录Referer字段都指向一个不存在的内部页面。这不是异常疑普通暴力破解,倒像是攻击有人在试探什么。 我翻出三天前的登录访问日志,果然,异常疑同一个IP在凌晨时段对登录接口发起过大量请求,攻击参数里带着一串编码后的登录字符。解码出来是异常疑个完整的URL,指向一个第三方站点,攻击后面跟着session_id的占位符。 典型的CSRF攻击前兆。攻击者先诱导管理员点击恶意链接,趁登录态未过期时,利用浏览器自动携带Cookie的特性,伪造请求完成转账或改密操作。但这次不太一样——对方似乎想直接窃取会话凭证,而不是单纯利用。 我检查了服务器配置,CSRF令牌校验确实开着,理论上能挡住大部分攻击。可问题出在登录页面的一个回调函数上:它没验证请求来源,只检查了令牌是否存在。攻击者完全能先正常访问页面拿到合法令牌,再伪造带令牌的请求绕过校验。 细节决定成败。我盯着那段代码看了十分钟,突然意识到漏洞不止一处——登录接口的响应头里,X-Frame-Options没设置,意味着页面能被嵌入恶意iframe。配合点击劫持,攻击链就完整了:诱导用户在一个透明iframe里完成登录,随后偷偷提交敏感操作。 修复方案倒不复杂:给所有状态变更请求加上双重验证,校验Origin头,再设置SameSite=Strict的Cookie属性。但真正让我后怕的是,如果对方再多试几天,等某个管理员在公共WiFi下登录,配合DNS劫持,这套攻击就能完全得逞。 安全圈有句老话,攻击者只需要成功一次,防守方得防住每一次。那天晚上我加了四个小时班,把登录流程整个重写了一遍。第二天早上给团队发邮件时,只写了三行字:CSRF令牌改成一次性绑定会话,Referer校验改为白名单模式,所有表单提交强制检查自定义请求头。 后来再没见到那个IP出现。但我知道,类似的试探每天都在发生,只是多数时候没人注意到那几次异常登录失败。 |