通常网站漏洞会被攻击者出于政治、经济、竞争等目的利用,对网站造成一定的损失。本文只是简单讨论漏洞出现的原因,以及一些防御策略。
网站组成
一个网站主要由前端(客户端)、后端(服务端)、网关(nginx)、以及前后端之间交互的协议组成组成。 网站的各个部分都有被攻击的风险,一般来说按照攻击者攻击的目标可以分为针对客户端的攻击和针对服务端的攻击。
漏洞的影响
造成的影响主要包括数据泄露、拒绝服务、系统劫持等,主要总结来看,主要危害了系统的以下几个特性:
- 机密性:只有授权用户可以获取信息
- 完整性:数据不被非法篡改和和破坏
- 可用性:用户可以正常访问数据
服务端组件漏洞
1.第三方组件漏洞(供应链安全)
我们在网站开发中不可避免地要使用一些第三方组件。如果第三方组件是有漏洞的,则攻击者可以利用第三方组件(如log4j、FastJson、Openssl等组件)的漏洞,对我们的网站进行攻击。 第三方组件的漏洞依赖于审计。在实际使用的过程中,我们通常使用自动化的工具(如dependency-check-maven)对网站开发的第三方依赖组件(如maven、pip、go mod、npm)进行检测。如果有条件也可以组织专门的人员对相关组件进行审计和漏洞挖掘工作。
2.SQL注入
SQL注入通常源于网站对用户输入没有足够的判断和过滤处理。网站接收用户输入,作为SQL语句的一部分,这导致用户可以通过控制SQL语句与后端的数据库进行交互。 SQL注入通常是因为使用了不安全的函数、框架或者直接拼接导致的。 防御方法:
- 尽量不直接拼接SQL语句,应该使用预编译和安全的ORM框架。预编译方法或者安全的ORM框架通常将用户输入作为参数(变量)的值,参数值与SQL在语义上是分离的,避免了直接将语句与用户输入拼接。
- 需要避免使用ORM或Web框架中的不安全的构造SQL语句的方法。比如尽量不使用MyBatis框架中
$作为变量的表示,因为$符是直接将接收到的变量值作为字符串拼接到sql语句中,很容易出现SQL注入。 - 对输入进行转义,或者限制特殊符号、特殊语句的输入。因为在SQL注入的利用过程中不可避免的要涉及到特殊字符以及特殊语句(如union、select)等的输入,所以限制是有效的,不过要小心攻击者通过编码等方式绕过。
- 控制用户输入的变量类型。
3.命令执行
通常是网站直接将用户的输入作为命令的一部分执行(类似SQL注入) 防御:
- 白名单
- 黑名单或转义
- 特殊字符过滤
- 最关键的其实是不要让用户执行命令的机会。
- 如果确需要让用户执行命令,比如Marscode 的AI刷题和AI练中学功能,就需要执行用户的代码(用户可以用system、eval等执行系统命令),可以使用虚拟化技术,让代码在docker容器中运行,防止用户访问宿主机的敏感数据,又或者可以使用诸如Seccomp等沙箱技术进行限制。
4.越权漏洞
越权漏洞是Web应用程序中一种常见的安全漏洞.越权漏洞可以导致用户访问自己被限制访问的数据,通常是因为权限控制不严格导致的. 一般来说,越权漏洞分为水平越权和垂直越权.在此不做过多阐述。通常来说防御越权漏洞可以使用相关的中间件在用户访问时对用户身份进行验证(通常需要获取用户的session等信息)
5.SSRF
SSRF,Server-Side Request Forgery,服务端请求伪造,是一种由攻击者构造形成由服务器端发起请求的一个漏洞。一般情况下,SSRF 攻击的目标是从外网无法访问的内部系统。 漏洞形成的原因大多是因为服务端提供了从其他服务器应用获取数据的功能且没有对目标地址作过滤和限制。通常攻击者会利用该漏洞实现对内网资源的访问. 一般来说,SSRF漏洞可以利用对网站访问的url设定白名单,限制网站可以访问的资源.
6.文件上传
文件上传漏洞是指用户上传了一个可执行脚本文件,并通过此文件获得了执行服器端命令的能力。完成这一攻击需要这样几个条件,一是上传的文件能够被 Web容器执行,其次用户能从 Web上访问这个文件,最后,如果上传的文件被安全检查、格式化、图片压缩等功能改变了内容,则可能导致攻击失败。 防御:
- 限制文件类型:检查上传文件的类型,可以通过二进制的方法解析文件的格式。
- 站库分离:使用TOS\OSS等方式存储文件,保证网站服务器与上传的文件是隔离的。
- 限制上传的文件不可执行。
客户端漏洞
通常在前端开发中比较常出现。
1.重定向
攻击者可以控制网站中重定向到其他网站的url,导致用户重定向到恶意网站.防御方法是对重定向的url进行限制。
2.XSS
将恶意的代码(一般是Javascript)嵌入用户页面,当用户访问的页面时代码会执行,从而窃取Cookie等关键信息. 防御方法:
- 输入过滤:过滤特殊字符,禁止提交特殊字符.要小心编码绕过
- 输出过滤:将输出的字符串进行转义,还有要避免使用不安全的方法。
- 严格限制输出的html的tag和参数
- 设定CSP策略,即允许当前站点加载的原资源和发送到请求。
3.CSRF
允许攻击者构造恶意链接,使受害者执行非预期操作 防御:
- csrf-token
- 同源策略或referer策略等.
总结
1.用户输入不可信,通常情况下我们要对用户的输入做足够的验证。 2.前端的过滤很容易被绕过,所以在开发过程中,前后端都需要对用户请求做相应的过滤。 3.开发时需要使用安全的方法,要充分了解使用的方法的特性。