Go应用程序需要注意的漏洞备忘单

译文
开发 前端 后端 开发工具
每种语言、框架或环境的使用都会使应用程序暴露于一组独特的漏洞中。修复应用程序漏洞的第一步是知道需要寻找什么。

Go应用程序中需要注意27个漏洞,其中包括任意文件写入、目录遍历、反序列化等。  

保护应用程序并不是最简单的事情。而一个应用程序有许多组件:服务器端逻辑、客户端逻辑、数据存储、数据传输、API等等。而为了保护所有这些组件的安全,构建安全的应用程序似乎真的令人生畏。  

值得庆幸的是,大多数现实生活中的漏洞都有相同的根源。通过研究这些常见的漏洞类型、发生的原因以及如何发现它,可以学会预防,并保护应用程序。

每种语言、框架或环境的使用都会使应用程序暴露于一组独特的漏洞中。修复应用程序漏洞的第一步是知道需要寻找什么。以下是影响Go应用程序的27个最常见的漏洞,以及如何找到预防的方法。 

企业需要致力于保护Go应用程序。以下是需要关注的27个漏洞:  

(1)XML外部实体攻击  

XML外部实体攻击(XXE)是指攻击者利用XML解析器读取服务器上的任意一些文件。使用XXE,攻击者还可以检索用户信息、配置文件或其他敏感信息,例如AWS凭证。而为了防止XXE攻击,需要明确禁用这些功能。  

(2)不安全的反序列化  

序列化是将编程语言中的对象(例如Python对象)转换为可以保存到数据库或通过网络传输格式的过程。而反序列化则相反:它是从文件或网络中读取序列化对象并转换回对象的过程。许多编程语言都支持对象的序列化和反序列化,其中包括Java、PHP、Python和Ruby。  

不安全的反序列化是一种漏洞,当攻击者可以操纵序列化对象并在程序流程中造成意想不到的后果时,就会出现这种漏洞。不安全的反序列化漏洞通常是非常关键的漏洞:不安全的反序列化漏洞通常会导致身份验证绕过、拒绝服务,甚至是执行任意代码。  

为了防止不安全的反序列化,需要首先留意最新的补丁并保持依赖关系。许多不安全的反序列化漏洞是通过依赖项引入的,因此需要确保其第三方代码是安全的。它还有助于避免使用序列化对象,而是使用简单的数据类型,如字符串和数组。  

(3)远程代码执行  

远程代码执行漏洞(RCE)是攻击者可以在他人的机器上执行其代码时发生的一类漏洞。当Web服务器成为目标时,攻击者通常通过HTTP请求注入恶意输入来实现远程代码执行漏洞(RCE),这些输入被服务器错误地评估为代码。  

在Go中,开发人员经常使用net/rpc或grpc等数据包来允许通过网络远程调用方法。在这种情况下,确保任何过程调用来自受信任的来源非常重要。  

(4)注入  

当应用程序无法正确区分不受信任的用户数据和代码时,就会发生注入问题。例如以上所说的例子,通过代码注入的RCE就是一种注入漏洞。但注入漏洞也以其他方式表现出来。  

(5)SQL注入  

例如,在SQL注入攻击中,攻击者通过注入数据来操纵SQL命令。当应用程序没有正确验证用户输入时,攻击者可以插入SQL语言的特殊字符来扰乱查询逻辑,从而执行任意SQL代码。  

SQL注入能够让攻击者代码更改应用程序SQL查询的结构,以窃取数据、修改数据或可能在底层操作系统中执行任意命令。防止SQL注入的最好方法是使用参数化语句,这使得SQL注入几乎不可能。  

(6)NoSQL注入  

数据库并不总是使用SQL。NoSQL数据库或NotOnlySQL数据库是不使用SQL语言的数据库。NoSQL注入是指将数据注入到这些数据库语言的逻辑中的攻击。NoSQL注入可能与SQL注入一样严重:它们可能导致身份验证绕过和远程代码执行。  

(7)日志注入  

用户可能会执行系统日志记录以监控网络中发生的恶意活动。但是有没有想过其日志文件条目可能会撒谎?与其他系统文件一样,日志文件可能会被恶意行为者篡改。攻击者经常修改日志文件以在攻击期间掩盖他们的踪迹。日志注入是攻击者可以更改其日志文件的方式之一。当攻击者欺骗应用程序在用户的日志文件中写入虚假条目时,就会发生这种情况。  

当应用程序不清理写入日志的输入中的换行符“\n”时,通常会发生日志注入。攻击者可以利用换行符将新条目插入应用程序日志。攻击者可以利用日志中的用户输入的另一种方式是,他们可以将恶意HTML注入日志条目,以尝试在查看日志的管理员的浏览器上触发XSS。  

为了防止日志注入攻击,需要一种方法来区分真实日志条目和攻击者注入的虚假日志条目。一种方法是在每个日志条目前添加额外的元数据,如时间戳、进程ID和主机名。用户还应该将日志文件的内容视为不受信任的输入,并在访问或操作它们之前对其进行验证。  

(8)邮件注入  

许多Web应用程序会根据用户的操作向用户发送电子邮件。例如,如果订阅了新闻媒体上的提要,该网站可能会向用户发送包含提要名称的确认信息。  

当应用程序使用用户输入来确定将电子邮件发送到哪些地址或包含在电子邮件中的内容时,就会发生邮件注入。这可以让垃圾邮件发送者使用其服务器向用户发送大量电子邮件,或者使诈骗者能够通过其电子邮件地址进行社会工程活动。  

(9)模板注入  

模板引擎是一种用于确定网页外观的软件。这些Web模板以Jinja等模板语言编写,为开发人员提供了一种通过将应用程序数据与Web模板相结合来指定如何呈现页面的方法。Web模板和模板引擎一起允许开发人员在Web开发期间将服务器端应用程序逻辑与客户端表示代码分开。  

模板注入是指注入到网页模板中。根据受感染的应用程序的权限,攻击者可能能够使用模板注入漏洞来读取敏感文件、执行代码或提升他们在系统上的权限。  

(10)正则表达式注入  

正则表达式是描述文本中搜索模式的特殊字符串。有时,应用程序让用户提供自己的正则表达式模式,以供服务器执行或使用用户输入构建正则表达式。正则表达式注入攻击或正则表达式拒绝服务攻击(ReDoS)发生在攻击者为正则表达式引擎提供需要很长时间评估的模式的时候。  

值得庆幸的是,通过不从用户输入生成正则表达式模式,并通过构造精心设计的正则表达式模式,其所需的计算时间不会随着文本字符串的增长而呈指数增长,能够可靠地防止正则表达式注入。  

(11)XPath注入  

XPath是一种用于XML文档的查询语言。为XML考虑SQL。XPath用于对存储在XML文档中的数据进行查询和操作。例如,XPath可用于检索存储在XML文档中的员工工资信息。它还可用于对该数据执行数字运算或比较。  

XPath注入是一种注入XPath表达式以改变查询结果的攻击。和SQL注入一样,它可以用来绕过业务逻辑,提升用户权限,泄露敏感数据。由于应用程序经常使用XML在系统和Web服务之间传递敏感数据,因此这些地方更容易受到XPath注入的影响。与其他类型的注入漏洞类似,用户可以通过验证和清理用户输入来防止XPath注入。  

(12)标头注入  

当HTTP响应标头是从不受信任的输入动态构建时,就会发生标头注入。根据漏洞影响的响应标头,标头注入可能导致跨站点脚本、开放重定向和会话固定。  

例如,如果标头可以由URL参数控制,则攻击者可以通过在参数中指定他们的恶意站点来导致开放重定向。攻击者甚至可以在受害者的浏览器上执行恶意脚本,或者通过标头注入向受害者发送完全受控的HTTP响应来强制受害者下载恶意软件。  

可以通过避免将用户输入写入响应标头、从用户输入中去除换行符(换行符用于创建新的HTTP响应标头)以及使用允许列表来验证标头值来防止标头注入。  

(13)会话注入和不安全的cookie  

会话注入是一种标头注入。如果攻击者可以操纵他们的会话cookie的内容,或者窃取其他人的cookie,他们可以欺骗应用程序。攻击者可以通过三种主要方式获取他人的会话:会话劫持、会话篡改和会话欺骗。  

会话劫持是指攻击者窃取别人的会话cookie并将其用作自己的。攻击者经常通过XSS或MITM(中间人)攻击窃取会话cookie。会话篡改是指攻击者可以更改其会话cookie以更改服务器解释其身份的方式。当会话状态在cookie中进行通信并且cookie没有正确签名或加密时,就会发生这种情况。最后,当会话ID是可预测的时,攻击者可以欺骗会话。如果是这种情况,攻击者可以伪造有效的会话cookie并以其他人的身份登录。防止这些会话管理陷阱需要多层防御。  

(14)主机标头中毒

Web服务器通常在同一个IP地址上托管多个不同的网站。HTTP请求到达某个IP地址后,服务器会将请求转发到主机标头中指定的主机。尽管主机标头通常由用户的浏览器设置,但它仍然是用户提供的输入,因此不应被信任。  

如果Web应用程序在使用主机标头构造地址之前未对其进行验证,则攻击者可以通过Host标头发起一系列攻击,例如XSS、服务器端请求伪造(SSRF)和Web缓存中毒攻击。例如,如果应用程序使用主机标头来确定脚本的位置,则攻击者可以提交恶意主机标头以使应用程序执行恶意脚本:  

Go

1 scriptURL := fmt.Sprintf("https://%s/script.js",

2  request.Header.Get("Host"))

(15)敏感数据泄露  

当应用程序未能正确保护敏感信息时,就会发生敏感数据泄漏,从而使用户能够访问他们不应该获得的信息。这些敏感信息可能包括有助于攻击的技术细节,例如软件版本号、内部IP地址、敏感文件名和文件路径。它还可能包含允许攻击者对应用程序进行源代码审查的源代码。有时,该应用程序会泄露用户的私人信息,例如他们的银行帐号、电子邮件地址和邮寄地址。  

应用程序泄漏敏感技术细节的一些常见方式是通过描述性响应头、带有堆栈跟踪或数据库错误消息的描述性错误消息、系统文件系统上的开放目录列表,以及在HTML和模板文件中显示注释。

(16)身份验证绕过  

身份验证指的是在执行敏感操作或访问敏感数据之前证明自己的身份。如果未在应用程序上正确实施身份验证,攻击者可以利用这些错误配置来访问他们不能够访问的功能。

(17)访问控制不当  

身份验证绕过问题本质上是不正确的访问控制。当应用程序中的访问控制实施不当并且可以被攻击者绕过时,任何时候都会发生不当的访问控制。然而,访问控制不仅仅包括身份验证。虽然身份验证要求用户证明他们的身份:“你是谁?”,但授权要求应用程序“允许此用户做什么?”。适当的身份验证和授权共同确保用户无法访问超出其权限的功能。  

为用户配置授权有多种方式:基于角色的访问控制、基于所有权的访问控制、访问控制列表等。  

(18)目录遍历  

目录遍历漏洞是另一种不恰当的访问控制。当攻击者可以通过操纵用户输入字段中的文件路径来查看、修改或执行他们不应访问的文件时,就会发生这种情况。这一过程涉及通过将../字符或其他特殊字符添加到文件路径来操作应用程序,用于引用文件的文件路径变量。../序列指的是Unix系统中当前目录的父目录,因此通过将其添加到文件路径中,通常可以访问web目录之外的系统文件。  

攻击者通常可以使用目录遍历来访问敏感文件,如配置文件、日志文件和源代码。为了防止目录遍历,应该验证插入到文件路径中的用户输入,或者避免直接引用文件名并改用间接标识符。  

(19)任意文件写入  

任意文件写入漏洞的工作方式与目录遍历类似。如果应用程序将文件写入底层机器,并通过用户输入确定输出文件名,则攻击者可能能够在他们想要的任何路径上创建任意文件或覆盖现有系统文件。攻击者可能能够更改密码文件或日志文件等关键系统文件,或将他们自己的可执行文件添加到脚本目录中。  

减轻这种风险的最佳方法是不根据任何用户输入创建文件名,包括会话信息、HTTP输入或用户控制的任何内容。应该控制每个创建的文件的文件名、路径和扩展名。例如,在用户每次需要生成唯一文件时生成一个随机的字母数字文件名,还可以在创建文件之前去除用户输入的特殊字符。  

(20)拒绝服务攻击  

拒绝服务攻击或DoS攻击会破坏目标机器,使合法用户无法访问其服务。攻击者可以通过耗尽所有服务器资源、崩溃进程或一次发出过多耗时的HTTP请求来发起DoS攻击。  

拒绝服务攻击很难防御。但是有一些方法可以通过让攻击者尽可能地困难来最小化风险。例如,可以部署提供DoS保护的防火墙,并通过设置文件大小限制和禁止某些文件类型来防止基于逻辑的DoS攻击。  

(21)加密漏洞  

加密问题可能是应用程序中可能发生的最严重的漏洞之一。加密漏洞是指未正确实施加密和散列。这可能导致广泛的数据泄漏和通过会话欺骗绕过身份验证。

开发人员在网站上实施加密时常犯的一些错误是:  

•使用弱算法。

•使用错误的算法达到目的。  

•创建自定义算法。  

•生成弱随机数。  

•将编码误认为加密。  

(22)不安全的TLS配置和不正确的证书验证  

除了正确加密数据存储中的信息之外,用户还需要确保正在与受信任的机器进行通信,而不是与恶意的第三方进行通信。TLS使用数字证书作为其公钥加密的基础,需要在与第三方建立连接之前验证这些证书。用户应该验证其尝试连接的服务器是否具有由受信任的证书颁发机构(CA)颁发的证书,并且证书链中的任何证书都没有过期。  

(23)批量分配  

“批量赋值”是指一次为多个变量或对象属性赋值的做法。当应用程序自动将用户输入分配给多个程序变量或对象时,就会出现批量分配漏洞。这是许多旨在简化应用程序开发的应用程序框架中的一个功能。  

但是,这一功能有时允许攻击者随意覆盖、修改或创建新的程序变量或对象属性。这可能导致身份验证绕过和对程序逻辑的操纵。要防止批量分配,可以使用正在使用的框架禁用批量分配功能,或者使用白名单仅允许对某些属性或变量进行分配。  

(24)打开重定向  

网站通常需要自动重定向其用户。例如,这个当未经身份验证的用户尝试访问页面时会发生这种情况需要登录。网站通常会将这些用户重定向到登录页面,然后在他们通过身份验证后将它们返回到原来的位置。  

在开放式重定向攻击期间,攻击者诱骗用户访问通过向他们提供来自合法站点的URL来访问外部站点重定向到其他地方。这可以让用户相信他们仍然在原始网站上,并帮助诈骗者构建更可信的网络钓鱼活动。  

为了防止开放重定向,需要确保应用程序不会将用户重定向到恶意位置。例如,可以通过验证重定向URL来完全禁止异地重定向。还有许多其他方法可以防止打开重定向,例如检查请求的引用者或使用页面索引进行重定向。但是由于验证URL很困难,开放重定向仍然是现代Web应用程序中的一个普遍问题。  

 (25)跨站请求伪造  

跨站点请求伪造(CSRF)是一种客户端技术,用于攻击Web应用程序的其他用户。使用跨站点请求伪造(CSRF),攻击者可以发送假装来自受害者的HTTP请求,代表受害者执行不需要的操作。例如,攻击者可能会在未经许可的情况下更改密码或银行账户转账。  

与开放式重定向不同,有一种防止跨站点请求伪造(CSRF)的万无一失的方法:结合使用跨站点请求伪造(CSRF)令牌和SameSite cookie,并避免使用GET请求进行状态更改操作。  

(26)服务器端请求伪造  

服务器端请求伪造(SSRF)或服务器端请求伪造是攻击者能够代表服务器发送请求时发生的漏洞。它允许攻击者“伪造”易受攻击的服务器的请求签名,从而在网络上占据特权地位,绕过防火墙控制并获得对内部服务的访问权限。  

根据授予易受攻击服务器的权限,攻击者可能能够读取敏感文件、进行内部API调用以及访问隐藏管理面板等内部服务。防止SSRF漏洞的最简单方法是永远不要根据用户输入发出出站请求。但是,如果确实需要根据用户输入发出出站请求,则需要在发起请求之前验证这些地址。  

(27)信任边界违规  

“信任边界”是指不受信任的用户输入进入受控环境的位置。例如,一个HTTP请求在被服务器验证之前被认为是不可信的输入。  

用户存储、传输和处理可信和不可信输入的方式应该有明显的区别。当不尊重这种区别并且信任和不信任的数据相互混淆时,就会发生信任边界违规。例如,如果受信任和不受信任的数据存储在同一个数据结构或数据库中,应用程序可能将这二者混淆。在这种情况下,不受信任的数据可能会被错误地视为已验证。  

防止信任边界违规的一个很好方法是在验证之前永远不要将不受信任的输入写入会话存储。


原文标题:Go Application Vulnerability Cheatsheet,作者:Vickie Li

链接:https://dzone.com/articles/go-applications-vulnerability-cheatsheet

责任编辑:莫奇 来源: 51CTO
相关推荐

2015-10-14 10:43:17

PaaSSaaS应用构建

2011-05-26 17:37:11

Ajax

2015-07-28 10:30:57

程序员接私单

2009-06-22 13:46:00

java程序员考试

2012-03-20 09:20:40

Go语言

2023-01-31 08:16:45

GitHub文件Markdown

2023-10-27 12:11:33

2018-05-23 15:13:50

程序员面试格式

2013-09-29 10:36:08

VMware虚拟化

2009-04-23 14:30:19

UML建模

2020-10-26 14:01:22

Java泛型

2011-12-03 20:25:53

2013-05-03 11:31:40

程序员

2016-04-19 10:23:48

2010-12-06 15:23:43

2012-10-23 14:51:38

2017-08-09 17:09:47

2010-08-23 15:50:43

2009-12-22 14:46:59

NAT路由器

2023-05-24 23:34:11

点赞
收藏

51CTO技术栈公众号