来自 数据 2021-10-11 14:12 的文章

国内高防cdn_防护用品网站_优惠券

国内高防cdn_防护用品网站_优惠券

如果您是网络安全行业的活跃人士,您可能已经在2017年听到了Struts2Java框架的风声。简而言之,黑客能够利用基于Struts2的易受攻击的应用程序,窃取了数亿份PII记录。这个漏洞(CVE-2017-5638)制造了很多噪音,但和几乎所有的关键漏洞一样,它被修补了,所有人都继续前进。然而,网站安全防护,这最终只是冰山一角,因为还有其他鲜为人知的漏洞,具有同样严重的后果。这些漏洞的根本原因仍然存在,即使是最新的补丁也不能保证基于struts2的应用程序的完全安全。在这篇文章中,我将向您展示为什么Struts2是一个危险的玩具玩,以及在哪里戳破它。在下图中,左起第四列显示了Struts中代码执行漏洞的数量,占所发现问题的近33%。没有其他Java框架有这么多。更重要的是,它们都有相同的根本原因,即框架的体系结构本身。让我们仔细看看。来源:CVE详情Struts体系结构有两种主要的架构解决方案将模型、视图和控制器缝合在一起:值堆栈和OGNL。值堆栈是应用程序用来响应用户请求的所有对象的堆栈(例如,应用程序配置、安全设置、数据等)。值堆栈中的对象是使用对象图导航语言(objectgraph Navigation Language,OGNL)操作的,OGNL是一种便于获取和设置Java对象属性的表达式语言。OGNL公司OGNL库有什么功能?在下面的示例中,OGNL调用给定类的方法,同时执行更糟糕的操作。如您所见,OGNL表达式可以包含操作系统命令(例如。,命令提示符, 小算盘等等)。因此,如果允许将恶意输入作为OGNL表达式执行,那么就有麻烦了。幸运的是,struts2没有直接公开OGNL。它上面有几层,如下所示。金字塔的顶部是OGNL表达式的入口点。下面的示例显示了一个视图,该视图使用#会话.user.name"OGNL表达式。这是struts2中使用OGNL的一种有意且合法的方式。但是,由于应用程序或框架本身存在漏洞,恶意数据可能会无意中被评估为OGNL表达式。金字塔的下一层是OGNL库的框架实现。我们最感兴趣的部分是安全机制,因为它定义了允许计算哪些OGNL表达式。最后,通过安全检查后,由javaognl库计算表达式。成功攻击的秘方因此,您需要两个关键组件来计算基于Struts 2的应用程序中的任意OGNL表达式:找到一个进入评估的注入点绕过安全机制注入点如何计算恶意OGNL表达式?有两种选择:直接求值方法发生在用户输入结束于将输入作为OGNL表达式计算的方法的参数时。以下框架代码通过评估恶意OGNL表达式污染的错误消息,华为DDOS防御做的最好,参与了臭名昭著的CVE-5638-2017。双重求值方法由两个求值调用组成,因此更难找到。如下面的示例所示,第一个调用使用恶意表达式填充变量,但尚未对其求值。同时,第二个调用获取受污染的变量值并对其求值。双重评价通常是无意的。例如,它可以将开发人员引入的评估与框架代码中的评估结合起来。安全机制绕过现在您已经知道了注入点是什么样子的,让我们想象一下有效负载是经过评估的,ddos攻击高防御服务器,从而允许我们使用安全机制。从攻击者的角度来看,从Struts 2版本2.3.14.1(2013)到版本2.5.20或2.3.37的当前状态,可以看到它的演变。在2.3.14.1之前的版本中,安全机制是微不足道的;之后,它被不断地升级。现在是最好的部分,我们将回顾绕过安全机制的有效负载以及针对它们进行的升级。以下所有有效负载的一般方法是首先删除现有的限制,然后运行一个OS命令。第一个有效载荷初始状态下的安全机制限制对静态方法调用的访问。出于某种原因,OGNL表达式可以访问机制本身。以下负载首先允许静态方法调用,然后使用OS命令调用静态方法getRuntime().exec。2.3.14.2中的修复使allowStaticMethodAccess不可变。如果我们尝试动态生成一个对象而不是静态方法呢?下一个有效负载就是这样绕过安全机制的。第二个有效载荷2.3.20中的修复禁止使用构造函数,并引入了限制OGNL的类和包的黑名单。第三个有效载荷安全机制不允许静态方法,但允许静态对象。研究人员在OGNL库中发现了一个静态对象,其中包含默认状态下的安全机制(=零安全设置)。以下有效负载将当前安全机制设置为默认状态并运行命令。2.3.30和2.5.2中的修复最终通过黑名单剥夺了OGNL表达式对安全机制的访问权ognl.MemberAccess以及ognl.DefaultMemberAccess类。第四个有效载荷给定的nlog对象可以调用任何上下文中的方法。黑名单出现在一个计算表达式的上下文中,这个表达式可以通过几个对象的链来访问,并使用clear()方法刷新。当黑名单为空时,我们可以使用前一个有效负载的技巧来运行一个命令。2.3.32和2.5.10.1中的修复程序通过com.opensymphony.xwork2.ActionContext对OGNL不可用。此外,黑名单是不可变的,这使得clear()方法无效。第五个有效载荷ValueStack是一组复杂的相互交织的对象,您可以从值堆栈根开始,安全狗防御cc如何,以多种方式访问同一对象。下一个有效负载通过一组不同的对象访问OgnlUtils。黑名单被先前的修复错误地设置为不可变的,它们可以使用setter进行更新。有效负载由两个后续请求组成,第一个请求刷新黑名单,第二个请求运行命令。可以将负载分成两个请求,因为OgnlUtils是一个单实例,它的值在应用程序重新启动之前一直保持不变。不再有CVE,但漏洞可能仍然存在2.3.35和2.5.17中的修复修复修复了缺陷,并使Struts2OGNL注入暂停。黑名单注定会被绕过,所以我们可以等待下一集框架开发人员和攻击者之间的猫捉老鼠游戏。目前,该框架没有已知的注入点和代码执行漏洞。但是,它并不能保证基于struts2的应用程序的安全性,因为开发人员可能会自己引入一个注入点。例如,这可能是由于无意中链接了框架代码中的良性求值,而在它们自己的代码中又有一个求值。下面的代码片段是一个示例,说明了当存在注入点时,基于Struts2最新版本的应用程序仍然是可利用的。首先,"createUser"操作创建一个User类的对象并将其保存到session变量中。"User"类的"isAdmin"属性的默认值为false。稍后,"inject"操作从会话加载"User"对象,将用户输入计算为OGNL表达式,并将"User"对象保存回会话。"getText()"方法是为了演示目的而插入的注入点。通过顺序调用这些操作,攻击者可以操纵未列入黑名单的对象。例如,超级好用的linuxcc防御,设置"用户.isAdmin,从而绕过授权检查。考虑到这些,Struts2开发人员应该记住另一种漏洞类型。建议广泛使用SAST或IAST工具,如Checkmarx,通过OGNL注入漏洞发现可能的代码执行。如果没有适当的应用程序安全测试过程,忽略由开发人员引起的可利用的注入漏洞的可能性非常高。Apache软件基础Apache StrutsApplication安全警告应用程序安全漏洞软件暴露生物最新帖子尤金·罗哈夫斯基尤金在Checkmarx的研究工作中拥有8年以上的信息安全经验。他在应用程序安全教育、web应用程序测试、安全应用程序架构、安全配置和软件开发方面拥有非常深厚的技术知识和经验。此外,Eugene在风险评估、审计、意识计划和合规方面具有管理经验。尤金·罗哈夫斯基的最新帖子