Struts2漏洞以及流量分析

原理

OGNL(Object-Graph Navigation Language) 是Struts2用于视图层与控制器数据交互的表达式语言,具有以下特性:

  • 动态执行能力:可直接调用Java类方法(如Runtime.exec()执行系统命令)。
  • 反射机制:绕过Java安全限制(如访问私有方法、修改全局变量)。
  • 上下文渗透:可访问Struts2的ValueStack(值栈)中的敏感数据(如请求参数、会话信息)。

漏洞触发条件
当用户输入(如URL参数、请求头、表单字段)未经严格过滤,直接作为OGNL表达式解析时,攻击者可通过注入恶意表达式操控服务器行为。

反序列化漏洞

s2-052 XML反序列化

Struts2 REST插件的XStream组件存在反序列化漏洞,使用XStream组件对XML格式的数据包进行反序列化操作时,未对数据内容进行有效验证,即可以通过反序列化引入任意类造成远程命令执行漏洞。

由于rest-plugin会根据URL扩展名或Content-Type来判断解析方法,所以我们只需要修改<文件名>.html为<文件名>.xml或修改Content-Type头为application/xml,即可在Body中传递XML数据,远程执行任意代码。

s2-055 JSON反序列化

Apache Struts 2.5.x REST插件存在远程代码执行的中危漏洞,漏洞编号与CVE-2017-7525相关。漏洞的成因是由于使用的Jackson版本过低在进行JSON反序列化的时候没有任何类型过滤导致远程代码执行。

抓包修改content-type为application/json在body中添加payload即可利用漏洞

RCE漏洞

s2-057

原因是通过URL传递namespace,并被解析为OGNL表达式,导致RCE

定义XML配置时如果没有设置namespace的值,并且上层动作配置中并没有设置或使用通配符namespace时,可能会导致远程代码执行漏洞的发生。同样也可能因为url标签没有设置value和action的值,并且上层动作并没有设置或使用通配符namespace,从而导致远程代码执行漏洞的发生。alwaysSelectFullNamespace操作元素没有设置命名空间属性,或者使用通配符。

s2-059

s2-61

流量特征

识别框架

一般st2开发的应用,会以.do.action为结尾后缀,但是spingweb同样可以这样结尾来定
义相关接口,所以通过在相关接口追加actionErrors参数,st2应用会触发报错
而spring的话,类似user.do/的访问和user.do的结果一样

请求头

Content-Type中包含%{…} %25%7B…%7D

URL

target/${@java.lang.Runtime@exec(‘id’)}/action.action

%23%7B…%7D

关键词

%{、${、$#_memberAccess、@java.lang.Runtime

日志

状态码500

一个仍在爬山的人