Internet Explorer漏洞分析(四)——CVE-2016-0199

0x01 漏洞信息

0x01.1 漏洞简述

  • 编号:CVE-2016-0199
  • 类型:类型混淆(Type Confusion)
  • 漏洞影响:远程代码执行(RCE)/拒绝服务攻击 (DoS)
  • CVSS 2.0:9.3

mshtml.dll组件在将CElement—>CAttributeCollection—>CAttrArray—>Attribute.nodeValue复制到CAttribute—>Variant时,并未对其进行校验,以致类型混淆,进而可造成任意代码执行。

0x01.2 漏洞影响

Microsoft Internet Explorer 9 through 11

0x01.3 修复方案

MS16-063

0x02 漏洞分析

0x02.1 分析环境

  • OS版本:Windows 7 Service Pack 1 x86
  • Internet Explorer版本:9.0.8112.16421
  • mshtml.dll版本:9.0.8112.16684
  • jscrip9.dll版本:9.0.8112.16684

0x02.2 详细分析

分析用POC来自exploit-db

<!DOCTYPE html>
<meta http-equiv="X-UA-Compatible" content="IE=7">
<script>
  oElement = document.createElement("IMG");
  var oAttr = document.createAttribute("loop");
  oAttr.nodeValue = oElement;
  oElement.loop = 0x41424344; // Set original value data to 44 43 42 41
  oElement.setAttributeNode(oAttr); // Replace oElement with original value data
  oElement.removeAttributeNode(oAttr);
  CollectGarbage(); // Use original value data as address 0x41424344 of a vftable
</script>

document.createElement("IMG");语句对应实现为mshtml!CDocument::createElement,其执行流如下:

首先分配堆块用于存储CImgElement对象:

之后由CElement::CElement完成初始化操作:

完成CImgElement对象创建:

var oAttr = document.createAttribute("loop");语句对应实现为mshtml!CDocument::createAttribute,其执行流如下:

分配堆块用于存储CAttribute对象,之后由CAttribute::CAttribute完成初始化操作:

CAttribute对象偏移0x24处存储属性名:

oAttr.nodeValue = oElement;语句对应实现为mshtml!CAttribute::put_nodeValue,其调用CAttribute::PutNodeValueVariantHelper完成功能。首先是复制VARIANT类型对象(存储nodeValue值)至偏移0x28处:

之后判断该CAttribute对象是否为Tracked Object,如果不是则将其设为Root Object,并加入CRootTracker中(感兴趣的读者可自行分析CTrackerHelper::SetAsRootCRootTracker::AddRoot函数,此部分与GC机制有关,不在此展开):

CAttribute对象偏移0x5C处用于判断其是否为Root Object:

oElement.loop = 0x41424344;语句设定CElement对象属性,其属性使用数组存储,对应实现为CAttrArray::Set。该函数首先判断CElement对象偏移0x10处是否置值,若无则分配内存并将返回值写入该处:

CImplAry::InsertIndirect函数中对CAttributeCollection(CElement offset 0x10)偏移0x04处值与0x00处值进行比较以检查是否需要调整Attribute Array存储空间:

由于是首次设定CElement对象属性,并未开辟Attribute Array空间,故调用HeapAlloc进行分配,具体可分析CImplAry::EnsureSizeWorker函数,完成后内存如下:

共4个元素(0x10>>2),每个元素占用内存空间为0x10。完成属性赋值,并将Attribute Array当前元素数量加1:

CElement对象部分结构含义如下:

+0x10       CAttributeCollection
            +0x00   The total size of the Attribute Array<<2
            +0x04   Number of Attributes
            +0x08   CAttrArray
            +0x0c
+0x14       CTreeNode

oElement.setAttributeNode(oAttr);语句对应实现为mshtml!CElement::setAttributeNode,其调用CElement::VersionedSetAttributeNode完成功能。首先是执行MSHTML!CAttribute::PrivateQueryInterface+0x920函数,该函数会对esp+30h+var_14处内存置值,此值会决定后续执行CAttrArray::Set函数orCAttrArray::SetAt函数:

之后执行CAttribute::SetElement函数,对CAttribute对象偏移0x3c处及偏移0x08处进行置值,具体流程可自行跟进分析:

CAttrArray::Set函数执行完成:

CAttribute对象部分结构含义如下:

+0x24   Attribute Name(Pointer to BSTR)、
+0x28   Variant(Save the nodeValue)
+0x3c   CElement
+0x5C   IsRootObject

oElement.removeAttributeNode(oAttr);语句对应实现为mshtml!CElement::VersionedRemoveAttributeNode。漏洞发生在将CElement—>CAttributeCollection—>CAttrArray—>Attribute.nodeValue复制到CAttribute—>Variant(0x28)时,并未对其进行校验,以致类型混淆。正常情形下:

<!DOCTYPE html>
<meta http-equiv="X-UA-Compatible" content="IE=7">
<script>
  oElement1 = document.createElement("IMG");
  var oAttr1 = document.createAttribute("loop1");
  oAttr1.nodeValue = 0x41424344;
  oElement1.setAttributeNode(oAttr1);
  oElement1.removeAttributeNode(oAttr1);
  CollectGarbage(); 
</script>

其执行流如下:

而在POC情形下,其执行流:

如此一来,CAttribute::EnumerateTrackedObjects传递参数给jscript9!ScriptEngine::EnumerateTrackingClient,其在mov ecx, [eax]时便会发生访问错误:

0x03 参阅链接

本文来源于: https://xz.aliyun.com/t/9351

相关推荐

java反序列化知识总结和一些ctf的例题

java反序列化知识总结和一些ctf的例题 反序列化知识: 对于web手来说,php的反序列化一定不陌生,php的反序列化一般关注的就是魔术方法的调用和动态函数的执行这些,在java这里对参数类型这些要求严格,所以不能像php那么轻松的挖掘

使用 CVE-2020-2555 攻击 Shiro

前言 前段时间项目上遇到一个部署在 Weblogic 上存在漏洞的 Shiro 应用,于是参照 Y4er 师傅的文章 《使用WebLogic CVE-2020-2883配合Shiro rememberMe反序列化一键注入蚁剑shell》 的

【漏洞预警】ntopng 权限绕过与任意代码执行漏洞(CVE-2021-28073/CVE-2021-28074)

2021年3月24日,阿里云应急响应中心监测到国内某安全团队公开披露 ntopng 权限绕过与任意代码执行漏洞,其CVE号为 CVE-2021-28073、CVE-2021-28074。 漏洞描述 ntopng是一款基于Web的流量分析

【漏洞预警】Apache Druid 远程代码执行漏洞(CVE-2021-26919)

2021年3月30日,Apache Druid官方发布安全更新,修复了由蚂蚁安全非攻实验室 @fantasyC4t 上报的 CVE-2021-26919 Apache Druid 远程代码执行漏洞。 漏洞描述 Apache Druid

【漏洞预警】VMware vRealize Operations Manager SSRF与文件写入漏洞

2021年3月31日,阿里云应急响应中心监测到 VMware 官方发布安全公告,披露了CVE-2021-21975 VMware vRealize Operations Manager API SSRF 和 CVE-2021-21983 V

Jackson-databind漏洞两则分析

文章前言 本篇文章将对CVE-2020-36189(Jackson-databind SSRF&RCE)漏洞和CVE-2020-36186(jackson-databind RCE)漏洞进行浅析,同时将在文末给出两则新的Gadget !!!

Apache OFBiz RMI反序列化远程代码执行漏洞(CVE-2021-26295)

Author: 析安实验室(ZionLab) 漏洞分析 官网获取最新版本 https://ofbiz.apache.org/download.html 发现新版本对 .\framework\base\src\main\java\org\ap

fofa爬虫 + 源码泄露PoC之梦幻联动(有福利)

写在前面 相信大家一定对源码泄露并不陌生,这里也不赘述这个漏洞的原理和危害了,网上一搜也都有好多好多,看都看不完~~~ 那今天这里我们讲啥呢?那就直入主题吧~今天这里我就贴出我自己参考的加上自己写的fofa爬虫 + 源码泄露PoC之梦幻联动

PHP的无参数RCE

PHP无参数RCE 因为先前只是参照大佬的payload解题,从未自己本地复现过,索性借复习的机会,在本地搭建并尝试。 题目: GXYCTF2019—禁止套娃 [极客大挑战 2020]Roamphp4-Rceme 限制条件: /[^\W]+

记某CMS漏洞getshell

记极致CMS漏洞getshell 今天下午比较空闲,就去搜索一些cms,突然对极致CMS感兴趣,而网上已经有一些文章对它进行分析利用,sql注入,xss,后台修改上传后缀名前台getshell等等。 于是就引起了我的兴趣想去测试一下。 信息

CVE-2016-0165 Win32k漏洞分析笔记

CVE-2016-0165 是一个典型的整数上溢漏洞,由于在 win32k!RGNMEMOBJ::vCreate 函数中分配内核池内存块前没有对计算的内存块大小参数进行溢出校验,导致函数有分配到远小于所期望大小的内存块的可能性。而函数本身并