网站常见安全漏洞 探究 |青训营

337 阅读6分钟

1. 网站的基本构成

一个网站主要由以下几个要素组成:

  • 前端: JavaScript / vue / react
  • 网关: nginx
  • 后端: Go /Java / Node.js
  • 前后端交互: HTTP / WebSocket

2. 网站攻击者意图及常见的安全事件

网站攻击者往往出于以下意图对网站进行攻击:

  • 政治目的。出于政治目的实施黑客攻击,可能涉及窃取关键系统的机密数据、破坏关键系统正常运行。
  • 经济目的。网站数据具有很高的经济价值,攻击者通过网站漏洞违法获取数据并进行售卖。
  • 竞争目的。同类厂商之间可能由于竞争原因,对竞品网站进行一些攻击,以达到让对方站点无法运行的目的。
  • 个人炫技、泄愤。用攻击对方网站方式彰显自己的技术实力,或者对某些仇恨的系统发起攻击。

攻击往往会造成以下安全事件:

  • 数据泄露
  • 服务瘫痪
  • 成果失窃
  • 系统劫持

3. 网站攻击形式及漏洞分类

3.1 网站攻击形式

依据前后端形式网站攻击可分为对客户端的漏洞攻击以及对服务端(后端)漏洞攻击。

漏洞分类可分为以下客户端漏洞和服务端漏洞两类:

image.png

4. 服务端漏洞

4.1 第三方组件漏洞

第三方组件漏洞是指在应用程序中使用的第三方软件或库中存在的安全漏洞。第三方组件可以是开源软件、商业软件或其他外部库。

第三方组件漏洞可能会导致以下安全风险和问题:

  • 远程代码执行(Remote Code Execution,RCE):某些漏洞可能允许攻击者在受影响的服务器上执行恶意代码,从而控制服务器并执行任意操作。
  • 身份验证绕过:某些漏洞可能允许攻击者绕过身份验证机制,以未经授权的方式访问应用程序或系统。
  • 敏感信息泄露:某些漏洞可能会导致敏感信息(如个人身份信息等)泄露给攻击者。
  • 拒绝服务攻击(DoS):某些漏洞可能会导致应用程序或系统崩溃,从而使其无法提供正常的服务。

减少第三方组件漏洞风险,通常可以采取以下措施:

  • 及时更新和升级:及时更新和升级使用的第三方组件,获取最新的修复程序和安全补丁。
  • 定期审查漏洞公告:定期关注第三方组件供应商的漏洞公告和安全通知,了解已经发现的漏洞和可用的修复程序。
  • 使用可信任的第三方组件:在使用第三方组件时,要选择经过审查的组件。针对java可以选择使用dependency-check-maven检查项目以来的组件是否存在安全漏洞。
  • 实施安全测试:对应用程序进行安全测试,包括对使用的第三方组件进行漏洞扫描和安全评估。

4.2 SQL注入

SQL语句静态模板和动态数据部分没有严格区分,如果在数据项中加入了某些SQL语句关键字(比如 SELECT、DROP等),这些SQL语句就可以在数据库写入或读取数据时得到执行。攻击者可以通过在登录表单中输入恶意的用户名和密码来绕过身份验证,以其他用户身份登录,或是注入恶意的SQL代码来窃取数据库中存储的敏感信息,修改、删除数据库中的数据,具有极大的风险。

使用ORM框架时一些不安全的操作:

  • [Java]错误使用ORM框架,或者ORM框架本身存在安全问题。使用Mybatis-plus 的危险函数,比如inSql,支持直接SQL拼接,存在SQL注入风险。
  • [Java]Mybatis 使用 [#] 构建SQL模版。应该使用[$]。
  • [Go]业务场景经常遇到根据用户定义的字段进行排序的功能,如果直接将用户输入字段作为维度带到Order则会产生SOL注入。例如假设GORM语句为: db.Order(param).Find(&products)。 image.png

减少SQL注入漏洞风险,通常可以采取以下措施:

  • 尽量不要基于数据库的Raw方法拼接构造SQL语句,而应该使用预编译、ORM框架。
  • 使用ORM框架时,应该注意框架特性,可能存在不安全的写法导致的SQL注入问题。
  • 在复杂场景一定要使用拼接SOL,需要对外部输入进行转义。
  • 最小权限原则。为数据库用户分配最小的权限,以限制攻击者对数据库的访问和操作。确保应用程序连接数据库的账号只具有执行必要操作的权限。
  • 在应用程序中实现适当的错误处理和日志记录机制,以便及时发现和识别潜在的SQL注入攻击。
  • 定期更新和升级使用的数据库管理系统和相关组件,以获取最新的安全补丁和修复程序。

4.3 命令执行

代码中遇到需要调用某个命令才能完成的功能时候,会涉及到命令拼接,类似SQL注入。如果命令拼接没有做好安全过滤,那么将会导致命令注入风险,服务器权限将会被控制。

减少命令执行漏洞风险,通常可以采取以下措施:

  • 对动态的值尽可能设置白名单进行验证。
  • 如果某些位置无法白名单,需要尝试对数据类型进行校验。
  • 特殊字符黑名单的过滤,或者转义。

4.4 越权漏洞

认证目的是为了确定当前用户是谁。 授权目的是为了确定当前用户可以做什么。 而越权就是资源访问或操作时候主体权限没有进行校验就会造成越权问题,可以细分为:

  • 未授权
  • 水平越权
  • 垂直越权

未授权 水平越权

例如: 订单查询功能提供订单id即可查询订单详情,攻击者可以遍历orderld获取其他用户的订单信息。 防护方法:涉及资源id尽量不要使用短id,因为遍历难度较小,同时一定要做好资源属主校验。 垂直越权

例如:攻击者可以通过开通另外的测试管理员账户抓包获取接口,或者通过逆向前端代码方式获取实际接口,然后绕过前端,直接尝试访问后端接口,获取数据详情。 防护方法: 若是简单场景,可以将接口在路由级别进行分组,对不同的API分组引入Middleware进行权限拦截,Middleware获取当前用户角色以确定该用户是否可以访问此接口。

4.5 SSRF

SSRF又称服务端请求伪造攻击,指攻击者利用后端服务器为跳板,让后端服务向非预期网络地址(主要指SSRF内网地址) 发出恶意请求,获取敏感信息或执行恶意操作。

SSRF攻击可能导致以下问题:

  • 访问内部资源。攻击者可以通过SSRF攻击访问服务器内部的敏感资源,如内部API、数据库、文件系统等。这可能导致信息泄露、数据篡改或系统崩溃等问题。
  • 攻击外部系统。攻击者可以通过SSRF攻击向外部系统发送恶意请求,例如攻击其他服务器、云服务等。这可能导致远程命令执行、服务拒绝或其他安全漏洞的利用。
  • 内部端口扫描。攻击者可以通过SSRF攻击利用服务器的内部网络访问能力,扫描内部网络中的其他主机和端口,从而获取敏感信息或发现其他攻击目标。

例如:

  • 服务端流程:服务端请求stockApi,获取结果返回。
  • 攻击者: 将stockApi参数改为内网地址,访问内网资源。

减少SSRF漏洞风险,通常可以采取以下措施:

  • 输入验证和过滤。对用户输入的URL进行验证和过滤,确保只允许合法的URL。可以使用白名单或正则表达式来限制URL的格式和协议。
  • 使用安全配置。服务器应该配置为仅允许访问必要的资源和端口,限制对内部网络的访问。禁用或限制服务器发起对外部网络的请求,特别是对不可信任的URL。
  • 使用代理。使用代理服务器来限制服务器对外部资源的访问。代理服务器可以过滤和检查发出的请求,防止恶意的SSRF攻击。
  • 最小权限原则。为服务器分配最小的权限,限制其对内部资源的访问。确保服务器只能访问必要的资源,并且只能执行必要的操作。
  • 安全更新和补丁。定期更新和升级服务器软件和相关组件,以获取最新的安全补丁和修复程序,以减少SSRF攻击的风险。

4.6 文件上传漏洞

文件上传漏洞即为找到公开的上传点 (如视频创作/文章创作/客服反馈 等)上传恶意文件(恶意视频、图片),获取图片url,然后直接分享url至外部恶意网站或QQ/微信群。

减少文件上传漏洞风险,通常可以采取以下措施:

  • 限制文件类型。如果系统只需要图片类型,可以从服务端解析文件格式,限制只能传入特定的文件格式
  • 站库分离。应用部署的位置和上传的文件分离,一般可以使用TOS、OSS等进行文件存储.
  • 防止图床。对图片访问链接进行限制,包括时间限制,访问身份限制等。

5. 客户端漏洞 (漏洞修复往往依赖服务端)

5.1 开放重定向

某些需要重定向到其他站点的功能,往往在参数中携带需要重定向的 URL,但实际程序逻辑没有控制好重定向的范围,导致攻击者可以构造恶意链接,诱导用户重定向到恶意站点。其危害主要形式是钓鱼攻击。

减少开放重定向漏洞风险,通常可以采取以下措施:

  • 对重定向严格进行白名单控制并正确校验匹配白名单。

5.2 XSS 跨站脚本攻击

本质是一种 Script 代码注入,攻击者往目标 Web 页面里插入恶意 Script代码,当用户访问页面 (有客户端时需要交互)时,嵌入其中 Web 里面的 Script 代码会被执行,而达到恶意攻击用户的目的。

主要分为以下几种类型:

  • 存储型XSS。攻击者将恶意脚本代码存储在服务器上的数据库或文件中,当其他用户浏览包含恶意脚本的页面时,恶意脚本会从服务器上加载并在用户浏览器中执行。
  • 反射型XSS。攻击者将恶意脚本代码作为参数附加在URL中,当用户点击包含恶意脚本的链接时,恶意脚本会从URL中提取并在用户浏览器中执行。
  • DOM-based XSS。攻击者通过修改网页的DOM结构来注入恶意脚本代码,当用户浏览该网页时,恶意脚本会被执行。

例如:

  • Step1: 构造恶意链接,将username设置为恶意payload。
  • Step2: 攻击者通过网站反馈入口,向管理员/运营人员发送恶意链接。
  • Step3: 攻击者的服务器成功收到管理员/运营人员的Session Cookie。
  • Step4: 浏览器替换cookie为管理员的获取管理员权限。

XSS会造成的危险:

  • 盗取用户信息。攻击者可以通过XSS攻击窃取用户的敏感信息,如用户名、密码、令牌等。
  • 会话劫持。攻击者可以通过XSS攻击获取用户的会话令牌,从而劫持用户的会话,执行未经授权的操作。
  • 恶意重定向。攻击者可以通过XSS攻击将用户重定向到恶意网站,从而进行钓鱼攻击、安装恶意软件等。

减少XSS漏洞风险,通常可以采取以下措施:

  • 输入验证和过滤。对用户输入的数据进行验证和过滤,确保只允许合法的数据。可以使用白名单正则表达式来限制输入的格式和内容。
  • 输出编码。在将用户输入的数据输出到网页上时,进行适当的编码处理,确保恶意脚本不会被执行。可以使用HTML实体编码JavaScript转义来防止XSS攻击。
  • 使用vue/react等框架时候,避免使用危险指令,而应该使用安全指令。v-html/v-text
  • 使用安全的API和框架。使用安全的API和框架来处理用户输入和输出,这些API和框架通常提供了内置的安全机制来防止XSS攻击。
  • 设置HTTP头部。通过设置适当的HTTP头部,如Content-Security-Policy(CSP)X-XSS-Protection,可以增加浏览器的安全性,防止XSS攻击。
    • Content-Security-Policy: default-src 'self', img-src *; media-src example.org example.net;
    • script-src userscripts.example.com
  • 富文本场景。比如文章发布场景,本身是需要提供富文本功能,需要严格限制tagattribute,可以在代码层面做白名单或者黑名单
  • 安全教育和意识。提高用户和开发人员的安全意识,指导如何防止XSS攻击,避免点击可疑链接和输入不可信的数据。

5.3 CSRF

跨站请求伪造(CSRF) : 允许攻击者诱导用户访问恶意链接,执行用户非预期执行的操作。

CSRF会造成的危险:

  • 未经授权的操作.攻击者可以在用户不知情的情况下执行一些敏感操作,如修改用户信息、发起转账、删除数据等。
  • 数据篡改.攻击者可以通过CSRF攻击修改用户的数据,如发表恶意评论、发送垃圾邮件等。

例如:

  • Step1: 将更改Email的请求生成CSRF表单,并构造钓鱼链接。
  • Step2: 发送链接给其他用户。
  • Step3: 用户点击链接后成功执行email更改操作。

减少CSRF漏洞风险,通常可以采取以下措施:

  • 随机令牌(CSRF tokens)。在每个用户请求中包含一个随机生成的令牌,并将该令牌与用户会话绑定。在服务器端验证请求时,检查令牌的有效性,如果令牌无效,则拒绝该请求。
  • SameSite Cookies。设置Cookie的SameSite属性为Strict或Lax,限制Cookie的跨域传递,从而减少CSRF攻击的风险。Strick -> Lax(Default) -> None. 核心是禁止某些场景发送第三方cookie。
  • Referer检查(Referer-based validation)。在服务器端验证请求的Referer头部,确保请求来源于合法的网站。但需要注意,Referer头部可能被一些浏览器或代理服务器禁用或篡改,因此不能完全依赖Referer检查来防止CSRF攻击。
  • 双重确认。在执行敏感操作之前,要求用户进行双重确认,如输入密码、验证码等。这样即使发生了CSRF攻击,攻击者也无法执行敏感操作。
  • 提高用户的安全意识,指导如何防止CSRF攻击,避免点击可疑链接和访问不可信的网站。

5.4 点击劫持 clickjacking

点击劫持 (clickjacking)是一种在网页中将恶意代码等隐藏在看似无害或者存在诱导的内容(如按钮)之下,并诱使用户点击的手段,用户点击后往往会执行一些非预期的操作。

例如: 删除账号功能,如果目标站点CSRF防护到位,无法直接构造CSRF钓鱼页面。这时候可以在钓鱼页面iframe原始页面,并且覆盖一层诱导性的文字。

  • Step1: 构造钓鱼页面链接。
  • Step2: 发送链接给其他用户。
  • Step3: 用户访问链接,点击[Win 300$] 时候,实际是点击 [Delete Account]。

减少点击劫持漏洞风险,通常可以采取以下措施: 核心是不让非预期的网站 iframe 站点

  • X-Frame-Options: DENY / SAMEORIGIN
  • CSP: frame-ancestors指令,用于设置允许frame的source列表.
    • Content-Security-Policy: frame-ancestors ;
    • Content-Security-Policy. frame-ancestors 'self' example.org example.com https.//store.example.com;

5.5 CORS跨域配置错误

CORS全称是“跨域资源共享”(Cross-origin resource sharing),用以解决网页应用跨域访问的需求. CORS错误配置: CORS本身不存在漏洞,而是由于开发者在配置CORS过程中,错误配置跨域访问 Allow List,导致非预期的站点可以进行跨域访问,最终可能导致信息泄漏.

image.png

例如: 网站个人信息页提供查看个人信息功能,相关接口允许跨域访问且存在配置问题。 Step1: 构造钓鱼页面URL: exploit-0afa001a03b84b8980e775a6015b00de.exploit-server.net/exploit Step2: 在钓鱼页面后台监控访问日志发起受害者成功点击了钓鱼页面,并且将accountDetail信息回传。

减少CORS跨域配置漏洞风险,通常可以采取以下措施:

核心是正确设置跨域白名单

  • 代码层: Middleware统一处理
  • 网关层: Nginx反代统一拦截处理

5.6 WebSocket

WebSocket也是交互协议。http服务端存在的漏洞,WebSocket也可能存在。

  • WSS 和 WS: WSS(WebSockets over SSL/TLS),提供加密信道。杜绝掉一些中间人攻击。
  • 数据校验: SQL/XSS/RCE 等漏洞仍然可能存在。
  • CSWSH: Cross-Site WebSocket Hijacking,即在使用cookie作为认证方式时候,如果 WebSocket 服务端没有校验好请求来源 (Origin) ,将导致 WebSocket 会话劫持。

黑产设置钓鱼页面,用户一旦访问后,用户 WebSocket 会话就可能会被监听。

CSWSH 防护方法:

  • Cookie鉴权: 限制请求的Origin。
  • ticket/token鉴权: http服务提供接口,用于获取临时的身份凭证,并传递到WebSocket的初始化流程中.

6. 结语

在学习网站常见安全漏洞的过程中,我深刻认识到网络安全的重要性。网站作为用户与互联网的桥梁,承载着大量的用户数据和个人隐私。然而,各种安全漏洞的存在给这些数据带来了巨大的风险。

我意识到保护用户数据的责任重大,不仅是为了符合法律法规的要求,更是为了维护用户的权益和信任。我们必须时刻保持警惕,不断学习和了解最新的安全威胁和防御技术,采取有效的安全措施来保护网站和用户的安全。

同时,安全教育也是至关重要的一环。用户需要了解常见的网络安全威胁,学会识别可疑链接和行为,并采取相应的防护措施。只有共同努力,形成全社会的网络安全意识,才能构建一个更加安全可靠的网络环境。

维护网站安全是一项永恒的任务,我们应该不断改进和完善安全措施,保护用户的数据和隐私。只有这样,我们才能让用户放心地使用网站,促进互联网的健康发展。