一.简介
一个网站通常由前端(JavaScript、vue、react)、网关(nginx)、后端(go、java、node)、前后端交互(http、websocket)组成。每一部分或多或少都会存在安全的问题,这也就是网站漏洞产生的原因。我们日常生活中都会听到数据泄漏、服务瘫痪、成果失窃、系统劫持的安全事件,在漏洞通常又分为服务端漏洞和客户端漏洞,接下来一一介绍。
二.漏洞介绍
1.第三方组件
产生原因:由于第三方组件存在安全漏洞,导致个人开发网站也存在漏洞。
危害:通过第三方组件,攻击者可以进入后台修改资料,进入金融系统盗取钱财,进入OA系统可以获取企业内部资料,进入监控系统可以进行实时监控等等。
防护:针对java可以选择使用dependency-check-maven检查项目以来的组件是否存在安全漏洞。
2.SQL注入
产生原因:当Web应用向后台数据库传递SQL语句进行数据库操作时。如果对用户输入的参数没有经过严格的过滤处理,那么攻击者就可以构造特殊的SQL语句,直接输入数据库引擎执行,获取或 修改数据库中的数据。例如:Java错误使用语言框架,或者语言框架本身存在安全问题使用Mybatis-plus 的危险函数,比如inSql,支持直接SQL拼接,存在SQL注入风险,Mybatis 使用$ 构建SQL模板。
危害:可盗取网站敏感信息、绕过网站后台认证、借助SQL注入漏洞提权获取系统权限、读取文件信
防护:1.尽量不要基于DB的Raw方法拼接构造SQL语句,而应该使用预编译、ORM框架。2.使用ORM框架时,应该注意框架中的特性,可能存在不安全的写法导致的SQL注入问题。3.在复杂场景一定要使用拼接SOL,需要对外部输入进行转义。
3.命令执行
产生原因:代码中遇到需要调用某个命令才能完成的功能时候,会涉及到命令拼接,如果命令拼接没有做好安全过滤,那么将会导致命令注入风险,服务器权限将会被控制。
危害:在代码中当修改storeId为[id] 时候,注入命令id,可能产生漏洞代码。
防护:1.对动态的值尽可能设置白名单进行验证。2.如果某些位置无法白名单,需要尝试对数据类型进行校验。3.特殊字符黑名单的过滤,或者转义。
4.SSRF(服务器端请求伪造)
产生原因:SSRF又称服务端请求伪造攻击,指攻击者利用后端服务器为跳板,让后端服务向非预期网络地址 (主要指内网地址) 发出恶意请求,获取敏感信息或执行恶意操作。
危害:1.扫描内网(主机、端口)。2.向内部任意主机的任意端口发送精心构造的payload 3.攻击内网的Web应用。4.读取任意文件。5.拒绝服务攻击。
防护:1.统一错误信息,避免用户根据错误信息来判断远程服务器的端口状态。2.限制请求的端口为http的常用端口,比如:80、443、8080等。3.禁用不需要的协议,仅允许http和https。 4.根据请求需求,可以将特定域名加入白名单,拒绝白名单之外的请求。5.后台代码对请求来源进行验证。
5.文件上传
产生原因:在文件上传的功能处,若服务端未对上传的文件进行严格验证和过滤,导致攻击者上传恶意的脚本文件时,就有可能获取执行服务端命令的能力,称为文件上传漏洞。
危害:1.上传恶意文件。2.getshell。 3.控制服务器。
防护:1.限制文件类型:如果系统只需要图片类型,可以从服务端解析文件格式,限制只能传入特定的文件格式。2.站库分离: 应用部署的位置和上传的文件分离,一般可以使用TOS、OSS等进行文件存储。3.防止图床: 对图片访问链接进行限制,包括时间限制,访问身份限制等。
6.XSS(跨站脚本攻击)
产生原因:本质是一种 Script 代码注入,攻击者往目标 Web 页面里插入恶意 Script代码,当用户访问页面 (有客户端时需要交互时,嵌入其中 Web 里面的 Script 代码会被执行从而达到恶意攻击用户的目的。
危害:包括窃取用户敏感信息,以用户身份执行敏感操作。
防护:1.对用户的输入进行合理验证。2.对特殊字符(如 <、>、 ’ 、 ”等)以及javascript 等字符进行过滤。3.根据数据位置设置恰当的输出编码。4.根据数据将要置于 HTML 上下文中的不同位置(HTML 标签、HTML 属性、JavaScript 脚本、CSS、URL),对所有不可信数据进行恰当的输出编码。5.避免攻击者利用XSS漏洞进行Cookie劫持攻击。
7.CSRF(跨站请求伪造 )
产生原因:攻击者诱导用户访问恶意链接,执行用户非预期执行的操作。
危害:用户执行敏感操作,如关注其他用户,或者更改账号的安全邮箱等。
防护:1.检查HTTP Referer是否是同域。2.限制Session Cookie的生命周期,减少被攻击的概率 3.使用验证码。4.使用一次性token。
8.XXE(XML外部实体注入)
产生原因:XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载, 导致用户可以控制外部的加载文件,造成XXE漏洞。
危害:读取任意网站,内网端口探测,拒绝服务攻击。
防护:1.使用开发语言提供的禁用外部实体的方法。2.过滤用户提交的XML数据
9.远程代码执行漏洞
产生原因:应用程序中有时会调用一些系统命令函数,比如php中使用system、exec、shell_exec等 函数可以执行系统命令,当攻击者可以控制这些函数中的参数时,就可以将恶意命令拼接 到正常命令中,从而造成命令执行攻击。
危害:用户可以控制输入的内容,输入的内容被当作命令执行。
防护:1.尽量不要使用命令执行函数。2.客户端提交的变量在进入执行命令函数方法之前,一定要做好过滤,对敏感字符进行转义 3.在使用动态函数之前,确保使用的函数是指定的函数之一。
10.WebSocket
产生原因:区别于http,只是不同的交互协议,本质上http 服务端的漏洞,在 WebSocket 上也可能存在。因此重点讨论 WebSocket 架构的一些问题。
危害:如果 WebSocket 服务端没有校验好请求来源 (Origin) ,将导致 WebSocket 会话劫持。
防护:1.Cookie鉴权: 限制请求的Origin。2.ticket/token鉴权: http服务提供接口,用于获取临时的身份凭证,并传递到WebSocket的初始化流程中。
三.总结
1.网站运营者: 网络运营者应当采取技术措施和其他必要措施,确保其收集的个人信息安全,防止信息泄露、毁损、丢失。在发生或者可能发生个人信息泄露、毁损、丢失的情况时,应当立即采取补救措施,按照规定及时告知用户并向有关主管部门报告。
2.组织/个人: 任何个人和组织不得窃取或者以其他非法方式获取个人信息,不得非法出售或者非法向他人提供个人信息。