网站的基本构成:
前端:JavaScript,Vue,React
网关:nginx
后端:Java,Go,Node
前后端交互:HTTP,WebSocket
常见安全事件:
数据泄露,服务瘫痪,成果失窃,系统劫持
网络漏洞:
服务端漏洞:SQL
RCE/命令注入
SSRF
文件上传
客户端漏洞:XSS
CSRF
点击劫持
第三方组件漏洞防护方式:
针对Java可以选择使用 dependency-check-maven检查项目依赖的组件是否存在安全漏洞
SQL注入:SQL语句静态模板和动态数据部分没有严格区分,如果在数据项中加入了某些SQL语句关键字,这些SQL语句就很可能在数据库写入或读取数据时得到执行
原因:Java错误使用语言框架,或者语言框架本身存在安全问题
使用Mybatis-plus的危险函数比如inSql,支持直接SQL拼接,存在SQL注入风险;使用[$]构建SQL模板
Golang在业务场景中根据用户定义的字段进行排序的功能,如果将用户输入字段作为维度带到Order则会产生SQL注入
防护方法:
1.尽量不要基于DB的Raw方法拼接构造SQL语句,而应使用预编译,ORM框架
2.使用ORM框架时,应该注意框架中的特性,可能存在不安全的写法导致的SQL注入问题
3.在复杂场景一定要使用拼接SQL,需要对外部输入进行转义
命令执行:代码中遇到需要调用某个命令才能完成的功能时候,会涉及到命令拼接,如果命令拼接没有做好安全过滤,那么将会导致命令注入风险,服务器权限将会被控制
······ 防护方法:
1.对动态的值尽可能设置白名单进行验证
2.如果某些位置无法白名单,需要尝试对数据类型进行校验
3.特殊字符黑名单的过滤或者转义
越权漏洞:资源访问或操作时主体权限没有进行校验就会造成越权问题,细分为:未授权、水平越权和垂直越权
防护方式:如果是简单的场景,可以将接口在路由级别进行分组,对不同的API分组引入Middleware进行权限拦截,Middleware获取当前用户角色以确定是否可以访问此接口
SSRF:服务端请求伪造攻击,指攻击者利用后端服务器为跳板,让后端服务向非预期网络地址发出恶意请求,获取敏感信息或执行恶意操作
防护方式:对url的host进行白名单过滤,获取对host解析的ip进行判定,是否是内网地址
文件上传漏洞:找到公开的上传点,上传恶意文件,获取图片url,然后直接分享url至外部恶意网站
防护方式:
1.限制文件类型:如果系统只需要图片类型,可以服务端解析文件格式,限制只能传入特定的文件格式
2.站库分离:应用部署的位置和上传的文件分离,使用TOS,OSS等进行文件存储
3.防止图床:对图片访问链接进行限制,包括时间限制,访问身份限制等
客户端漏洞:
开放重定向:
某些需要重定向到其他站点的功能,在参数中携带重定向的url,但实际程序没有控制好重定向的范围,导致攻击者可以构造恶意链接,诱导用户重定向到恶意站点
修复方案:对重定向严格进行白名单控制并正确校验匹配白名单
XSS:
跨站脚本攻击,本质是一种Script代码注入,攻击者往目标web页面插入恶意Script代码,当用户访问页面时,嵌入其中的Script代码会被执行,达到恶意攻击用户的目的
防护方法:
1.输入过滤:对输入的特殊字符进行拦截,进制前端提交特殊字符
2.输出过滤:当字符输出到Dom时,对危险字符进行html encode,避免XSS;使用vue/react等框架时候,避免使用危险指令,而应该使用安全指令
3.富文本场景:严格限制tag和attribute,可以在代码层面做白名单或者黑名单
4.CSP:用于缓解XSS,理念是对当前站点允许加载什么源的资源,发送什么请求能进行限制
CSRF:
跨站请求伪造:允许攻击者诱导用户访问恶意链接,执行用户非预期执行的操作。
防护方法:防护的核心时判断请求的来源
1.CSRF tokens:首次访问时候给客户端传递一个token,客户端每次访问时候都必须带上此token才能访问
2.SameSite cookies:Strick -> Lax -> None.核心是禁止某些场景发送第三方cookie。
3.Refererr-based validation:校验Referer来源是否是合法站点