IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> mvc与s2-001漏洞的理解 -> 正文阅读

[Java知识库]mvc与s2-001漏洞的理解

1. 什么是mvc

mvc分为三部分,model、view、controller,是一种软件设计典范。

1.1 model

负责数据处理,并将处理结果返回给view显示出来。

1.2 controller

负责接收view传递的数据,并决定将这些数据传递给哪一个model处理。

1.3 view

与用户进行交互的页面,负责将用户输入的数据传递给controller,或者显示model处理后的结果。

2. struts2漏洞原理

mvc框架下,数据从view层直接传递到controller层是会出问题的。

1.当数据从View层传递到Controller层时,我们应该保证一个扁平而分散在各处的数据集合能以一定的规则设置到Java世界中的对象树中去。同时,能够灵活的进行由字符串类型到Java中各个类型的转化。

2.当数据从Controller层传递到View层时,我们应该保证在View层能够以某些简易的规则对对象树进行访问。同时,在一定程度上控制对象树中的数据的显示格式。

view层数据是字符串,而controller层数据是java对象。

为了解决数据传输问题,就出现了OGNL,全名是对象图形导航语言,是一个开源的表达式引擎。

2.1 OGNL

可以简单的理解成,一段简单可以设置对象的任意属性或者调用对象的任意方法的代码。

它可以设置Java对象的属性,同时也可以对服务端对象进行修改。

如果有一个我们可控的输入可以实现OGNL解析,在允许自行静态方法的情况下,那么我们就可以执行静态方法,进而执行命令。通过修改memberaccess使得静态方法可以被解析。

(#_memberAccess['allowStaticMethodAccess']=true).(@java.lang.Runtime@getRuntime().exec('calc'))

OGNL由expression、context、root组成。

2.2 expression

对可操作的对象具体要做的事情。

2.3 root

默认的操作对象

2.4 content

所有可操作对象的集合

3. S2-001的理解

漏洞函数是translateVariables中的while循环。translateVariables可以解析我们传给表单中name的值。

在这里插入图片描述

如果我们给password传的值为${1+1},最终传递给translateVariables的值是${password},它在函数中的变量名为expression,也就意味着expression=${password}。

  1. translateVariables判断expression是不是${开头,}结尾,如果是则继续,如果不是则退出循环。

  2. translateVariables先剥离${}这几个符号,然后执行o = findvalue(password)得到o=${1+1},无论我们选择传递给password什么值,translateVariables第一次执行的时候一定是取出password的值,因为password本身就是一个OGNL表达式,是root上的一个参数。

  3. 最终password的值会被传给expression并开始下一轮循环。

  4. 因为expression是${1+1},满足条件,所以会开始第二次循环,同上删除掉${}这几个符号,然后执行o = findvalue(1+1)最终得到o=2。也就意味着1+1这个OGNL表达式被执行了,也就意味着如果我们把1+1换成恶意代码,就实现了RCE。

4. 其他

ValueStack:与action对象一样的对象

ValueStack实例化后就是OgnlValueStack

OgnlValueStack的findValue函数可以解析其中的OGNL表达式。

securityMemberAccess/memberAccess跟是否能调用静态方法有关系。

参考文章

OGNL表达式注入漏洞总结

【Struts2-命令-代码执行漏洞分析系列】S2-001

struts2历史漏洞分析

浅析 OGNL 的攻防史
Struts2

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-10-17 11:52:07  更:2021-10-17 11:54:22 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 22:37:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码