问答
发起
提问
文章
攻防
活动
Toggle navigation
首页
(current)
问答
商城
实战攻防技术
漏洞分析与复现
NEW
活动
摸鱼办
搜索
登录
注册
H3C-iMC智能管理中心autoDeploy.xhtml页面代码执行漏洞分析
漏洞分析
H3C-iMC智能管理中心存在远程代码执行漏洞,攻击者利用该漏洞可以在服务器执行远程命令。
一、漏洞简介 ------ H3C-iMC智能管理中心存在远程代码执行漏洞,攻击者利用该漏洞可以在服务器执行远程命令。 二、影响版本 ------ **产品名称:**H3C iMC产品 **受影响的版本**:EIA E0632H06及之前的版本 **修复的版本**:EIA E0632H07及之后的版本 三、漏洞原理分析 -------- 这个漏洞其实是一个组合漏洞,先是利用`;.js`的方式绕过权限限制。之后可以访问到后台功能点,利用后台功能点的反序列化漏洞执行系统命令。 先来跟踪一下漏洞过程: 漏洞入口在`org.apache.myfaces.renderkit.html.HtmlResponseStateManager#getSavedState`处。 是 MyFaces 框架中的一个方法,用于在 JavaServer Faces (JSF) 应用中管理视图状态。这个方法的作用是从请求中获取保存的视图状态。 在 JSF 中,视图状态(`ViewState`)是一个重要的概念,它用于维护用户界面组件的状态以及应用程序的行为。这个状态通常在多个请求之间持久化,因此在一个请求中产生的状态可以在后续的请求中使用。JSF 使用一个隐藏字段来传递视图状态,通常命名为 `javax.faces.ViewState`。 这里通过`Faces上下文`的请求参数中获取该值。根据命名`encodedState`可以看出来,后去的状态是加密的。  跟进函数`org.apache.myfaces.shared.util.StateUtils#reconstruct`,该函数主要对出入的数据进行一些列的解码、解密。  之后传递给`org.apache.myfaces.shared.util.StateUtils#getAsObject`,从字符转换成对象,在Java中通常称为反序列化。  虽然说这是一个反序列化,但是不能直接利用,还需要对payload进行加密。 ### 解密 发送的post请求体是加密的,所以需要分析一下加解密。 第一层:`org.apache.myfaces.shared.util.StateUtils#decode`解码,这是一个base64解码。一般`byte[]`格式的数据,都会进行base64加密,更好保存和传输,以避免过程中报错。  第二层:`org.apache.myfaces.shared.util.StateUtils#decrypt`,这是一个`AES`解密函数。 先通过上下文保存的`iv`和`key`对解密器进行初始化  然后对数据进行解密并返回  第三层:`org.apache.myfaces.shared.util.StateUtils#decompress`,这是一个解压缩函数,系统采用的`GZIP`压缩  ### 加密 我们在生成payload的时候,并不需要根据解密函数反推出加密函数,只需要对已有加密函数进行微调即可 加密:`org.apache.myfaces.shared.util.StateUtils#encrypt`  先来看一下加密逻辑,跟解密逻辑类似,先根据上下文对加密器进行初始化,之后再对数据进行加密   看一下初始化时的值是从哪里来的,拿`org.apache.myfaces.shared.util.StateUtils#getSecret`举例 从各种地方查找键为`org.apache.myfaces.SECRET.CACHE`的值  全局查找,实在配置中写死的 `client/web/apps/imc/WEB-INF/assembly/web.xml`  ### 生成Payload 我们生成payload的时候,肯定没办法调用应用的上下文,这时候就需要重写加密函数,把从上下文中获取的值,直接写入到函数中。  还需要构造序列化的对象,直接用`ysoserial`工具的`Myfaces2`生成可以,也可以自定义  四、漏洞复现 ------ 这里的payload修改成从请求头中直接获取命令的方式,更方便一些。  输入payload后,几个阶段中的数据变化 接收  解密后  反序列化  五、总结 ---- 该漏洞主要因为没有对反序列化的数据进行验证,导致任意命令执行。针对反序列化,通常有如下几条修复方法 1. **避免反序列化不可信数据** - **原则**: 尽量避免反序列化来自不可信来源的数据。如果反序列化的输入可能来自用户或外部系统,应特别小心。 - **解决方案**: 使用可信的数据源,并确保数据在受信任的环境中处理。 2. **使用安全的替代方案** - **原则**: 使用更安全的数据格式(如JSON、XML)代替Java的原生序列化机制。 - **解决方案**: 如果必须使用反序列化,考虑使用安全框架来限制可反序列化的类。 3. **限制可反序列化的类** - **原则**: 通过白名单策略,限制可反序列化的类。 - 解决方案 - **Java**: 可以使用`ObjectInputFilter`来控制允许哪些类被反序列化。Java 9及更高版本支持这一特性。 - **第三方库**: 使用第三方库如 Apache Commons `SerializationUtils` 提供的反序列化工具,这些工具通常有更严格的安全控制。 4. **验证和过滤反序列化的数据** - **原则**: 在反序列化前验证数据,确保其符合预期格式和内容。 - **解决方案**: 在反序列化前,使用签名验证、数据校验等手段来验证数据的完整性和可信度。 5. **使用自定义的`readObject`或`readResolve`方法** - **原则**: 在可控的类中,通过自定义的`readObject`或`readResolve`方法来验证数据或防止不安全的反序列化行为。 - 解决方案 - **`readObject`**: 允许你在反序列化过程中执行额外的安全检查。 - **`readResolve`**: 确保反序列化后的对象处于安全的状态。 6. **安全的类加载器** - **原则**: 限制类加载器在反序列化时加载任意类,防止加载恶意类。 - **解决方案**: 配置安全的类加载器,限制可加载的类的范围。 官方已经针对该漏洞进行修复,升级新版本即可修复漏洞 [https://www.h3c.com/cn/Service/Online\_Help/psirt/security-notice/detail\_2021.htm?Id=134](https://www.h3c.com/cn/Service/Online_Help/psirt/security-notice/detail_2021.htm?Id=134)
发表于 2024-08-14 10:24:19
阅读 ( 4094 )
分类:
Web应用
1 推荐
收藏
1 条评论
zch
1秒前
您好,师傅,可以分享一下加解密的代码吗
请先
登录
后评论
请先
登录
后评论
Harper Scott
6 篇文章
×
发送私信
请先
登录
后发送私信
×
举报此文章
垃圾广告信息:
广告、推广、测试等内容
违规内容:
色情、暴力、血腥、敏感信息等内容
不友善内容:
人身攻击、挑衅辱骂、恶意行为
其他原因:
请补充说明
举报原因:
×
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!