游客发表
2023年秋天,网站某家做在线教育的安全公司被拖库了。攻击者没用什么高级0day,漏洞就是网站拿一个三年前就披露过的SQL注入漏洞,从选课查询接口一路摸到数据库,安全最后把几百万条学生身份信息挂到了境外论坛上。漏洞安全团队事后复盘,网站发现那个接口的安全代码里还留着测试时写的字符串拼接,注释写着"临时用,漏洞后面改"。网站后面一直没人改。安全
这种事听多了会麻木,漏洞但每次看到泄露规模,网站还是安全觉得离谱。网站安全漏洞不是漏洞抽象概念,它具体到某一行没过滤的输入、某个忘了关的调试端口、某个以为"内网就安全"的配置。
SQL注入排在任何漏洞榜单的前面,不是因为它难防,恰恰是因为太容易防,反而没人认真防。参数化查询写起来只多几个字符,但开发赶进度的时候,直接拼字符串最快。问题在于,用户输入永远不可信。一个登录框,输入 ' OR '1'='1,后端如果直接把这段拼进查询语句,认证逻辑当场失效。
我见过一个后台管理系统,登录接口的SQL是这么写的:"SELECT * FROM admin WHERE user='" + username + "' AND pass='" + password + "'"。攻击者只要在密码框里填 ' OR 1=1 --,就能以第一个管理员身份登进去。这个系统上线了四年,没人发现。直到某天运维查日志,看到有人用 sqlmap 跑了一整夜。
跨站脚本攻击的破坏力被严重低估了。很多人以为XSS就是弹个alert框,或者偷个Cookie。但现在的XSS可以做到:在用户浏览页面时,静默发起转账请求、篡改页面上的收款账号、记录键盘输入。存储型XSS尤其危险,因为恶意脚本被写进了数据库,每个访问该页面的用户都会中招。
去年某电商平台的商品评论区就出过这事。攻击者在评论内容里嵌入了一段 <script>,代码逻辑是检测当前页面有没有支付表单,有就把收款方改成自己的钱包地址。这个评论被浏览了十几万次。平台后来修了,但修的方式是在前端做转义,后端存储的还是原始内容。换个入口调用同一个数据,照样触发。
文件上传漏洞的典型场景是:网站允许用户上传头像,但只在前端用JavaScript检查了文件后缀。攻击者把 shell.php 改成 shell.jpg 上传,后端不检查,直接存到了Web目录。然后访问 /uploads/shell.jpg,如果服务器配置有缺陷,这个文件会被当成PHP解析。一句话木马 <?php @eval($_POST['cmd']); ?> 就生效了。
更隐蔽的做法是上传 .htaccess 文件,把 .jpg 映射成PHP解析。这样连改后缀都省了。很多CMS的历史版本都有这个漏洞,补丁早就发了,但那些没人维护的站点,至今还挂着。
这类漏洞最容易被忽略,因为扫描器扫不出来。比如某平台的优惠券领取接口,前端限制每个账号领一张,但后端没做次数校验。攻击者用同一个账号反复调用接口,领了上千张券,然后批量下单套现。代码没报错,日志也正常,但钱实实在在少了。
还有密码找回逻辑。某网站的重置流程是:第一步验证手机号,返回一个token;第二步用token设置新密码。问题出在token的生成方式——用的是 md5(手机号 + 时间戳),而且时间戳精确到秒。攻击者知道目标手机号,写个脚本遍历最近几分钟的时间戳,就能碰撞出正确的token,直接重置别人密码。
这些漏洞的共性不是技术多复杂,而是开发时默认"用户会按正常流程操作"。攻击者从来不按正常流程走。
Redis未授权访问、MongoDB默认无密码、Elasticsearch开放9200端口——这些配置问题每年都在制造数据泄露事件。某次我看到一个站点,后台路径是 /admin,账号 admin,密码 admin123。登录进去能看到所有用户数据。问开发为什么这么设,回答是"方便测试"。这个"测试环境"直接绑了公网IP。
安全漏洞的修复往往不涉及高深技术,更多是流程和意识问题。代码review时多问一句"这个输入过滤了吗",部署时多检查一遍"这个端口需要对外开放吗",能挡掉大部分攻击。但现实是,很多团队直到被拖库那天,才想起来做这些事。
友情链接