网站的常见安全漏洞
网站的基本组成
- 前端:JavaScript / vue / react
- 网关:nglnx
- 后端:Go / Java / Node
- 前后端交互:HTTP / WebSocket
对网站的工具就分为了针对客户端的漏洞攻击和针对服务器端(后端)漏洞的攻击
漏洞分类
-
服务端漏洞
- SQL
- RCE / 命令注入
- SSRF 服务器端请求伪造
- 文件上传
- ······
-
客户端漏洞
- XSS 跨站脚本攻击
- CSRF 跨站请求伪造
- 点击劫持
- ······
服务端漏洞
第三方组件漏洞
一些第三方组件可能有“病毒”潜伏,服务器一旦执行就可能造成安全问题
防护方式:
针对 java 可以选择使用 dependency-check-maven 检查项目依赖的组件是否存在安全漏洞
SQL 注入
SQL 语句静态模板和动态数据部分没有严格区分,如果在数据项中加入了某些 SQL 语句关键字(比如说 SELECT、DROP等等),这些 SQL 语句就有可能在数据库写入或读取数据时得到执行,并产生不好的后果
-
java 中使用 Mybatis-plus 的危险函数,比如inSql, 支持直接的SQL拼接,存在 SQL 注入风险
-
Golang 的常见错误写法
db.Order(parent).Find(&products)当攻击者输入SQL 语句时,则会改变原意,例如
if(1, sleep(10), 'code'
防护方式:
- 尽量不要基于 DB 的 Raw 方法拼接构造 SQL 语句,而应该使用预编译或ORM 框架
- 使用 ORM 框架时,应该注意框架中的特性,可能存在不安全的写法导致的 SQL 注入问题
- 在复杂场景一定要使用拼接 SQL 时,则需要对外部输入进行转义
命令注入
有时代码中需要调用某个命令才能完成功能,涉及到命令拼接,类似于SQL 注入,具有很大的风险
防护方式:
- 对动态的值尽可能设置白名单验证
- 如果某些位置无法设置白名单,需要尝试对数据类型进行校验
- 特殊字符黑名单的过滤,或者转义。
越权漏洞
身份认证是很重要的一个话题,越权漏洞则是在资源访问或操作时候没有进行主体校验,使得某些主体获得了超出预设的访问范围和权力。
例如未登录就访问数据(未越权),账号 A 可以访问账号 B (同等级)的内容(水平越权),或者普通账号获得了管理员的权限(垂直越权)
SSRF
即服务端请求伪造攻击,指攻击者利用后端服务器为跳板,让后端服务向非预期网络地址(主要指内网地址)发出恶意请求,获取敏感信息或执行恶意操作
防护方式:
对url的host进行白名单过滤,对host解析的ip进行判定是否为内网地址
文件上传漏洞
在公开的上传节点上传图片时,修改图片文件内容,使得服务器在接收到图片后,执行其中的恶意指令,造成数据泄露等后果
防护方案:
- 限制文件类型:如果系统只需要图片类型,可以从服务端解析文件格式,限制只能传入特定的文件格式
- 站库分离:应用部署的位置和文件上传位置分离,一般可以使用 TOS,oss 等进行文件存储
- 防止图床:限制图片访问链接,包括时间限制,访问身份限制等
客户端漏洞
开放重定向
网站中需要重定向到其他站点时,如果没有处理好重定向的范围,可能导致攻击者构造恶意链接,诱导用户前往其他恶意站点
防护方案:
对重定向进行严格的白名单控制,并进行正确校验
XSS
即跨站脚本攻击,本质是一种 Script 代码注入,攻击者在目标网页插入恶意代码后,当用户访问页面时,其中的 Script 代码开始执行,从而开展恶意攻击。
通常会造成包括窃取用户的敏感信息,以用户身份执行敏感操作。
防护方法:
-
输入过滤:
过滤前端的特殊字符
-
输出过滤:
- 输出字符到 Dom 时,对危险字符进行HTML encode,从而避免XSS
- 使用vue/react 等框架的时候,避免使用危险指令
-
富文本场景:
需要富文本功能的场景,例如文章发布,需要严格限制 tag 和 attribute,可以在代码层面制作白名单
<tag attribute1='value1' attribute2='value2'/> -
CSP 内容安全策略:
限制当前站点允许加载哪些源的资源
CSRF
跨站请求伪造,即攻击者引导用户访问恶意链接,执行用户非预期操作
危害: 用户执行敏感操作,如关注其他用户,修改安全邮箱等
漏洞利用步骤:
- 将更改 Email 的请求生成CSRF表单,并构造钓鱼链接
- 发送链接给用户
- 用户点击链接后成功执行 Email 更改操作
防护方式:
核心时判断请求的来源
- CSRF tokens:首次访问时候给客户端传递一个 token,客户端每次访问时候都必须带上此 token 才能访问
- SameSite cookies:Strick 一> Lax(DefauIt) 一> None. 才刻心是禁止某些场景发送第三方 cookie
- Referer-based validation: 校验 Referer 来源是是合法站点
点击劫持
点击劫持 (clickjacking) 是一种在网页中将恶意代码等隐藏在看似无害或者存在诱导的内容(如按钮)之下,并诱使用户点击的手段,用户点击后往往会执行一些非预期的操作。
漏洞利用步骤:
-
构造一个钓鱼网站,表面是一个透明的目标站点,其实下面隐藏着钓鱼链接
-
发送链接
-
用户访问链接,点击「 Win 300 $」时候,实际是点击「 Delete Account 」
防护方式:
核心是不让非预期的网站 iframe 我的站点
- X-Frame-Options : DENY / SAMEORIGIN
- CSP: frame-ancestors 指令,用于设置允许 frame 的 source 列表。
CORS
跨域资源共享,用于解决网页应用跨域访问的请求。跨域配置错误即开发者在配置CORS时,错误配置跨域访问AllowList,使得非预期站点跨域进行跨域访问,最终造成信息泄露
防护方式:
核心是正确设置跨域白名单
- 代码层:中间件统一处理
- 网关层:Nginx 反代统一拦截
WebSocket
本质上 http 服务端的漏洞,在 WebSocket 上也可能存在
- WSS 和 WS : WSS (WebSockets over SSL/TLS) ,提供加密信道。杜绝掉一些中间人攻击。
- 数据校验: SQL/XSS/RCE 等漏洞仍然可能存在
- CSWSH : Cross-Site WebSocket Hijacking, 即在使用 cookie 作为认证方式时候,如果 WebSocket 服务端没有校验好请求来源 ,将导致 WebSocket 会话劫持。
CSWSH 防护手段:
- cookie 鉴权:限制请求的 Origin
- ticket/token 鉴权: http 服务提供接口,用于获取临时的身份凭证,并传递到 WebSocket 的初始化流程中
总结
网站运营者应采取技术措施和其他必要措施,确保其收集的个人信息安全,防止信息泄露、毁损、丢失