攻击笔记(shrio反序列化,OGNL注入)
shrio反序列化攻击
shrio认证过程:
- 将前端传入的用户名与密码封装为一个对象(UsernamePasswordToken);
- 将数据库中查询的数据封装为另一个对象(SimpleAuthenticationInfo);
- 比对结果,相同则继续,不同则抛出异常;
- 返回用户信息,封装入一个对象(SimplePrincipalCollection),并根据用户信息,再创建一个 subject ,后续任何操作都以此 subject 为主,包括授权。
授权:
获取到当前用户权限信息后,将用户所拥有的权限循环遍历出来,然后和当前资源所需要访问权限进行一一比对,如果相同则返回true。
攻击总述:
由于登陆页面可选 rememberMe,在使用此选项时,rememberMe 有效期间不需要再次登陆。
通过硬编译将AES加密的密钥放在代码内,由于请求内有 rememberMe 会被优先处理,则会绕过之前的认证步骤。将恶意对象序列化之后,AES加密,base64 编码后,作为 cookie 的 rememberMe 字段发送,shiro 将 rememberMe 解密后并反序列化,最终造成反序列化漏洞。
其特征是必须由 cookie 中的 rememberMe 来进行,无论是探测还是攻击,拥有较高的可识别度。
OGNL注入攻击
OGNL(Object-Graph Navigation Language),大概可以理解为:对象图形化导航语言。是一种可以方便地操作对象属性的开源表达式语言(EL)
特点:
-
支持对象方法调用,形式如:objName.methodName();
-
支持类静态的方法调用和值访问,表达式的格式为@[类全名(包括包路)]@[方法名| 值名],例如: @java.lang.String@format('foo%s', 'bar')或@tutorial.MyConstant@APP_NAME;
-
支持赋值操作和表达式串联,例如: price=100, discount=0.8, calculatePrice(),这个表达式会返回80;
-
访问OGNL上下文(OGNL context)和ActionContext;
-
操作集合对象。
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) + ...}
总结:
-
在JSP页面中"%{"就表示OGNL表达式开始,"}"表示OGNL表达式结束
-
如果访问根对象中的对象和属性不用任何符号标志,如:%{Object.field}
-
访问特定Scope中的对象和属性用"#"来通知OGNL查询器,如:%{#request.object},当然OGNL很强大,在一个链中,前一个对象做为解释下一个对象的上下文。你可以任意扩展这个链,在链中也可以访问对象中的方法。