Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选 PDF转换器

首页 / 操作系统 / Linux / Struts2漏洞分析,漏洞波及全系版本

Struts漏洞分析Apache Struts团队已经发布了Struts 2.3.15.1安全更新版本。在Struts2.3.15.1版本之前,存在着严重的安全漏洞,如果现在一些比较大的网站是用JAVA做的,没有把版本升级,还用的是Strtus2.3.15.1版本之前的话,那么你们就要小心,服务器被黑了哦。 下面就来说一下之前版本,Struts2的漏洞是如何产生的,我们自己去做,该如何的去解决这个安全漏洞:我听有人说: “这算什么漏洞”,我想说的是:“你在浏览器就能把别个服务器搞蹦掉,让它停掉没工作了,这能不是高危漏洞么”。1. 我用的是struts_2.1.8.1这个版本,如果你用最新的安全版本,是不会出现这个安全问题的。在浏览器输入如下地址:http://www.xxxx.com/xxx.action?("u0023_memberAccess["allowStaticMethodAccess"]")(meh)=true&(aaa)(("u0023context["xwork.MethodAccessor.denyMethodExecution"]u003du0023foo")(u0023foou003dnew%20java.lang.Boolean("false")))&(asdf)(("u0023rt.exit(1)")(u0023rtu003d@java.lang.Runtime@getRuntime()))=1输入以后,服务器端就会崩溃。http://www.xxxx.com/xxx.action这个就不说是什么了,你这都不知道就不要看了。【说明: url中的u0023实际上是代表#号,%20实际上是代表空格,u003实际上是代表等于】2.产生漏洞的原因如下:上面的地址被浏览器会翻译成:?("#_memberAccess["allowStaticMethodAccess"]")(meh)=true&(aaa)(("#context["xwork.MethodAccessor.denyMethodExecution"]=#foo")(#foo=new%20java.lang.Boolean("false")))&(asdf)(("#rt.exit(1)")(#rt=@java.lang.Runtime@getRuntime()))=1当提交这个url后,经过了一个拦截器名为ParameterInterceptor。其中有这么一行源代码:try{
  newStack.setValue(name,value);
}利用stack.setValue(“name”,”aaa”);就把name属性的值改为aaa字符串。在上述的url中,有两个至关重要的值:在map栈中:下图:_memberAccess是OgnlContext中的一个属性,这是一个权限类SecurityMemberAccess,该权限类中有一个方法allowStaticMethodAccess:是否允许访问静态方法。通过上面的url,把该属性的值设置为了true(默认值为false),context["xwork.MethodAccessor.denyMethodExecution"]这个值为false,Ognl才能够执行自定义的变量,在map栈中的其中一个值,这个是一个boolean值,设置为true,ognl表达式就能够调用静态的方法(asdf)(("#rt.exit(1)")(#rt=@java.lang.Runtime@getRuntime()))=1则是一个shellcoade,ognl表达式执行静态方法,这样就调用java中的命令了。当执行(asdf)(("u0023rt.exit(1)")(u0023rtu003d@java.lang.Runtime@getRuntime()))=1这个代码的时候相当于java.lang.Runtime.getRuntime().exit(1);,执行完毕后,使得我们的整个程序停掉了。3.为什么会产生这样的漏洞呢?struts2提供了存储数据valueStackstruts2提供了访问数据的ognl表达式ognl表达式不但可以访问到valueStack中的值,而且还可以改变valueStack中的值调用valueStack.setValueognl表达式还能执行静态方法,并且嵌入一些shellcoade代码。4.如果我们去做,怎么去解决?做一个自定义的拦截器,用拦截器过滤url,含有u0023这个字符串,就不让它执行以后的相应的操作。自定义的拦截器一定要在ParameterInterceptor执行之前执行就哦了。@Override
public String intercept(ActionInvocation invocation) throws Exception(){
  String s = ServletActionContext.getRequest().getQueryString();
  if(s.contains("\u0023")){
      return "error";
  }else{
      return invocation.invole();
  }
}在struts的配置文件下配置一下就OK了,像这样就行:<interceptors>
  <interceptor name="definitionInterceptor" calss=".....definitionInterceptor"></interceptor>
  <intercpeotr-stack name="myStack">
    <interceptor-ref name="definitionInterceptor"></interceptor-ref>
    <interceptor-ref name="defaultStackr"></interceptor-ref>
  </interceptor-stack>
</interceptors>
<default-interceptor-ref name="myStack"></default-interceptor-ref>有不懂的地方,可以给我留言。相关阅读:Apache Struts多个前缀参数远程命令执行漏洞(CVE-2013-2251) http://www.linuxidc.com/Linux/2013-07/87491.htmApache Struts 多个开放重定向漏洞(CVE-2013-2248) http://www.linuxidc.com/Linux/2013-07/87490.htmStruts2 远程执行代码(S2-016) 利用工具 http://www.linuxidc.com/Linux/2013-07/87541.htmStruts2漏洞解读:官方惹祸 黑客攻防 http://www.linuxidc.com/Linux/2013-07/87811.htmIZON网络摄像机硬编码凭证安全措施绕过漏洞Cisco IOS IKEv2重放安全措施绕过漏洞相关资讯      Struts2  Struts2漏洞 
  • Struts2数据验证机制  (今 10:42)
  • ssh(sturts2_spring_hibernate) 框  (09月07日)
  • Struts2 声明式异常处理  (07月13日)
  • Struts2数据校验  (今 10:39)
  • Struts2一个实例中遇到的问题  (07月14日)
  • Apache Struts method: prefix任意  (04月27日)
本文评论 查看全部评论 (0)
表情: 姓名: 字数