当前位置: 首页 > 科技观察

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

时间:2023-03-17 01:48:50 科技观察

本文转载自公众号《读书芯》(ID:AI_Discovery)人们往往认为代码是安全的,漏洞或潜在的攻击总是最后才考虑。大多数时候,我们满脑子想的都是冲刺、Scrum、会议纪要和营销审批的更新。在开发速度优先于代码安全的世界中,这是一个真正的问题。如果入侵或黑客攻击没有得到完全解决,企业可能会损失很多钱。据IBM《2020年数据泄露成本报告》称,数据泄露的平均总成本为386万美元。最糟糕的是,平均需要280天才能识别并遏制此类入侵。数据是数字黄金,代码承载数据。尽管Java是一种相对安全的服务器端语言,但黑客仍然有很多方法可以攻击和访问隐私数据。以下是10个最常见的Java漏洞和预防措施,帮助您尽快识别和预防代码中可能存在的漏洞。1.代码注入接受输入的应用程序容易受到代码注入的攻击。当通过输入传递的数据对程序运行或返回数据的方式造成意想不到的副作用时,就会发生代码注入。仔细想想,表单是一个双向过程。输入数据后,应用程序处理数据并返回结果。如果结果不符合预期,它会使应用程序处于易受攻击的状态。代码注入比您想象的更频繁。2010年,一位日本开发人员注意到可以将HTML作为推文发送。通过在HTML中添加一些JavaScript,他在人们熟睡的半夜发布了一小段蠕虫代码。这个小代码有什么作用?只要用户将鼠标悬停在这段代码上,就会立即转发。因此,关注者滚动鼠标就是在重新发布那段蠕虫代码。这在几分钟内产生了超过3,000次转发的连锁反应。虽然Twitter不仅仅在堆栈中使用Java,但此警报事件可用于保护输入表单。最简单的方法是将输入验证与输出清理和转义一起应用。这意味着任何发送HTML代码的尝试都将被解析或拒绝,具体取决于应用程序正在做什么。2.命令注入操作系统命令注入(俗称shell注入)是一种安全漏洞,允许攻击者在运行应用程序的服务器上执行shell命令。PHP通常是命令注入的目标,因为它默认调用sh/bash/cmd。但是,Java使用给定命令执行fork()以创建子进程并将给定参数传递给它。但是,这并不能保证代码安全。应用程序可能被分割成不同级别的遗留代码,这些遗留代码组合起来形成最终产品。这些遗物可以用作shell命令注入的输入。有时可能需要向服务器发出命令行,例如发送确认电子邮件。不使用Runtime.exec()访问服务器,而是使用位于javax.mail中的可用JavaAPI。3.连接字符串注入连接字符串是一组用于将应用程序连接到数据源的术语。它可以连接到关系数据库、LDAP目录和文件。对于数据库连接字符串注入,恶意用户需要四个参数:数据源、初始目录、用户名和密码。当攻击者使用分号作为分隔符将参数注入连接字符串以获得访问权限时,就会发生连接字符串攻击。这里的问题是一些数据库提供商没有设置上限,而是运行“最后一个函数成功”的算法。这意味着攻击者可以运行多个连接注入字符串,用重复的参数污染它们,同时数据库进行有效组合。因此,攻击者最终绕过了正常的身份验证过程,而不是被迫注销。例如,注入的连接字符串可能如下所示:DataSource=myDataSource;InitialCatalog=db;IntegratedSecurity=no;UserID=myUsername;Password=XXX;IntegratedSecurity=true;DataSource=myDataSource;InitialCatalog=db;IntegratedSecurity=no;UserID=我的用户名;密码=XXX;IntergratedSecurity=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注入二阶SQL注入分为两步。首先,攻击者向应用程序添加一些内容,但不会立即执行。他们可能正在等待更多数据或等待事件触发。这是二阶SQL注入与普通SQL注入不同的地方。攻击者将代码注入将被视为可信源的表行中。然后调用此表行,导致攻击从休眠状态转换为活动执行状态。测试二阶SQL更加困难,因为它通常是神秘的。例如,恶意用户使用用户名'or'hacker'='hacker.这意味着'或'黑客'='黑客存储在数据库中。数据库可以使用以下查询来验证用户的身份:SELECT*fromcreditcardsWHEREusername=''or'hacker'='hacker';所以当用户名是'or'hacker'='hacker'时,最终查询是这样的:SELECT*fromcreditcardsWHEREusername=''or'hacker'='hacker';然后,在输入登录名后,用户名完成验证查询,允许访问其他用户及其帐户详细信息。9.存储型XSS当攻击者将脚本注入网站或应用程序的内容时,就会发生存储型跨脚本攻击或持久型跨脚本攻击。与嵌入第三方链接的反射型XSS不同,存储型XSS更危险,因为它不需要用户交互。由于平台的性质,社交媒体网站特别容易受到存储型XSS攻击。它鼓励用户发帖和互动。XSS通常也被称为网站蠕虫,它最终会导致用户获取违规元素并在浏览器上执行它。这种攻击可以通过模拟帐户窃取cookie、帐户信息或其他功能。XSS可以由四个地址触发,通常使用JavaScript来完成——@post.title、post.url、@post.id和@post.footer_attr。为了防止这种情况发生,需要在解析之前拒绝或转义诸如<>和@之类的特殊字符。10.XPath注入尽管JSON是数据结构领域的新星,但XML文档仍然很流行并被广泛使用。XPath是一种用于定义XML文档的各个部分的语法。XPath注入背后的原理类似于SQL注入。SQL注入和XPath之间的唯一区别是后者是XML格式。如果攻击者发现了XML结构,他就可以轻松发送格式错误的数据。这允许攻击者跟踪XML文档并获得对用户名和密码等详细信息的访问权限。通常,当查询建立在未经验证的输入上时,就会发生XPath注入。防止XPath注入的一个技巧是使用预编译的XPath。避免从不安全的来源接收完整的表达式。如果必须参数化XPath,请将其隔离为仅字符串参数以防止查询劫持。对于大多数注入,在使用之前验证用户输入是防止潜在攻击的最简单方法。将任务卸载到前端很容易,但这只是第一道防线,不一定能抵御攻击。虽然Java既可以充当前端也可以充当后端,但检查用户提供的内容是否符合预期仍然是一种很好的做法。设置验证参数可能需要识别和指定允许的内容,而不是试图查找和删除其他所有内容。