```html 常见的漏洞漏洞 常见的漏洞 一个登录框,输入 ' or 漏洞1=1 --,回车,漏洞进去了。漏洞这事我干过,漏洞十几年前一个企业站的漏洞后台,就这么大摇大摆地开了。漏洞当时甚至有点失望——这也太简单了。漏洞但漏洞这东西,漏洞往往就藏在这种“简单”里。漏洞 SQL注入排第一,漏洞没什么争议。漏洞开发者把用户输入直接拼进查询语句,漏洞数据库分不清哪是漏洞代码哪是数据。后来有了预编译,漏洞情况好了一些,可总有人图省事。我见过一个外包项目,参数化查询写了,但 order by 后面的字段名是从前端传的——因为“排序字段没法参数化”。结果那个参数成了注入点,整张用户表被拖走。这种半吊子防御比不防更危险,因为它给人虚假的安全感。 XSS 是另一回事。它不碰数据库,直接在浏览器里搞事。存储型 XSS 最阴——你发一条评论,里面夹一段 <script>,所有看到这条评论的人都会中招。反射型相对好理解,得骗人点链接。DOM 型最容易被忽略,因为服务端日志里干干净净,Payload 全在 # 后面。前阵子帮朋友看一个后台,输入框里写 <img src=x onerror=alert(1)>,弹窗了。他挺惊讶:“我明明做了转义啊。”一看代码,转义函数只处理了 < 和 >,没管 " 和 '。属性值里插进去,照样执行。 文件上传的坑更直接。有的系统只检查 Content-Type,改个包就行;有的只检查后缀,传个 .php.jpg 就过了;还有的检查了后缀但没改文件名,Apache 解析漏洞一配合,shell.php.xxx 照样跑。我印象最深的是一个 CMS,上传目录可执行,文件名随机,但随机算法是 md5(time())。时间戳可预测,等于没随机。那天下午我写了个脚本,十分钟拿到 webshell。 越权分两种:水平越权和垂直越权。水平越权是改个 ID 就能看别人的数据,比如 /user?id=1001 改成 1002。垂直越权是低权限用户干了高权限的事,比如普通用户能调管理接口。很多系统前端藏了按钮,后端却没校验。这跟把钥匙藏地毯下面没区别——防君子不防小人。我见过一个 API,/api/admin/deleteUser 只在前端判断了角色,后端完全没管。用普通账号的 token 直接 POST,用户就没了。 逻辑漏洞最考验耐心。比如密码找回,验证码返回在响应包里;比如支付,把金额改成负数,余额反而增加;比如优惠券,并发请求能重复使用。这类漏洞没有固定模式,得靠对业务的理解。有次测一个电商,下单时把商品数量改成 -1,总价变成负数,居然能提交。虽然最后没发货,但订单生成了,积分也加了。 CSRF 现在被 SameSite Cookie 挡掉不少,但老系统里依然常见。一个转账请求,只要你登录着网银,点个恶意链接就能把钱转走。防御也简单——加个随机 token,或者检查 Referer。可就是有人不做。我见过一个政府网站,后台所有操作都是 GET 请求,连 token 都没有。只要诱导管理员点个链接,就能删文章、加用户。 这些漏洞有个共同点:都是把“用户输入”当成了“可信数据”。输入可能来自表单、URL、Header、Cookie,甚至文件名。信任边界一旦模糊,漏洞就来了。修复方法其实不复杂——参数化查询、输出编码、白名单校验、最小权限、CSRF token。难的是坚持,是在每个接口、每个参数上都这么做。开发赶进度,安全往后放,漏洞就留下来了。 我桌上贴了张便签,写着:“永远不要相信客户端。”每次写代码前看一眼。这行字比任何安全框架都管用。 ``` |