安全工程师必知:常见Java漏洞有哪些?

开发 后端
人们往往默认代码是安全的,漏洞或潜在的攻击总是放到最后才考虑。大多数时候,我们脑子里想的都是sprint、 scrum、会议记录,以及市场营销获得批准的最新进展。

 本文转载自公众号“读芯术”(ID:AI_Discovery)

人们往往默认代码是安全的,漏洞或潜在的攻击总是放到最后才考虑。大多数时候,我们脑子里想的都是sprint、 scrum、会议记录,以及市场营销获得批准的最新进展。

在一个发展速度重于代码安全性的世界,这是一个真实存在的问题。如果不能彻底解决入侵或黑客攻击的问题,企业可能会损失一大笔钱。根据IBM《2020年数据泄露成本报告》,一次数据泄露的平均总成本为386万美元。最糟糕的是,识别控制这种入侵平均需要280天。

数据是数字黄金,代码承载着数据。虽然Java这一服务器端语言相对安全,但是黑客仍有很多方法来攻击和访问隐私数据。

 

安全工程师必知:常见Java漏洞有哪些?

 

以下是10个最常见的Java漏洞以及预防措施,可帮助大家尽快识别并抵御代码中可能出现的漏洞。

1.代码注入

接受输入的应用程序都容易受到代码注入的攻击。当通过输入传递的数据对程序运行或返回数据的方式造成意想不到的副作用时,就会发生代码注入。

仔细想想,表单是一个双向的过程。输入数据后,应用程序处理数据并返回结果。如果结果不符合期望,就会让应用程序处于易受攻击的状态。

代码注入经常发生,其容易程度超出想象。2010年,一位日本开发者注意到可以将HTML作为推特发送。通过在HTML中添加一些JavaScript,他利用半夜人们熟睡的时间在Twitter上发送了一小段蠕虫代码。

这一小段代码有什么用?

只要用户将鼠标悬浮在这段代码上面,就会立即转发。所以关注者滚动鼠标,就是在转发那段蠕虫代码。这在几分钟内就产生了超过3000次转发的连锁效应。

虽然Twitter不只在堆栈中使用了Java,但这一警示事件可以用于保护输入表单。最简单的方法是应用带有输出清理和转义的输入验证。这意味着根据应用程序正在执行的任务,任何发送HTML代码的尝试都会被解析或拒绝。

2.命令注入

操作系统命令注入(通常称为shell注入)是一个安全漏洞,它允许攻击者在运行应用程序的服务器上执行shell命令。PHP通常是命令注入的目标,因为它在默认情况下调用sh/bash/cmd。然而,Java执行已给定命令的fork()来创建子进程并向其传递给定参数。

然而,这并不能保证代码的安全。

应用程序可能被分割成不同级别的遗留代码,这些代码组合在一起形成最终的产物。这些遗留产物可以作为shell命令注入的输入方式。

有时可能需要向服务器发出命令行,例如发送确认电子邮件。与其使用Runtime.exec()来访问服务器,不如使用位于javax.mail中的可用Java API。

3.连接字符串注入

连接字符串是一组用于将应用程序连接到数据源的术语。它可以连接到关系数据库、LDAP目录和文件。

对于数据库连接字符串注入,恶意用户需要四个参数:数据源、初始目录、用户名和密码。当攻击者使用分号作为分隔符将参数注入连接字符串以获得访问权限时,就会发生连接字符串攻击。

这里的问题是,一些数据库提供商没有限定上限,而是运行“最后一个函数成功”的算法。这意味着攻击者可以运行多个连接注入字符串,用重复参数污染它们,同时数据库进行有效组合。因此,攻击者最终绕过了正常的身份验证过程,不被强制退出。

例如,注入的连接字符串可以是这样的:

 

  1. Data Source = myDataSource; Initial Catalog = db; Integrated Security = noUser ID = myUsername; Password = XXX; Intergrated Security = true; Data Source = myDataSource; Initial Catalog = db; Integrated Security = noUser ID = myUsername; Password = XXX; Intergrated Security = no

一旦进入,恶意用户可以劫持凭证并将其修改为他们想要的任何内容。

4.LDAP注入

LDAP注入利用输入验证并注入可执行查询。LDAP是轻量级目录访问协议,是一种开放的、跨平台的用于目录服务认证的协议。LDAP是一种通信语言,应用程序可以利用它访问目录服务器。这些目录服务器通常存储用户名、密码、帐户详细信息和其他可以与网络上的其他实体共享的信息。

当应用程序将未经处理的输入直接插入LDAP语句时,就会发生LDAP注入。在这种情况下,攻击者可以使用LDAP筛选器语法,这种语法可以让服务器执行其他查询和LDAP语句。

防止LDAP注入最简单的方法是确保LDAP特殊字符( ) ! | & *在验证时被转义或拒绝。

5.基于反射的XSS攻击

反射XSS攻击,或反射跨域脚本攻击,是一个添加恶意脚本的过程,这种恶意脚本是通过链接激活的,其之后产生的指令会将用户传送到其他地方。例如,一个反射XSS可以嵌入到用户评论区,与网站的其他部分混合在一起。如果用户点击它就会跳转到第三方网站,然后重新回到原来的网站。

而在第三方网站可以会出现cookie或会话窃取等恶意活动。虽然监控反射XSS很难,但垃圾邮件过滤器可以减少链接提交的频率。

6.资源注入

当攻击者成功地更改应用程序用于执行恶意任务的资源标识符时,就会发生资源注入。这可能是修改端口号、修改文件名,以及获得执行或访问其他资源的能力。

这是怎么发生的?通常是在应用程序通过用户输入定义资源的时候。

例如,假设攻击者通过连接字符串注入获得了对购物站点的访问权限,或者通过XSS成功窃取了用户的详细信息,那他们就可以使用资源注入修改或查询详细信息,可以在用户不知晓的情况下,通过在站点订购东西、修改或窃取更多的信息来造成破坏。

7.SQL注入

SQL注入是一个在数据请求中注入SQL的过程,这会导致后端应用程序将机密数据返回或在数据库上执行恶意脚本的内容。

这可能导致死机、数据访问和隐私侵犯。不仅如此,SQL注入还可能导致数据丢失或损坏,并让用户无法进入自己的数据库。这时,注入已经完全控制了数据。最简单的解决方法是确保在服务器端进行验证。前端输入可以很容易地绕过,而后端是防止不必要的字符(如空格和引号)注入的后盾。

8.二阶SQL注入

 

[[378244]]

 

二级SQL注入分两步。首先,攻击者向应用程序添加了一些东西,但并不立即执行。他们可能等待着更多的数据或等待活动的触发。这就是二阶SQL注入不同于普通SQL注入的地方。

攻击者向表行注入代码,这一代码将被视为可信源。然后调用该表行,导致攻击从休眠状态转移到活动执行状态。

测试二阶SQL比较困难,因为它通常很隐蔽。

例如,恶意用户以‘ or ‘hacker’=’hacker的用户名注册。这意味着‘ or ‘hacker’=’hacker存储在数据库中。数据库可以使用以下查询来验证用户的身份:

 

  1. SELECT * from creditcards WHERE username = '' or 'hacker'='hacker'

因此当用户名是‘ or ‘hacker’=’hacker时,最终的查询是这样的:

 

  1. SELECT * from creditcards WHERE username = '' or 'hacker'='hacker'

然后,进入登录时,用户名完成验证查询,允许访问其他用户及其帐户详细信息。

9.存储式XSS

当攻击者向网站或应用程序的内容注入脚本时,就会发生存储型跨脚本攻击或持久性跨脚本攻击。与嵌入第三方链接的反射式XSS不同,存储式XSS更危险,因为它不要求用户交互。

由于平台的性质,社交媒体网站特别容易受到存储式XSS攻击。它会鼓励用户发帖和互动。

XSS通常也被称为网站蠕虫,它最终会导致用户得到侵犯性元素,并在浏览器上执行。这种攻击可以通过假冒帐户窃取cookies、帐户信息或其他功能。XSS可以通过四个地址触发,并通常利用JavaScript完成—@post.title, post.url, @post.id and @post.footer_attr。

为了防止这种情况发生,在解析< >和@等特殊字符之前,需进行拒绝或转义。

10.XPath注入

虽然JSON是数据结构领域的新星,但XML文档仍然很受欢迎并被广泛使用。XPath是用于定义XML文档的各个部分的语法。XPath注入背后的原理与SQL注入类似。

SQL注入和XPath之间的唯一区别是后者采用XML格式。如果攻击者找出XML结构,就可以很容易地发送畸形数据。这让攻击者能够追踪XML文档,获得对用户名和密码等详细信息的访问权。

通常,当查询构建在未经验证的输入上时,就会发生XPath注入。防止XPath注入的技巧是使用预编译的XPath。避免从不安全的源接收完整的表达式。如果必须对XPath进行参数化,需将其隔离为仅字符串参数,以防止查询被劫持。

对于大多数注入,在使用用户输入之前进行验证是防止潜在攻击的最简单方法。把任务转移到前端是很容易的,但这只是第一道防线,并不一定能抵御住攻击。

虽然Java可以同时作为前端和后端,但检查用户提供的内容是否符合期望仍然是一种很好的做法。设置验证参数可能需要确定和指定允许的内容,而不是试图找出并删除其他所有内容。

 

责任编辑:华轩 来源: 读芯术
相关推荐

2023-12-25 14:01:39

2023-12-04 11:51:12

2023-11-29 14:59:37

2009-03-25 10:15:29

2022-04-05 13:56:48

设计模式javascript

2011-07-08 16:37:20

2009-02-09 10:03:54

2016-03-07 12:05:41

2009-07-16 13:28:14

2020-11-09 09:10:31

javascript设

2017-04-18 09:46:31

机器学习工程师算法

2019-05-15 11:14:22

监控工具运维

2022-05-05 11:50:58

网络安全安全人才网络安全岗位

2020-08-19 10:14:20

网络安全工程师技术

2022-08-03 13:47:58

漏洞物联网

2011-05-24 10:17:15

SEO

2015-03-04 10:03:09

2012-05-21 12:31:08

瑞星

2021-03-31 22:25:46

运维工程师技能

2023-10-26 07:55:01

点赞
收藏

51CTO技术栈公众号