攻击笔记(shrio反序列化,OGNL注入)

shrio反序列化攻击

 shrio认证过程:

  1. 将前端传入的用户名与密码封装为一个对象(UsernamePasswordToken);
  2. 将数据库中查询的数据封装为另一个对象(SimpleAuthenticationInfo);
  3. 比对结果,相同则继续,不同则抛出异常;
  4. 返回用户信息,封装入一个对象(SimplePrincipalCollection),并根据用户信息,再创建一个 subject ,后续任何操作都以此 subject 为主,包括授权。

授权:

  获取到当前用户权限信息后,将用户所拥有的权限循环遍历出来,然后和当前资源所需要访问权限进行一一比对,如果相同则返回true。

攻击总述:

由于登陆页面可选 rememberMe,在使用此选项时,rememberMe 有效期间不需要再次登陆。

通过硬编译将AES加密的密钥放在代码内,由于请求内有 rememberMe 会被优先处理,则会绕过之前的认证步骤。将恶意对象序列化之后,AES加密,base64 编码后,作为 cookie 的 rememberMe 字段发送,shiro 将 rememberMe 解密后并反序列化,最终造成反序列化漏洞。

其特征是必须由 cookie 中的 rememberMe 来进行,无论是探测还是攻击,拥有较高的可识别度。

OGNL注入攻击

OGNL(Object-Graph Navigation Language),大概可以理解为:对象图形化导航语言。是一种可以方便地操作对象属性的开源表达式语言(EL)

特点:

  1. 支持对象方法调用,形式如:objName.methodName();

  2. 支持类静态的方法调用和值访问,表达式的格式为@[类全名(包括包路)]@[方法名| 值名],例如: @java.lang.String@format('foo%s', 'bar')或@tutorial.MyConstant@APP_NAME;

  3. 支持赋值操作和表达式串联,例如: price=100, discount=0.8, calculatePrice(),这个表达式会返回80;

  4. 访问OGNL上下文(OGNL context)和ActionContext;

  5. 操作集合对象。

Struts2基于XWork而开发,XWork本身整合了OGNL的一部分并且将这部分内容做了相应的扩展,所以Struts内置了OGNL这部分功能。

攻击范例:

#ActionContext是OGNL的上下文,ValueStack对象是上下文中的根对象:
#随便找一个Action给JSP页面传东西过去的例子,然后在Action的execute()方法中加入以下代码:
    ActionContext.getContext().getValueStack().set("test", "love java");
#在目标JSP页面空白处加上如下代码:
    <s:label value="%{test}"></s:label>
#再次跳转到该页面就可以看到love java出现在页面上了
age=%{(#application.map=#application.get('org.apache.tomcat.InstanceManager').newInstance('org.apache.commons.collections.BeanMap')).toString(0,0) + (#application.map.setBean(#request.get('struts.valueStack')) == true).toString().substring(0,0) + ...}

总结:

  1. 在JSP页面中"%{"就表示OGNL表达式开始,"}"表示OGNL表达式结束

  2. 如果访问根对象中的对象和属性不用任何符号标志,如:%{Object.field}

  3. 访问特定Scope中的对象和属性用"#"来通知OGNL查询器,如:%{#request.object},当然OGNL很强大,在一个链中,前一个对象做为解释下一个对象的上下文。你可以任意扩展这个链,在链中也可以访问对象中的方法。

posted @ 2022-09-14 11:34  天际之上可有蓝天  阅读(314)  评论(0编辑  收藏  举报