RSS Feed
更好更安全的互联网

Flash+Upload Csrf 攻击技术

2014-06-03

文/superhei@知道创宇  2012/8/9

Csrf的攻防技术都是比较成熟了的,如我在2008年写的文章《Bypass Preventing CSRF》http://www.xfocus.net/articles/200801/964.html ,目前对于国内的很多应用程序及SNS网站对于防御csrf多半使用的是token+Referer组合防御,然而对于flash而言在bypass这样的防御有着先天的优势。

一、Flash的调用及域

1、html调用flash,flash可以改后缀名。
2、flash可以单独访问,但是其效果类似与html调用同域的flash,但只这个后缀必须是swf。
3、flash发动请求时,是根据flash的域来判断的,而不是html来判断:
a、flash请求同域资源时,直接忽视crossdomain.xml。
b、flash请求外域资源时,受外域下crossdomain.xml里的策略限制。

二、flash的调用与Referer

html调用外域的flash时,flash发送的请求的Referer是flash的,而不是html的。[不包括多个flash互相load的场景]

三、Csrf攻击场景及方式

1、crossdomain.xml设置导致的csrf。

很多的网站及应用程序[如Discuz!],默认把crossdomain.xml设置如下:

<?xml version="1.0"?>
<cross-domain-policy>
<allow-access-from domain="*" />
</cross-domain-policy>

这样直接通过外域的flash读取被攻击域的内容,报告防御csrf的关键tonken。

2、上传功能导致的csrf。

在上面我们提到了html调用flash的时候,是可以修改后缀的。所以我们可以提供把flash后缀改为图片的后缀如gif来上传到被攻击域[另外这里一点php里的getimagesize()是支持flash文件的http://cn2.php.net/manual/zh/function.getimagesize.php],然后根据“flash发动请求时,是根据flash的域来判断的,而不是html来判断”因为已经把flash后缀为gif上传到被攻击域,那么就是说目前完全符合“a、flash请求同域资源时,直接忽视crossdomain.xml”的情况。

另外根据“flash发送的请求的Referer是flash的,而不是html的”,所以在这种场景下,token+Referer判断的方式,基本可以无视了。

四、实际应用

参考《Discuz! Flash Csrf Vulnerability》

其实通过上传功能来实现flash csrf攻击案例,早在2008年80vul开展的项目SODB里就有http://www.80vul.com/dzvul/sodb/03/sodb-2008-03.txt,只所以还要有今天的文章,主要是对一些细节强调不够,导致很多人的理解偏差,如在sodb-2008-03里我对上传文件的利用只是为了简单的绕过Referer判断来完成的,而忽视了“flash请求同域资源时,直接忽视crossdomain.xml”的请求,这个对于防御的意义还是很大的,因为你即使删除了crossdomain.xml文件,也不能完全防御flash csrf攻击。

五、防御方案

这里只针对上传功能场景下的攻击防御。

1、《代码与数据分离是安全设计的重要原则》by 刺
也就是严格把上传文件存放的域与web代码域分离,这个比较适合大企业及应用的部署。
2、加强对上传文件的判断,比如通过文件头来判断上传是不是flash文件,来禁止上传flash文件。
3、加强Referer的处理,因为flash发起的请求的Referer是flash文件的,也就是说你把flash改为gif文件通过html调用,发起的请求了Referer是这个已经改为gif的flash的url如:

http://127.0.0.1/Discuz_X2.5_SC_UTF8/upload/data/attachment/forum/201208/06/1004333ntvhrv8vvy8lrc4.gif

POST http://127.0.0.1/Discuz_X2.5_SC_UTF8/upload/admin.php?action=members&operation=add HTTP/1.1
Host: 127.0.0.1
....
Referer: http://127.0.0.1/Discuz_X2.5_SC_UTF8/upload/data/attachment/forum/201208/06/1004333ntvhrv8vvy8lrc4.gif
....

那么我通过识别Referer里这些类似的不常见的文件类型来防御。

作者:niubl | Categories:技术分享 | Tags:

3条评论

  1. h4ckme说道:

    Flash+Reflect Csrf

  2. 小清妈网赚博客说道:

    不寝听金钥,

    因风想玉珂。

  3. 黑子说道:

    关于病毒攻防值得一看的【→挑战书→】

    wxString *seeMe() {

    wxString data[5];

    data[0]=”A”;

    data[1]=”B”;

    data[2]=”C”;

    data[3]=”D”;

    data[4]=”E”;

    return data;

    };

    51 C:testtest.h

    [Warning] address of local variable data' returned

    130 C:testtest.h

    ambiguous overload for wxString& = wxString*’ operator

    How to do? Thank you.

    Happy New Year to Everyone~ 🙂

    Meow~

    挑战书:

    下面我介绍下规则和自我的成分介绍下:

    一,我可以运行你制定的链接或者应用以及压缩包或者一些比较有质量的包,例如白板 EXE 类的就不要玩了那个太老了,容易伤硬盘。

    二,当然远控我也不是白远控只要能成功控制我电脑。“30分钟”以上者我工资不多每月就5000块 那么一月工资全部送你,我知道大神应该不缺这点钱,这年头土豪或智人有比较多但是我是穷人也就只能拿 一月工资当回报 已经对自身而言莫大给力了,不过我觉得目前世界上还没有这样的神人。哪怕你喷我吹牛逼。都没关系。最好你拿出实力来干 我是最实际的我这人皮子溅。

    三:格纹放心我的电脑 任然是XP系统 自己的电脑上操作,没有任何虚拟机或者沙箱 以及杀毒。全手工,要是在受控期间发现我作弊或者不是我说的这样,那我也算输,放心我这人赌讲的是品,输了我也就公开信息认错,另外你的远控过杀什么的我都会保密因为我跟任何安全公司和网络没关系,所以不要担心我会成为你的汉奸或者嫡系,其目的就是想知道我其实是很垃圾的,希望有高手能让我知道我很垃圾,要不我每天太自信了。我感觉人总那么自信会死的很惨,所以在此希望 高手能够踊跃来干我。来者不拒,不过加我好友请直接进入主题 不要来加我打口水仗 说我装B 或者 XX事情 或者那个什么你能搞定类的 话。该类我直接无视所以请不是主题就不要加。我的联系方式 QQ1440580 黑子 哦我这黑子不是 管家或者那个什么LIUN白#黑子。我这网名有14年了 是以前我家狗的名字。所以不能跟那些黑子大神并论。

    =======

    顺便说下:近期3-6月间网络的个人看法和观点。注意哦只是个人看法言论自由但是并不是谣言也许正确中并错误者所以希望大大们的 评论以及指点我的错误。

    —————

    首先我觉得微软WINDOWS 8 升级是微软一大败笔,为什么这么说呢因为微软储心积虑的连同几大主要网络大大例如谷歌 在没出 WIN 8之前 也就是谷歌出浏览器那个还带XSS什么的奶酪的什么XXX的时候开始 我想谷歌跟微软达成了协议,微软说啊,谷歌同学为了更大的扩大市场提高我个人的资本我们打算升级一下计算机系统,因为XP 已经搞不到银子了,然后事成后中国或者世界用户都用了WIN8 到时系统内核老子微软的,给你谷歌弄个高点的明份。谷歌想了想哦确实微软合作实乃荣幸。微软主端技术是什么,就是软件精心谋划了,OEM 谷歌通过 通用的 端口提供便利,然后通过各种所谓的绿色链接 以黑客身份出现然后以收取和采集个人信息为由,然后把准备好的带远控和分布式感染的链接给了一部分网络活跃分子,然后你们这些活跃分子就给我扩散吧先冲内网,网吧 酒店搞起,然后在利用可以利用的 例如QQ QQ群 微信用户多的软件上获取文章,然后首先要做到的是让更多的用户电脑被感染,IE 不能及时更新 下载出来的东西也不是官方的最新版本,防火墙的限制利用杀毒软件一些功能 限制一些更新 反正各种利用吧。一旦各种用户觉得哎呀妈呀电脑怎么么老是不是网速慢,CPU高 或者 软件下载的都不能及时更新 要么就是电脑被锁,或者各种XP问题,总之让人 害怕,然后特么的看你们用不用老子的WIN 8 不过用了正版WEI 8 前⑦问题没有都很正常,不过由于微软的 WEB 就是所谓的 IE 功底不够扎实,背反咬了,估计后期出的远程执行漏洞确实是真实的出了,不过貌似WIN 8 核心貌似跟 XP一样。所以IE上搞WIN 8 来的更畅快。由于各种逆向WEB 攻击 不是微软 谷歌没人才 只是人才都是正统的程序员,没有邪门高人在吧,所以谷歌广告因此也遭到xx地区屏蔽,其实我觉得解决问题的方法很简单,就是把你那些个端口改改不要让人知道 ,不要总觉得8888很吉利中国人喜欢,那只是有钱人喜欢,不是所有人都能享受的起8888.所以端口实在实用些。微软的败笔也不想想到底是什么成就了微软的今天,是用户。即使要宰肉我觉得继续在XP的基础上升级然后出一些需要的人群 需要的应用 愿意更新就更新呗花钱最好不要强制来,因为世界高人多,总有打包不平的,XP 系统 也没啥毛病 自己4月 8号后 还承诺可以保护政府 系统更新问题,这说明你们完全有能力来继续维护好XP这个系统,为啥要搞点新花样放弃用户所熟悉的热爱的老版本呢。这样做给人的感觉就是微软太不靠谱,话说资本主义,不过我觉得果断不会做生意,资本主义按道理说应该懂得买卖的一个“信赖”所以“依赖”都不信赖你了怎么依赖,就随他去呗。很多人觉得特么的 微软更新好啊,钱来了,面临的是系统所谓的忽悠式升级 电脑的更换 这一大笔钱 XX人口确实多,不过我觉得中国不会那么傻逼把钱就给你送去吧,所以败笔考虑的不周全,希望下回弄个完善的计划,好好演一场,不要老让盼望和协助你的粉丝失望,谷歌固好不过我觉得做好自己按照自己的路线走下去,我相信没有什么能够超越你们,在一个巅峰千万不能合作,合作的目的也就有所图,当真你看不清楚这个图的时候说明这个目的不适合自己。

    =========

    以上是挑战书 和 个人 特么的一点 个人观点,崇尚言论自由 希望看后 当本故事纯属虚构,如有雷同 属于凑合。 #ifndef __BASE_H

    #define __BASE_H

    #include

    #ifndef WX_PRECOMP

    #include

    #endif

    #include

    class MainApp: public wxApp

    {

    public:

    virtual bool OnInit();

    };

    WX_DECLARE_OBJARRAY(wxString, InnerArray);

    WX_DECLARE_OBJARRAY(InnerArray, OuterArray);

    #endif //__BASE_H

    ——CPP file——-

    #include

    #include “base.h”

    IMPLEMENT_APP(MainApp)

    WX_DEFINE_OBJARRAY(InnerArray);

    WX_DEFINE_OBJARRAY(OuterArray);

    bool MainApp::OnInit()

    {

    InnerArray inner;

    inner.Add(“Hello”);

    inner.Add(“World”);

    OuterArray outer;

    outer.Add(inner);

    inner.Clear();

    inner.Add(“Goodbye”);

    inner.Add(“, I’m leaving now…”);

    outer.Add(inner);

    wxMessageBox(outer[0][0] + ” ” + outer[0][1]);

    wxMessageBox(outer[1][0] + ” ” + outer[1][1]);

    return FALSE;

    }

    Here’a another snippet that might be usefull

    #include

    #include

    using namespace std;

    typedef vector< vector > Int;

    int** allocfill();

    Int test();

    int main()

    {

    int** ar = allocfill();

    for(int j=0; j < 5; j++)

    { cout << endl;

    for(int i=0; i < 5; i++)

    cout << ar[j][i] << "t";

    }

    cout << endl;

    Int vec = test();

    for(int i=0; i < 5; i++)

    { cout << endl;

    for(int j=0; j<5;j++)

    cout << vec[i][j] << "t";

    }

    system("pause");

    return 0;

    }

    Int test()

    {

    vector i(10,0);

    Int ar(10,i);

    for(int i=0; i < 5; i++)

    for(int j=0; j<5;j++)

    ar[i][j]=i+j;

    return ar;

    }

    int** allocfill()

    {

    int** array = new int*[5];

    for(int i=0; i < 5; i++)

    array[i] = new int[5];

    for(int j=0; j < 5; j++)

    for(int i=0; i < 5; i++)

    array[j][i] = i+j;

    return array;

    }

发表评论