网络安全问题
什么是漏洞
时常发生的安全事件
- 数据泄露:入侵网站的黑客获取到用户的个人信息;
- 服务瘫痪:系统出现技术性故障,导致系统突然崩溃;
- 成果失窃:黑客入侵系统,获取公司数据
- 系统劫持:黑客入侵导弹系统,威胁公众安全。
网站攻击者及意图
- 政治目的:出于政治目的实施黑客攻击,可能实际窃取关键系统的机密数据,破坏关键系统正常运行。
- 经济目的:网站数据具有很高的经济价值。攻击者通过网站漏洞违法获取数据并进行售卖。
- 竞争目的:同类厂商之间可能由于竞争原因,对竞品网站进行一些攻击,以达到让对方站点无法运行的目的。
- 炫技/泄愤:用攻击对方网站方式彰显自己的技术实力,或者对某 些仇恨的系统进行攻击。
网络安全的目的
蓝军(攻):反向验证企业内部安全现状,以攻促防。
红军(防):系统建设时候帮助企业提前规避漏洞。
网站攻击者
攻击方向:多为从客户端发起攻击,偶尔有对服务端的攻击。
常见漏洞分类
服务端漏洞
第三方组件漏洞
漏洞形式1:打印一条日志,服务器就中病毒了!
漏洞形式2:解析一个JSON,服务器就中病毒了!
防护方式: 针对java可以选择使用dependency-check-maven检查项目以来的组件是否存在安全漏洞
SQL注入:
SQL语句静态模板和动态数据部分没有严格区分,如果在数据项中加入了某些SQL语句关键字(比如说 SELECT、DROP等等)这些SQL语句就很可以在数据库写入或读取数据时得到执行。
漏洞形式1:使用错误的语言框架,或者语言框架本身存在安全问题。比如java使用Mybatis-plus的危险函数,比如inSql,支持直接SQL拼接,存在SQL注入风险。
-- 期望
SELECT 'id' test_int,test_str,create_time,update_time,`test_enum`,`version`,`tanant_id`FROM test_data WHERE(id IN (select id from test_data where version=0))
-- SQL注入
SELECT 'id' test_int,test_str,create_time,update_time,`test_enum`,`version`,`tanant_id`FROM test_data WHERE(id IN (select id from test_data where version=0 or 1=1))
防护方式:
-
尽量不要基于DB的Raw方法拼接构造SOL语句,而应该使用预编译、ORM框架
-
使用ORM框架时,应该注意框架中的特性,可能存在不安全的写法导致的SOL注入问题
-
在复杂场景一定要使用拼接SQL,需要对外部输入进行转义。
命令执行
代码中遇到需要调用某个命今才能完成的功能时候,会涉及到命令拼接,如果命令拼接没有做好安全过滤,那么将会导致命令注入风险,服务器权限将会被控制
防护方式:
- 对动态的值尽可能设置白名单进行验证
- 如果某些位置无法白名单,需要尝试对数据类型进行校验
- 特殊字符黑名单的过滤,或者转义。
越权漏洞
- 认证:你是谁?
- 授权:你能做什么?
- 越权: 资源访问或操作时候主体权限没有进行校验就会造成越权问题,细分为: 未授权、水平越权和垂直越权
水平越权
- 黑灰产场景: 订单查询功能提供订单id即可查询订单详情,这里攻击者可以遍历orderld获取其他用户的订单信息
- 防护方式: 涉及资源id尽量不要使用短id (遍历难度较小) ,同时最重要的一定要最好资源属主校验
垂直越权
- 黑灰产场景: 攻击者可以通过开通另外的测试管理员账户抓包获取接口,或者通过逆向前端代码方式获取实际接口,然后绕过前端直接尝试访问后端接口,获取数据详情。
- 防护方式: 如果是简单的场景,可以将接口在路由级别进行分组,对不同的API分组引入Middleware进行权限拦截,Middleware获取当前用户角色以确定是否可以访问此接口。
SSRF
SSRF又称服务端请求伪造攻击,指攻击者利用后端服务器为跳板,让后端服务向非预期网络地址(主要指内网地址)发出恶意请求,获取敏感信息或执行恶意操作。
- 服务端流程:服务端请求stockApi,获取结果返回。
- 攻击者:将stockApi参数改为内网地址,访问内网资源
防护方式:对url的host进行白名单过滤,获取对host解析的ip进行判定,是否是内网地址。
文件上传漏洞
找到公开的上传点(如视频创作/文章创作/客服反馈 等),上传恶意文件 (恶意视频、图片),获取图片url,然后直接分享url至外部恶意网站或QQ/微信群。
防护方案:
- 限制文件类型:如果系统只需要图片类型,可以从服务端解析文件格式,限制只能传入特定的文件格式。
- 站库分离:应用部署的位置和上传的文件分离,一般可以使用TOS、OSS等进行文件存储。
- 防止图床:对图片访问链接进行限制,包括时间限制,访问身份限制等。
客户端漏洞
开放重定向
- 开放重定向: 某些需要重定向到其他站点的功能,往往在参数中携带需要重定向的 URL ,但实际程序逻辑没有控制好重定向的范围,导致攻击者可以构造恶意链接,诱导用户重定向到恶意站点。
- 危害:钓鱼攻击。
- 修复方案:对重定向严格进行白名单控制并正确校验匹配白名单。
XSS
- 跨站脚本 (XSS) 攻击:本质是一种 Script 代码注入, 攻击者往目标 Web 页面里插入恶意 Script 代码,当用户访问页面(有客户端时需要交互)时,嵌入其中 Web 里面的 Script 代码会被执行,从而达到恶意攻击用户的目的。
- 场景:反射型,存储型,Dom型
- 危害:通常的危害包括窃取用户敏感信息,以用户身份执行敏感操作。
防护方法:
-
输入过滤:对输入的特殊字符进行拦截,禁止前端提交特殊字符.
-
输出过滤:
- 当字符输出到Dom时候,对危险字符进行html encode,避免XSS。
- 使用vue/react等框架时候,避免使用危险指令,而应该使用安全指令。v-html/v-text
-
富文本场景:比如文章发布场景,本身是需要提供富文本功能,这时候需要严格限制tag和attribute,可以在代码层面做白名单或者黑名单。
<tag attribute1=’value1’ attribute2=‘value2’ /> -
CSP:用于缓解XSS,理念是对当前站点允许加载什么源的资源、发送什么请求能进行限制。
CSRF
- 跨站请求伪造(CSRF): 允许攻击者诱导用户访问恶意链接,执行用户非预期执行的操作。危害:用户执行敏感操作,如关注其他用户,或者更改账号的安全邮箱等。
- 漏洞利用步骤:
- Step1: 将更改Email的请求生成CSRF表单,并构造钓鱼链接。
- Step2: 发送链接给其他用户。
- Step3: 用户点击链接后成功执行email更改操作。
- 防护方式:防护的核心是判断请求的来源
- CSRF tokens: 首次访问时候给客户端传递一个token,客户端每次访问时候都必须带上此token才能访问。
- SameSite cookies: Strick -> Lax(Default) -> None. 核心是禁止某些场景发送第三方cookie。
- Referer-based validation: 校验 Referer 来源是否是合法站点。
点击劫持
点击劫持(clickjacking)是一种在网页中将恶意代码等隐藏在看似无害或者存在诱导的内容(如按钮)之下,并诱使用户点击的手段,用户点击后往往会执行一些非预期的操作。
漏洞场景:考虑如下删除账号功能,如果目标站点CSRF防护做的很到位,无法直接构造CSRF钓鱼页面,这时候可以考虑在钓鱼页面iframe原始页面,并且覆盖一层诱导性的文字。
漏洞利用步骤:
- 参考如下代码构造钓鱼页面链接。
- 发送链接给其他用户。
- 用户访问链接,点击「Win 300$」时候,实际是点击「Delete Account」
防护方式:防护的核心是不让非预期的网站 iframe 我的站点
- X-Frame-Options:DENY / SAMEORIGIN
- CSP: frame-ancestors指令,用于设置允许frame的source列表。
CORS跨域配置错误
CORS:全称是“跨域资源共享”(Cross-origin resource sharing),用以解决网页应用跨域访问的需求。
CORS 错误配置:CORS本身不存在漏洞,而是由于开发者在配置CORS过程中,错误配置跨域访问Allow List, 导致非预期的站点可以进行跨域访问,最终可能导致信息泄漏。
案例场景:网站个人信息页提供查看个人信息功能,相关接口允许跨域访问且存在配置问题。
防护方式:核心是正确设置跨域白名单
代码层:Middleware统一处理
网关层:Nginx反代统一拦截处理
WebSocket
区别于http,只是不同的交互协议,本质上http 服务端的漏洞,在 WebSocket 上也可能存在。因此重点讨论 WebSocket 架构的一些问题。
- WSS 和 WS:WSS (WebSockets over SSL/TLS),提供加密信道。杜绝掉一些中间人攻击。
- 数据校验:SQL/XSS/RCE 等漏洞仍然可能存在
- CSWSH:Cross-Site WebSocket Hijacking,即在使用cookie作为认证方式时候,如果 WebSocket 服务端没有校验好请求来源(Origin),将导致 WebSocket 会话劫持。
CSWSH 防护手段:
- Cookie鉴权:限制请求的Origin。
- ticket/token鉴权:http服务提供接口,用于获取临时的身份凭证,并传递到WebSocket的初始化流程中
总结
网络安全漏洞是指系统或网络中存在的可能导致数据泄露、更改或破坏的缺陷或弱点。这些漏洞可能会被黑客利用,从而进行非法访问、篡改、窃取、伪造等恶意行为,造成损失。常见的网络安全漏洞包括SQL注入、跨站脚本、恶意代码、缓冲区溢出、弱密码等。为了防范网络安全漏洞,我们需要采取一系列的安全措施,例如使用安全的协议、加密数据、设置强密码、安装杀毒软件等。同时,我们还需要定期更新系统和软件,及时发现和修复漏洞,以保障网络和数据的安全。