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