2023年某电商平台被曝出一起数据泄露,全攻根因不在什么高深漏洞,全攻而是全攻一个后台接口忘了做权限校验。攻击者用普通用户账号登录,全攻把请求里的全攻 user_id 从自己的改成别人的,服务器照单全收,全攻返回了姓名、全攻手机号、全攻收货地址。全攻这类事在圈子里叫“越权”,全攻属于最没技术含量、全攻却最要命的全攻漏洞之一。写代码的全攻人可能只是少写了个 if,代价是全攻几千万条用户数据。
Web安全的全攻攻防,本质上就是围绕“信任”二字做文章。浏览器发来的每一个参数、每一个请求头、每一段Cookie,默认都不可信。可现实里,开发者往往图省事,前端校验完就以为万事大吉,后端直接拿数据拼SQL。SQL注入能活到今天,不是因为它多高级,而是因为偷懒的人一直有。一个登录框,输入 ' or 1=1 --,如果后端是字符串拼接查询,直接绕过密码。防御方法也简单——预编译语句,参数化查询,别让用户输入变成代码的一部分。
XSS跨站脚本是另一条老路。用户提交的评论里带一段 <script>,页面渲染时原样输出,脚本就在其他用户浏览器里跑起来了。偷Cookie、伪造操作、挂马,全看攻击者心情。存储型XSS尤其阴,payload躺在数据库里,每个访问页面的用户都中招。防御要做输出编码,根据上下文决定转义哪些字符,HTML里、JS里、URL里规则不一样。别用一个 htmlspecialchars 走天下。
CSRF跨站请求伪造更隐蔽。你登录了银行网站,Cookie还在有效期内,然后点开一个恶意页面,里面藏了个自动提交的表单,向银行发转账请求。浏览器自动带上Cookie,银行以为是本人操作。防御靠CSRF Token,或者检查 Referer 和 Origin,再或者把Cookie设成 SameSite=Lax。现在浏览器默认策略已经挡掉一部分,但老系统里这漏洞一抓一大把。
文件上传功能是重灾区。攻击者传个 .php 文件到服务器,如果服务器没限制后缀,直接就能执行任意代码。有的开发者只在前端用JS检查扩展名,改个请求包就绕过了。还有的用黑名单,禁了 php 却漏了 php5、phtml。正确做法是白名单,只允许图片就只放行 jpg、png,并且把文件存到Web根目录之外,用脚本读取再输出。
命令注入和SSRF也值得提。一个ping工具页面,用户输入IP,后端执行 ping -c 1 $ip。输入 127.0.0.1; cat /etc/passwd,命令就串起来了。SSRF则是让服务器去请求内网地址,比如 http://127.0.0.1:6379 打Redis,或者 http://169.254.169.254 拿云元数据。防御要限制协议、限制IP、限制端口,别让用户控制请求目标。
攻防从来不是单方面的。WAF能挡掉大部分自动化扫描,但绕WAF的手法也在进化——大小写混写、注释符穿插、编码变形。真正的安全得从代码层面解决,WAF只是补丁。我见过不少团队,上线前跑一遍扫描器,没报高危就过。可扫描器查不出逻辑漏洞,比如越权、支付金额篡改、验证码复用。这些得靠人去看代码、去测业务流程。
说个真实案例。某次渗透测试,目标站有WAF,SQL注入点被拦。但发现一个导出功能,参数是 orderBy,WAF没覆盖。构造 orderBy=if(1=1,sleep(5),1),延时成功。再配合布尔盲注,把管理员密码哈希拖出来了。WAF规则是死的,业务逻辑是活的。攻击者永远找那个没人管的地方下手。
写安全代码没什么秘诀,就是别信任任何输入,别拼字符串,别省校验。输出编码、参数化查询、最小权限、纵深防御,这些词听着老套,但每一条背后都是血泪。攻防的节奏在变,从Web到API,从服务端到客户端,从漏洞到供应链。可根上的东西没变——你少写一行校验,就多一个入口。攻击者不挑食,哪儿松往哪儿钻。