我们都知道Flash的ExternalInterface.call()可以调用外部的JS函数,一般如果在flash代码中看到这个函数,而且里面的参数可以是用户可以控制的话,就会有XSS的风险,flash安全扫描工具的扫描原理也是如此,碰到这个函数还有geturl,如果里面的参数来自外部的话就认为是漏洞。

一般情况下我们ExternalInterface.call(param1,param2),我们只要在param1中设为eval,param2中附加我们的js语句就可以了,param2为param1的参数,真正执行的时候类似于这样:

param1 = eval;

param2 = alert(/XSS/);

那么结果就是eval(“alert(/XSS/)”)

悲剧的是如果param1我们不可以控制,我们只能控制param2,那还有办法XSS吗。就像到sql注入一样,这里可以联想到注入”)来闭合前面的引号后再次插入JS来X,但是这里adobe做了jsencode,我们插入的”会变成\”,所以我们又X不了了

喜剧的是老外在测试的过程中发现了一个BUG:

http://s2.kkdaili.com/0b0d97edc58e6b5.php?u=T2k4dmJHTmhiWFIxWmk1aWJHOW5jM0J2ZEM1amIyMHZNakF4TVM4d015OXZkR2hsY2kxeVpXRnpiMjR0ZEc4dFltVjNZWEpsTFc5bUxtaDBiV3c9&b=29&f=norefer

当插入\”这样的符号时,flash会在经过jsencode后既然只赚了前面的\,所以最后变成了\\”,这样我们的“又能闭合了,悲了剧啊,这种漏洞也有,想测试的搞80vul吧,黑锅正愁没流量呢

 ‍

当然,这是针对param1不可控的情况下的办法,反过来,如果只有param1可控,param2不可能控的话,我们可以用function方法来执行,如下:

http://www.80vul.com/xss.swf?a=function(){alert(/xss/);alert(1)}
同理的漏洞还有:http://www.wooyun.org/bugs/wooyun-2010-07265

文/ben

源链接

Hacking more

...