安全事件:数据漏洞,服务瘫痪,成果失窃,系统劫持
服务端漏洞
第三方组件漏洞
针对 java 可以选择使用 dependency-check-maven 检查项目组件是否有安全漏洞。如果有看最新版本有没有更新安全版本
SQL 注入
SQL 语句静态模板和动态数据部分没有严格区分,如果在数据项中加入了某些 SQL 语句关键字(比如说 SELECT/DROP 等等),这些 SQL 语句就很可能在数据库写入或读取数据时得到执行
比如说
select * from products where name is NULL order by code
select * from products where name is NULL order by if(1, sleep(10), code)
解决方法:
- 不要在代码里面写 raw SQL 语句并将其和外部量拼接,请使用 ORM 包或者预编译
- GORM 会将 SQL 语句和你提供的对象区分开来,但应该注意框架中的特性,可能存在不安全的写法导致的 SQL 注入问题。就 gorm 来说,请使用占位符而非字符串拼接
- 在复杂场景中如果一定要 raw SQL 拼接,需要对外部输入进行转义
//字符串拼接, 不要在where, order这些函数里面直接传入你的字符串
id := "1" + " AND 1=1 "
where := "stu_number=" + id
err := DB.Model(&User{}).Where(where).Find(&user).Error
//使用参数占位符
err = DB.Model(&User{}).Where("stu_number=?", id).Find(&user2).Error
RCE/命令注入
代码中遇到需要调用某个命令才能完成的功能的时候,会涉及到命令拼接,如果命令拼接没有做好安全过滤,那么将会导致命令注入风险,服务器权限将会被控制
比如在参数最后搞成一个管道 + 攻击命令,比如 | id
防护方式:
- 对动态的值尽可能设置白名单进行验证,也就是只能传哪几个值
- 如果某些位置无法设置这种白名单,需要尝试对数据类型进行校验,比如说只能传整数
- 特殊字符黑名单过滤或者转义,更复杂的情况下
越权漏洞
-
未授权:不需要登录,系统没有做认证
-
水平越权:账号 A 可以访问账号 B 的敏感信息。比如说如果订单查询功能提供订单 id 即可查询订单详情,那么账号 A 就可以从 1 开始遍历请求所有 id,得到所有订单信息。防护方式是,涉及资源 id 尽量不要使用短 id(遍历难度较小),同时最重要的做好资源属主校验
-
垂直越权:同一个账号权限划分,低权限用户得到管理员权限,比如说逆向前端代码方式获取普通接口,也可以自己申请一个管理员账户然后分析接口,以普通用户的身份直接给出 GET /api/admin/query?uid=1 的请求。防护方式是,将接口在路由级别进行分组,对不同的 API 分组引入 Middleware 进行权限拦截,Middleware 获取当前用户角色以确定是否可以访问此接口
注意,这些权限的检查都必须放到后端进行,不能给前端
SSRF
服务端请求伪造攻击,指攻击者利用服务器为跳板,让后端服务指向非预期网络地址(主要指内网地址)发出恶意请求,获取敏感信息或执行恶意操作
比如说后端拿的是一个链接,获取这个链接的结果然后返回,那么攻击者可以将 URL 改为 http://.../admin, 直接访问内网页面。总之就是输入了一些预期之外的 url 或者 host
防护方式:对 url 的 host 进行白名单过滤,获取对 host 解析的 ip 判定看是否是内网地址
文件上传
比如说上传图片和视频
- 如果在服务端新建一个 php 文件,那么 php 脚本会立即执行,它是解释型语言
- 找到公开的上传点,上传恶意问价(恶意视频、图片),获取图片 url(绝对链接,可以直接访问的那种),然后直接分享 url 至外部恶意网站或者社交网站。这种就是借你的存储一用
防护方案:
- 限制文件类型,防止脚本进来
- 站库分离:应用部署的位置和上传文件位置分离,单独存放(如果存在 TOS/OSS上,就算传 php 它也不支持其运行
- 防止图床:对图片访问链接进行限制,包括时间限制,访问身份限制
客户端漏洞
客户端漏洞的修复可能依赖于服务端,需要了解
-
开放重定向:某些需要重定向到其他站点的功能,往往在参数中携带需要重定向的 URL,如果实际逻辑没有控制好重定向的范围,会诱导用户重定向到恶意站点。解决方式是重定向白名单控制 。
例如:https://www.example.com/redirect?url=http://evil.com -
XSS:跨站脚本攻击,客户端 javascript vue 代码注入,可以评论框放个代码读取其他用户的 cookie 之类。解决的方法,后端方面,可以做一个过滤
-
CSRF:类似于 SSRF,允许攻击者诱导用户访问恶意链接,执行用户非预期执行的操作
-
点击劫持
小结
这节课学习了许多服务端漏洞和客户端漏洞,以及这些漏洞的解决方式
在大项目的开发过程中,我们尤其要注意一些服务端的漏洞,比如说 SQL 注入(GORM 包的使用),越权漏洞(鉴权系统的设计),文件上传(使用对象存储,存图片和视频)