游客发表
去年一家做跨境电商的服务客户被拖库,攻击者没碰WAF,器端也没绕过什么高级防护。和客户端他们只是漏洞往商品评论里塞了一段``,前端没转义,服务直接渲染。器端三天后,和客户端管理员Cookie被拿去登了后台,漏洞订单数据全量泄露。服务这就是器端典型的客户端漏洞——XSS,跨站脚本。和客户端它不攻击服务器,漏洞攻击的服务是浏览器,是器端用户,是和客户端那些以为“前端只是展示层”的人。
客户端漏洞的根子在于:浏览器太信任页面里的内容了。你写进去什么,它就执行什么。反射型XSS靠钓鱼链接,存储型XSS更阴——恶意脚本被存进数据库,每个访问页面的用户都会中招。还有DOM型XSS,连服务器都不经过,前端JS直接从`location.hash`里取数据往`innerHTML`里塞。我见过一个后台管理系统,搜索框回显关键词时用了`document.write`,结果攻击者构造一个`?q=`的链接发给管理员,点开就中招。修复方式也简单:输出到HTML时转义`<>&"'`,或者用`textContent`代替`innerHTML`。但很多团队就是不做,觉得前端不是安全边界。
服务器端漏洞是另一回事。它不依赖用户浏览器,直接打你的后端逻辑。SQL注入最经典,也最容易被低估。有人觉得用了ORM就安全了,可你写`Order.where("id = #{ params[:id]}")`,照样注入。去年一个金融App的API接口,参数`id`拼进SQL没过滤,攻击者用`sqlmap`跑出管理员表,密码是MD5,十分钟就破了。还有命令注入,一个图片处理服务把用户上传的文件名拼进`convert`命令,攻击者传个`; cat /etc/passwd`,服务器直接变肉鸡。
文件上传漏洞更直接。很多系统只检查`Content-Type`,攻击者改个包就绕过。上传个`.php`文件,如果服务器没配好解析规则,直接执行。我见过一个CMS,上传目录权限是777,文件名没做白名单,结果被传了WebShell,整个站被挂马。服务器端漏洞的修复思路和客户端完全不同:客户端靠转义和CSP,服务器端靠参数化查询、输入验证、最小权限原则。别混为一谈。
有意思的是,这两类漏洞经常联动。比如SSRF,服务器端请求伪造,攻击者让服务器去访问内网Redis,写个定时任务反弹Shell。但触发点可能在客户端——一个“图片URL预览”功能,前端把用户输入的URL发给后端去抓取。后端没限制协议和IP,攻击者填个`http://169.254.169.254/latest/meta-data/`,云服务器的元数据就泄露了。这种漏洞你光看前端或光看后端都防不住,得两边一起审。
还有个常见误区:以为上了HTTPS就安全。HTTPS只加密传输,不防XSS,也不防SQL注入。攻击者照样能在加密通道里塞恶意脚本。CSP能缓解XSS,但配置错了反而更危险。比如`script-src 'unsafe-inline'`,等于没设。我见过一个站,CSP设了`default-src *`,那还不如不设。
实际工作中,客户端漏洞更容易被忽略,因为开发觉得“用户看不到代码”。但浏览器开发者工具一开,什么都能改。服务器端漏洞更致命,一旦被利用,数据直接丢。修复优先级上,SQL注入和命令注入必须立刻堵,XSS可以排后面,但也不能拖。有个客户被XSS偷了管理员Session,攻击者用管理员权限上传了WebShell,最后变成服务器端沦陷。链条就是这么串起来的。
别把Web漏洞分成“前端的事”和“后端的事”。攻击者不分,你分什么?写代码的时候,输出到HTML就转义,拼SQL就用参数化,上传文件就白名单加随机名,请求外部资源就限制协议和IP。这些动作不复杂,复杂的是人总想偷懒。
友情链接