如何破解不安全的Web应用程序

在本文中,我想展示从Web应用程序获取机密信息的容易程度,而这些应用程序……对安全性并不太重视。我将使用的是我在Spring Boot中创建的示例Java应用程序,用于演示。但是执行的攻击对任何其他编程语言或框架均有效。将展示的一些漏洞和安全性问题包括:

设置

我们将使用一个虚构的Web应用程序,该应用程序允许您以属于某些组的用户身份登录。根据用户角色,他可以查看基本数据或机密数据。在这种情况下,您将看到公司中的员工列表,他们的状态等。

您可以在我的Github中找到此应用程序的源: https : //github.com/rapasoft/hackme

[《2020最新Java基础精讲视频教程和学习路线!》]

#1:在中间人攻击

假设您正坐在餐厅里,并且想检查上面的应用程序中的某些内容。您连接到餐厅的Wi-Fi,打开登录页面,输入凭据并获取所需的信息(例如,特定员工的列表)。您现在可能不知道的是,您的凭据已被泄露。让我们仔细检查登录页面:

该应用程序不使用SSL / TLS(例如,无https://连接)。这意味着,任何有权访问客户端和服务器之间通信的人都可以将发送的任何信息视为纯文本。

这正是所谓的_“中间人袭击”中_发生的事情。更具体地说,在这种情况下,ARP欺骗已被用作毒害整个网络的方式,从而使攻击者可以了解正在发生的一切并可以嗅探所有数据包。我不会详细介绍ARP欺骗的工作原理,但将在此视频中进行演示:

您可能需要在新窗口和全屏模式下打开此YouTube视频,以查看更多详细信息

上面您可以看到,我已经启动了Ettercap,这是一个用于MITM攻击的综合套件,并在本地网络中执行了ARP欺骗。同时,当用户(我通过iPad)输入凭据时,它们在Ettercap和Wireshark(用于网络流量分析的工具)中都是可见的。

2:SQL注入

继续作为该应用程序的攻击者,我们现在拥有hgraves密码为的用户凭证P4SSW0RD。您可以看到,不仅此应用程序不使用TLS,而且密码策略非常弱,使用户可以选择非常糟糕的密码。

我们使用上面的凭据登录,可以看到一个输入字段,其中包含用于搜索人员列表的选项。按下时,Search我们将获得完整的人员列表。例如,如果我们输入“ Fra”,我们将根据搜索结果获得过滤结果。如果我们放置一些非法字符怎么办?显而易见,此应用程序后面有一些数据库,因此让我们尝试一下该'字符:

这不仅失败,而且我们可以看到POST请求失败,并显示了非常具体的错误消息,该错误消息暴露了整个SQL语句的结构。我们可以看到WHERE P.NAME LIKE '%'%'最后使用了它。

熟练的黑客不需要更多。经过几次尝试,调整搜索字符串可以产生以下结果:

在这种情况下,注入创建了联合以选择语句,该语句将获取用户名和密码及其角色。不仅成功,而且我们设法将其显示在原始客户端应用程序中。

现在,我们拥有所有用户的凭据及其角色(在“年龄”列中以整数显示)。因此hframe,如果具有角色1,则rgraves必须是具有角色3的更重要的用户。

3:攻击弱散列密码

我们在第一次攻击中了解到,可能没有为此应用程序设置任何密码策略。这将使我们希望rgraves也不要过多地关注安全性。

使用不足的哈希算法(在这种情况下为MD5)破解密码哈希的最简单方法是执行字典Rainbow表攻击。有很多可能性,但是最简单的一种方法是使用已经具有密码到哈希组合的大型数据库的Internet服务

hframe一个是 rgravessmorgan由于它不在字典中,因此似乎使用的密码比其他密码更强。

您会看到密码rgraves箭鱼,这意味着他现在选择非字典式密码;)并不重要。现在,没有什么可以阻止我们以该用户身份登录并发现“ admin”部分和机密信息:

如何解决这个问题?

您可能会说,所有这些都可以轻易避免。您可能会说这些是_菜鸟的错误_。嗯,这可能是正确的,但同样正确的是,“开放式Web应用程序安全性项目”将“_注入”_列为Web应用程序中的#1漏洞(并且这种情况已经存在了好几年了)。

因此,如果您发现自己想知道如何防止所有这些情况,那么让我们回顾一下:

  • 向服务器发送内容时,始终使用SSL / TLS。它不必一定是凭据,目前通常被认为是一种很好的做法。即使您的页面上根本没有任何输入!最简单的方法是通过Let's Encrypt之服务来提供证书。
  • 请记住,自签名证书可以缓解数据泄露的问题,但不能阻止MITM攻击者使用自己的自签名证书伪造整个站点。
  • 处理SQL查询时,请始终转义从client获得的参数。最简单的方法是使用框架的功能,例如,在Spring中,您可以使用NamedParameterJdbcTemplate,这也有利于提高可读性。
  • 偏执。验证任何用户输入。再次在Java / Spring世界中,您可以使用JSR-380诸如Hibernate验证程序之类的bean验证实现来添加验证规则,并注释参数,例如@Pattern(regexp = "[a-z|A-Z]*") String name,防止输入'
  • 记录在应用程序中传递无效输入的任何尝试。此外,在发生错误的情况下,请勿向客户端公开任何特定实现的信息
  • 改善您的身份验证。

    • 如果可能,请至少使用2因子身份验证
    • 不要实现自定义密码存储或加密算法。一个人很难做,而且肯定会失败。有像BCrypt这样的成熟解决方案。
  • 阅读并标记OWASP TOP 10。从那里开始,然后浏览他们的最佳做法列表。

原文链接:https://dev.to/rapasoft/how-t...

你可能感兴趣的:(前端,后端,小程序,android,java)