web漏洞有哪些
去年某电商平台被拖库,攻击者用的不是什么零日漏洞,就是一个SQL注入点。一个没做参数化查询的搜索接口,直接把用户表全吐出来了。这事说明一个道理:大多数被攻破的系统,栽的都是那些“老掉牙”的漏洞。
SQL注入排第一没什么争议。原理简单——用户输入被当成SQL语句执行了。比如登录框输入 ' OR 1=1 --,后端如果拼字符串查数据库,直接绕过密码验证。我见过一个真实案例,某政府网站的文章详情页URL是 ?id=123,加个单引号就报数据库错误,再 UNION 查询就能把管理员密码哈希捞出来。防御手段也成熟:参数化查询、ORM框架、输入白名单。问题是很多老系统没人维护,或者开发图省事直接字符串拼接。
XSS(跨站脚本)分三类:反射型、存储型、DOM型。反射型最常见,你搜个关键词,结果页把你的输入原样输出到HTML里,输入 <script>alert(1)</script> 就弹窗了。存储型更危险——恶意脚本存进数据库,每个访问该页面的用户都中招。早年微博的XSS蠕虫就是存储型,一条带脚本的微博被转发后自动发新微博,滚雪球一样扩散。现在前端框架默认转义,但富文本编辑器、评论区的“安全过滤”经常被绕过。我试过用 <img src=x onerror=alert(1)> 绕过某CMS的过滤,它只拦了 <script> 标签。
CSRF(跨站请求伪造)容易被忽视。攻击者诱导你点一个链接,利用你已登录的Cookie去发请求。比如你登录了银行网站,然后点了一个恶意页面里的 <img src="http://bank.com/transfer?to=attacker&amount=10000">,钱就转走了。防御靠CSRF Token和SameSite Cookie。SameSite=Lax 现在浏览器默认开启,能挡掉大部分跨站POST,但老系统没设这个属性的还是裸奔。
文件上传漏洞的破坏力取决于后端怎么处理。上传个 .php 文件如果被解析执行,直接拿shell。常见绕过手法:改Content-Type为 image/jpeg、文件名用 shell.php.jpg、或者利用解析漏洞(比如Apache的 .php.xxx 被当PHP执行)。我见过一个站,上传点只检查了前端JS的扩展名,抓包改一下文件名就传上去了。防御要白名单扩展名、重命名文件、存到非Web目录。
SSRF(服务端请求伪造)这两年因为云环境变得特别火。攻击者让服务器去请求内网地址,比如 http://169.254.169.254/latest/meta-data/ 拿云主机的临时凭证。某次渗透测试中,一个图片加载功能没做URL校验,我直接读到了内网Redis的配置。防御要限制协议(只允许http/https)、禁用重定向、对IP做黑名单。
越权分水平越权和垂直越权。水平越权是A用户能看B用户的数据,比如改URL里的 user_id=1001 为 1002。垂直越权是普通用户能访问管理员接口。很多系统前端隐藏了菜单,但后端接口没做权限校验,直接调API就绕过了。我见过一个后台,普通用户登录后把 role=user 改成 role=admin 提交,直接提权。
反序列化漏洞在Java和PHP里杀伤力最大。Java的 ObjectInputStream.readObject() 如果反序列化了不可信数据,攻击者能构造 gadget chain 执行任意命令。WebLogic、Shiro 这些框架都出过反序列化RCE。PHP的 unserialize() 配合魔术方法也能搞出POP链。这类漏洞利用门槛高,但一旦成功就是直接RCE。
逻辑漏洞最考验渗透测试人员的脑子。比如密码重置时验证码没绑定用户、支付时金额可以改成负数、优惠券可以无限领取。有个电商平台,下单时把 price 参数改成0.01元,订单居然正常创建了。逻辑漏洞没有固定防御方案,只能靠代码审计和业务理解。
这些漏洞加起来占了Web安全问题的九成以上。工具能扫出一部分,但逻辑漏洞和业务相关的越权,扫描器基本无能为力。我个人的习惯是:拿到一个站先手动测SQL注入和XSS,然后看上传和越权,最后翻JS文件找接口。别迷信自动化工具,很多洞藏在业务逻辑的缝隙里。
